- 內(nèi)存中的字存儲
- 字單元
存放一個字型數(shù)據(jù)(16位)的內(nèi)存單元匪凉,由兩個地址梁旭的內(nèi)存單元組成蔑赘。高地址存高位字節(jié)式矫,低地址存放地位字節(jié)乡摹。 - N地址字單元
起始地址為N的字單元。比如一個字單元由2采转,3兩個內(nèi)存單元組成趟卸,則這個字單元的起始地址為2,我們可以說這是2地址的字單元氏义。 -
Example:
對于圖中:
(1)0地址單元中存放的字節(jié)型數(shù)據(jù)是 20H
(2)0地址字單元中存放的字型數(shù)據(jù) 4E20H
(3)2地址單元中存放的字節(jié)型數(shù)據(jù)是 12H
(4)2地址字單元中存放的字型數(shù)據(jù) 0012H
(5)1地址字單元中存放的字型數(shù)據(jù) 124EH
- DS 和 [address]
- DS 8086CPU中的段寄存器,用來存儲需要訪問數(shù)據(jù)的地址段
- [address] 表示一個內(nèi)存單元图云,其中address表示內(nèi)存單元的偏移地址
- 內(nèi)存單元的地址 = SA(ds中的數(shù)據(jù)為內(nèi)存單元的段地址) * 16 + EA([address]偏移地址)
- 8086CPU不支持將數(shù)據(jù)直接送入段寄存器的操作惯悠。所以只能用寄存器進行中轉(zhuǎn)。
- Example 1 將10000H(1000:0) 中的數(shù)據(jù)讀到al中
mov bx,1000H
mov ds,bx
mov al,[0]
- Example 2 將 al 中的數(shù)據(jù)存入內(nèi)存單元10000H(1000:0)中
mov bx,1000H
mov ds,bx
mov [0],al
字的傳送
8086CPU是16位結(jié)構(gòu)竣况,有16根數(shù)據(jù)線克婶,可以一次傳送16位的數(shù)據(jù)(一個字),所以只要在mov指令中給出16位的寄存器就可以進行16位數(shù)據(jù)的傳送了丹泉。mov add sub指令
mov 寄存器情萤,數(shù)據(jù) // mov ax,8
mov 寄存器,寄存器 // mov ax,bx
mov 寄存器摹恨,內(nèi)存單元 // mov ax,[0]
mov 內(nèi)存單元筋岛,寄存器 // mov [0],ax
mov 段寄存器,寄存器 // mov ds,ax
mov 寄存器, 段寄存器 // mov ax, ds
mov 內(nèi)存單元, 段寄存器 // mov [0], ds
mov 段寄存器, 內(nèi)存單元 // mov ds, [0]
add 寄存器晒哄,數(shù)據(jù) // add ax,8
add 寄存器睁宰,寄存器 // add ax,bx
add 寄存器,內(nèi)存單元 // add ax,[0]
add 內(nèi)存單元寝凌,寄存器 // add [0],ax
sub 寄存器柒傻,數(shù)據(jù) // sub ax,8
sub 寄存器,寄存器 // sub ax,bx
sub 寄存器较木,內(nèi)存單元 // sub ax,[0]
sub 內(nèi)存單元红符,寄存器 // sub [0],ax
- 數(shù)據(jù)段
編程時的一種安排,將一組長度為N(N<=64KB)伐债,地址連續(xù)预侯,起始地址為16倍數(shù)的內(nèi)存單元當作專門存儲數(shù)據(jù)的內(nèi)存空間。
- Example 將123B0H ~ 123B9H 的內(nèi)存單元定義為數(shù)據(jù)段泳赋。
(1)累加這個數(shù)據(jù)段中的前3個單元中的數(shù)據(jù)
mov ax,123BH
mov ds,ax
mov al,0
add al,[0]
add al,[1]
add al,[2]
(2)累加這個數(shù)據(jù)段中的前3個字型數(shù)據(jù)
mov ax,123BH
mov ds,ax
mov ax,0
add ax,[0]
add ax,[2]
add ax,[4]
小結(jié)
(1)字在內(nèi)存中存儲時雌桑,要用兩個地址連續(xù)的內(nèi)存單元存放,字的地位放在低地址單元祖今,高位放在高地址單元校坑。
(2)用 mov 訪問內(nèi)存單元拣技,可以再mov中只給出偏移地址,段地址默認在段寄存器DS中耍目。
(3)[address]表示一個偏移地址為 address的內(nèi)存單元
(4)在內(nèi)存和寄存器之間傳送字型數(shù)據(jù)時膏斤,高地址單元和高8位寄存器,低地址單元和低8位寄存器相對應(yīng)
(5)mov邪驮,add莫辨,sub 是具有兩個操作對象的指令,jmp是具有一個操作對象的指令練習
(1)在Debug中毅访, 用 "d 0:0 1f" 查看內(nèi)存沮榜,結(jié)果如下:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序執(zhí)行前, AX = 0喻粹, BX = 0蟆融, 寫出相關(guān)寄存器中的值
mov ax 1
mov ds ax // ds = 1
mov ax,[0000] // AX = 2662H
mov bx,[0001] // BX = E626H
mov ax,bx // AX = E626H
mov ax,[0000] // AX = 2662H
mov bx,[0002] // BX = D6E6H
add ax,bx // AX = FD48H
add ax,[0004] // AX = 2C14H
mov ax,0 // AX = 0H
mov al,[0002] // AX = 00E6H
mov bx,0 // BX = 0H
mov bl,[000C] // BX = 0026H
add al,bl // AX = 000CH
執(zhí)行指令如下:
mov ax,6622H
jmp 0ff0:0100
mov ax,2000H
mov ds,ax
mov ax,[0008]
mov ax,[0002]
- 棧
一種數(shù)據(jù)結(jié)構(gòu)。操作規(guī)則 LIFO(Last In First Out 后進先出)
7.CPU提供的棧機制
PUSH ax // 表示將寄存器ax中的數(shù)據(jù)送入棧中
POP ax //表示取出棧頂數(shù)據(jù)存入寄存器ax中
- 8086CPU入棧和出棧都是以字為單位進行的守呜。
-
8086CPU中 段寄存器 SS 和寄存器 SP型酥,段地址存放在SS中,偏移地址存放在SP中查乒。任意時刻弥喉,SS:SP 指向棧頂元素, PUSH POP執(zhí)行時玛迄,CPU從中取出棧頂?shù)刂?/p>
-
8086CPU入棧時由境,棧頂從高地址向低地址方向增長。
- 棧頂超界問題
8086CPU只知道棧頂在何處(由SS:SP知識)憔晒,而不知道安排的椩逡蓿空間有多大,所以在編程的時候自己操作拒担,根據(jù)可能用到的最大空間來安排棧的大小嘹屯,執(zhí)行出棧入棧的時候要注意可能導(dǎo)致棧超界問題。
9.PUSH POP指令
push 寄存器 //將一個寄存器中的數(shù)據(jù)入棧
pop 寄存器 //出棧从撼,用一個寄存器中接受出棧的數(shù)據(jù)
push 段寄存器 //將一個段寄存器中的數(shù)據(jù)入棧
pop 段寄存器 //出棧州弟,用一個段寄存器中接受出棧的數(shù)據(jù)
push 內(nèi)存單元 //將一個內(nèi)存單元中的字入棧(注意:戰(zhàn)的操作以字為單位)
pop 內(nèi)存單元 //出棧,用一個內(nèi)存字單元接受出棧的數(shù)據(jù)
- push pop等棧操作指令修改的只是SP低零,也就是說棧頂?shù)淖兓秶畲鬄?0~FFFFH
棧的綜述:
(1)8086CPU提供了棧操作機制婆翔,方案如下:
在SS,SP中存放棧頂?shù)亩蔚刂泛推频刂?提供入棧出棧指令掏婶,它們根據(jù)SS:SP指示的地址啃奴,按照棧的方向訪問內(nèi)存單元
(2)push指令執(zhí)行的操作步驟:1.SP=SP-2; 2.向SS:SP指向的字單元中送入數(shù)據(jù)
(3)pop指令執(zhí)行的操作步驟:1.從SS:SP指向的字單元中讀取數(shù)據(jù);2.SP=SP+2
(4)任意時刻雄妥,SS:SP 指向棧頂元素
(5)8086CPU只記錄棧頂最蕾,椧浪荩空間的大小我們要自己管理
(6)PUSH POP實質(zhì)上是一種內(nèi)存?zhèn)魉椭噶?
- 棧段
- 數(shù)據(jù)段 段地址存放在 DS中,用mov add sub 等訪問內(nèi)存單元指令瘟则,CPU就將我們定義的數(shù)據(jù)段的內(nèi)容當做數(shù)據(jù)來訪問
- 代碼段 段地址存放在 CS中黎炉,將段中的第一條指令的偏移地址放在IP中,這樣CPU就將執(zhí)行我們定義在代碼段中的命令
- 棧段 段地址存放在 SS中醋拧,將棧頂單元的偏移地址放在SP中慷嗜,這樣CPU在需要進行棧操作的時候,比如執(zhí)行push丹壕,pop等指令庆械,就將我們定義的棧段當做棧空間來用菌赖。
- Debug T命令在執(zhí)行修改寄存器SS的指令時干奢,下一條指令也緊接著被執(zhí)行。