組合語言程式設計第三章
第三章 暫存器(記憶體訪問)
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 ,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 段暫存器 出棧,用一個段暫存器接收出棧的資料