1. 程式人生 > >匯編語言程序設計第三章

匯編語言程序設計第三章

處的 由於 通用 指令 用途 結構 ESS 字節 棧空間

第三章 寄存器(內存訪問)

1 內存中字的存儲

1個字=2個字節,如從0開始存放20000(4E20H),20、4E分別表示1個字節,內存中字的存儲如下圖所示: 技術分享圖片 任何兩個地址連續的內存單元(0、1、2......),N號單元和N+1號單元,可以看成兩個內存單元。比如說上圖中的0內存單元(字節單元,存放的是字節型數據,就是20H(十進制的32);0地址字單元,存放字型數據,就是4E20H。 任何兩個地址連續的內存單元,N號單元和N+1號單元,也可以看成一個地址為N的字單元中的高位字節單元和低位字節單元。比如上圖中1字單元中,所代表的字是124EH,高位字節單元是2內存單元——12H
低位字節單元是1內存單元——4EH 2 DS和[address] CPU讀取內存單元時,必須先讀取到這個內存單元的地址。8086CPU中,內存地址是由段地址和偏移地址組成,8086CPU中有一個DS寄存器,用來存放要訪問的數據的段地址。 例子:讀取10000H單元的內容,可以用這樣的一段代碼來實現: mov bx,1000H mov ds,bx mov al,[0] 使用mov指令,可以完成兩種傳送:將數據直接送入寄存器;將一個寄存器中的內容送入另一個寄存器。mov指令還能夠將一個內存單元中的內容送入一個寄存器。那麽mov al,[0] ,就是將內存單元中,偏移地址為0的內存單元中的內容放入到ax通用寄存器中的低八位al(8位)中。一個段地址對應一個偏移地址,上面的代碼中,段地址為1000,對應的偏移地址為0。 3 字的傳送 8086CPU是16位結構,有16根數據線,所以一次性可以傳送16位的數據,也就是一次性傳送1個字(1個字=2個字節=16位)。 如下代碼: mov bx,1000H mov ds,bx mov ax,[0] ---->這裏是將1000:0處的字型數據(1個字,16位)送入到ax(16位)當中 mov [0],cx ---->這裏是將cx(16位)中的數據放入到1000:0(16位)內存單元中。 4 mov,add,sub指令 mov指令的幾種形式 mov 寄存器,數據 如mov ax,2C3B mov 寄存器,寄存器 如mov bx,ax mov 寄存器,內存單元 如mov ax,[0] mov 內存單元,寄存器 如mov [0],bx mov 段寄存器,寄存器 如mov ds,ax

add 和 sub 指令同 mov 一樣,都有兩個操作對象。

add 寄存器, 數據 如:add ax, 8

add 寄存器, 寄存器 如:add bx, ax

add 寄存器, 內存單元 如:add ax, [0]

add 內存單元, 寄存器 如:add [0], ax

sub 寄存器, 數據 如:sub ax, 8

sub 寄存器, 寄存器 如:sub bx, ax

sub 寄存器, 內存單元 如:sub ax, [0]

sub 內存單元, 寄存器 如:sub [0], ax

5 數據

8086PC機,我們可以根據需要將一組內存單元定義為一個段。我們可以將一組長度為N(N<=64K)、地址連續、起始地址為16的倍數的內存單元,當作專門存儲數據的內存空間,從而定義了一個數據段。

如何訪問數據段中的數據呢?將一段內存當作數據段,是我們在編程時的一種安排,我們可以在具體操作的時候,用 ds 存放數據段的段地址,再根據需要,用相關指令訪問數據段中的具體單元。

6 棧

棧頂的元素總是最後入棧,需要出棧時,又最先從棧中取出。

7 CPU提供的棧機制

現今的CPU中都有棧的設計。8086CPU提供相關的指令來以棧的方式訪問內存空間。這意味著,我們在基於8086CPU編程的時候,可以將一段內存當作棧來使用。

段寄存器SS 存放棧頂的段地址,寄存器SP 存放棧頂的偏移地址。任意時刻,SS:SP 指向棧頂元素。

8 棧頂超界的問題

棧頂越界是危險的:因為我們既然將一段空間安排為棧,那麽在棧空間之外的空間裏很可能存放了具有其它用途的數據、代碼等,這些數據、代碼可能是我們自己的程序中的,也可能是別的程序中的。但是由於我們在入棧出棧時的不小心,而將這些數據、代碼意外地改寫,將會引發一連串的錯誤。

我們在編程的時候要自己操心棧頂越界問題,要根據可能用到的最大棧空間來安排棧的大小,防止入棧的數據太多而導致的越界。執行出棧操作的時候也要註意,以防止棧空的時候繼續出棧而導致的越界。

9 push,pop指令

push和pop指令是可以在寄存器和內存之間傳送數據的。

push和pop指令的格式(1)

push 寄存器 將一個寄存器中的數據入棧

pop 寄存器 出棧,用一個寄存器接收出棧的數據

push和pop指令的格式(2)

push 段寄存器 將一個段寄存器中的數據入棧

pop 段寄存器 出棧,用一個段寄存器接收出棧的數據

匯編語言程序設計第三章