匯編語言程序設計第三章
第三章 寄存器(內存訪問)
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 段寄存器 出棧,用一個段寄存器接收出棧的數據
匯編語言程序設計第三章