彙編 第三章 暫存器(記憶體訪問)

2022-08-22 19:24:11 字數 2298 閱讀 6705

之前第二章講的重點是理解8086位址的組成方式,相關的暫存器以及6個命令的使用:

r,d,a,e,t,u

第三章繼續從訪問記憶體的角度學習暫存器。

3.1 記憶體中字的儲存

乙個字由兩個位元組組成,而乙個位元組佔乙個儲存單元,所以用16位暫存器來儲存乙個字

具體儲存採用小端法,乙個字單元由連續的兩個記憶體單元組成

比如4e20  高位元組存在高位址單元;4e存在1號單元 ;低位元組存在底位址單元:20存在0號單元

注意的一點是字單元單元的 區別:

我們可以說0位址字單元中存放字型資料時4e20h,但0單元中時20h,兩者不同。

3.2 ds和【address】

8086有乙個ds暫存器,通常用來存放要訪問的資料的段位址

比如讀取10000h單元的內容:

mov bx,1000h

mov ds,bx

mov al,[0]

mov al ,[0]所使用的段位址來自ds,但ds不能直接寫入資料(8086不支援將資料直接送入段暫存器的操作)

所以借助其他的一般性暫存器

3.3.字的傳送

8086cpu是16位結構,有16根資料線,可以一次性傳送乙個字

如:mov ax,[0];

mov [0],cx;

不過傳送字後要注意字的儲存方式,小端法,佔兩個記憶體單元

3.4.mov,add,sub指令

操作物件:暫存器,常數,記憶體單元,段暫存器

mov:不支援記憶體單元與記憶體單元,段暫存器與常數,段暫存器與段暫存器

注意點:  (1 )兩個運算元長度要一致。

(3)不能使用mov指令修改cs和ip的值    r cs ;  r ip

add:不支援對段暫存器的操作,運算元不能同時是記憶體單元

sub:兩個記憶體單元不能直接使用sub指令相減,sub指令的運算元不能是段暫存器

3.5.資料段

8086pc機在程式設計是可根據需要,將一組記憶體單元定義為乙個段,可以將一組長度為n(n<=64kb),位址連續,

起始位址為16的倍數的記憶體單元當做專門儲存資料的記憶體空間,從而定義乙個資料段。

3.6./3.7 棧及cpu提供的棧機制

是乙個邏輯上的概念,資料儲存的方式,可以將一段記憶體空間當做棧來使用,特性後進先出

8086中棧以字為單位。

操作:push(入棧),棧頂上移,棧頂-2 

pop(出棧),棧頂下移,棧頂+2

棧為空時,棧頂指向棧底+2

兩個問題:1.我們把一段記憶體當成棧來用,cpu如何知道?

2.push,pop需要知道棧頂單元位置,如何知道?

1.與棧相關的暫存器ss和sp

ss:棧段段暫存器,存放棧段的段位址

sp:棧指標暫存器,存放棧頂的偏移位址

2.push ,pop

操作物件:暫存器,記憶體單元,段暫存器

修改的只是sp,棧頂最大變化範圍1位0~ffffh

push,pop實質上是記憶體傳送指令

示例:push ax   將暫存器值入棧

pop ax     用暫存器儲存出棧資料

有關記憶體單元,依舊預設段位址在ds中

均以字為單元,操作物件不能是常數

3.8.棧頂超界的問題

要自己注意

3.9。棧的應用

可以恢復資料以及交換資料

對於8086pc機我們可以將長度為n(n<=64kb)的一組位址連續,起始位址為16的倍數的記憶體單元,當做棧空間使用,

從而定義乙個棧段,並將ss:ip指向棧段

其實就和指令和資料的區分一樣,值得注意的是超界問題。

乙個棧段棧頂範圍為0~ffffh,棧空時sp=0到棧滿時sp=0,再次壓棧的話會覆蓋掉原來的資料

所以乙個棧段最大容量為64kb

一段記憶體,可以既是**的儲存空間,又是資料的儲存空間,還可以是棧空間,也可以什麼也不是,

關鍵看cpu暫存器的設定,cs,ip,ds,ss,sp的指向

第三章 暫存器(記憶體訪問)

cpu中,用16位暫存器來儲存乙個字,高8位存放高位位元組,低8位存放低位位元組。例如 資料20000 4e20 h 在記憶體中存放的方式為 低 20 h 棧頂 高 4e h 棧底 cpu要讀寫乙個記憶體的時候,必須先給出這個記憶體單元的位址,同樣是由段位址和偏移位址組成。這個是靠ds暫存器,它用來...

第三章 暫存器(記憶體訪問)

3.1 記憶體中字的儲存 cpu中用16位暫存器儲存乙個字,高八位放高位位元組,第八位放低位位元組,我們的儲存有兩種方式,一種是大端法,一種是小端法 3.2 ds和 address cpu要讀寫記憶體單元的時候,必須先給出這個記憶體單元的位址,記憶體單元的位址由段位址和偏移位址組成 ds暫存器是用來...

《組合語言》第三章 暫存器(記憶體訪問)

在記憶體單元中,位址高的是高位,位址低的是低位。我們在讀取記憶體時喜歡從0開始讀,但我們在讀取數字的時候一定不喜歡從最低位開始讀,所以如果這個分不清,那麼是這個是相當 痛苦的 所以,乙個資料如果確定是乙個字,那麼直接從高位開始讀取,這樣更好理解。如果直接將記憶體單元送入暫存器中,那麼預設送入乙個字,...