1. 程式人生 > >組合語言程式設計第三章

組合語言程式設計第三章

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

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 段暫存器             出棧,用一個段暫存器接收出棧的資料