CPU中,用16位寄存器來存儲(chǔ)一個(gè)字。高8位存放高位字節(jié),低8位存放低位字節(jié)。在內(nèi)存中存儲(chǔ)時(shí),由于內(nèi)存單元是字節(jié)單元(一個(gè)單元存放一個(gè)字節(jié)),則一個(gè)字要用兩個(gè)地址連續(xù)的內(nèi)存單元來存放,這個(gè)字的低位字節(jié)存放在低地址單元中,高位字節(jié)存放在高地址單元中。
字單元:即存放一個(gè)字型數(shù)據(jù)(16位)的內(nèi)存單元,由兩個(gè)地址連續(xù)的內(nèi)存單元組成。
N地址單元:將起始地址為N的字單元簡稱為N地址字單元。比如一個(gè)字單元由2、3兩個(gè)內(nèi)存單元組成,則這個(gè)字單元的起始地址為2,我們可以說這是2地址字單元。
CPU要讀寫一個(gè)內(nèi)存單元的時(shí)候,必須先給出這個(gè)內(nèi)存單元的地址,在8086PC中,內(nèi)存地址由段地址和偏移地址組成。
8086CPU中有一個(gè)DS寄存器,通常用來存放要訪問數(shù)據(jù)的段地址,比如我們要讀取10000H單元的內(nèi)容,可以用如下的程序段進(jìn)行:
mov bx,1000H
mov ds,bx
mov al,[0]
上面的3條指令將10000H(1000:0)中的數(shù)據(jù)讀到al中。
-
前面使用mov指令,可完成兩種傳送:
- 將數(shù)據(jù)直接送入寄存器中,如:
mov bx,1000H - 將一個(gè)寄存器中的內(nèi)容送入另一個(gè)寄存器,如:
mov ds,bx
- 將數(shù)據(jù)直接送入寄存器中,如:
也可以使用mov指令將一個(gè)內(nèi)存單元中的內(nèi)容送入一個(gè)寄存器中。
“[...]”表示一個(gè)內(nèi)存單元,“[0]”中的0表示內(nèi)存單元的偏移地址,執(zhí)行指令時(shí),8086CPU自動(dòng)取
ds中的數(shù)據(jù)為內(nèi)存單元的段地址。8086CPU不支持將數(shù)據(jù)直接送入段寄存器的操作,如:
mov ds,1000H是錯(cuò)誤的。所以只好用一個(gè)寄存器來進(jìn)行中轉(zhuǎn),即先將1000H送入一個(gè)一般的寄存器,如bx,再將bx中的內(nèi)容送入ds。因?yàn)?086CPU是16位結(jié)構(gòu),有16根數(shù)據(jù)線,所以,可以一次性傳送16位的數(shù)據(jù),也就是說可一次性傳送一個(gè)字。只要在mov指令中給出16位的寄存器就可以進(jìn)行16位數(shù)據(jù)的傳送了。比如:
mov bx,1000H
mov ds,bx
mov ax,[0] ;1000:0處的字型數(shù)據(jù)送入ax
mov [0],cx ;cx中的16位數(shù)據(jù)傳送到1000:0處
P51-P53
push ax表示將寄存器ax中的數(shù)據(jù)送入棧中,pop ax表示從棧頂取出數(shù)據(jù)送入ax。8086CPU的入棧和出棧操作都是以字為單位進(jìn)行的。
8086CPU中,有兩個(gè)寄存器,段寄存器SS和寄存器SP,棧頂?shù)亩蔚刂反娣旁赟S中,偏移地址存放在SP中。
任意時(shí)刻,SS:SP指向棧頂元素
棧頂?shù)奈恢檬窃诟叩刂贰?/p>
-
push ax的執(zhí)行,由以下兩步執(zhí)行:- SP=SP-2,SS:SP指向當(dāng)前棧頂前面單元,以當(dāng)前棧頂前面的單元為新的棧頂。
- 將ax中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂。
-
pop ax的執(zhí)行,由以下兩步執(zhí)行:- 將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax。
- SP=SP+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂。
棧頂超界問題(P61)
push和pop指令的格式可以是如下形式:
push 寄存器
push 段寄存器
push 內(nèi)存單元
棧段(P68)
實(shí)驗(yàn)2(P71)