1. 程式人生 > >淺談彙編(2)——堆疊指令

淺談彙編(2)——堆疊指令

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

8086CPU提供入棧和出棧指令: (最基本的)

PUSH(入棧) push ax:將暫存器ax中的資料送入棧中;
POP (出棧) pop ax :從棧頂取出資料送入ax。

8086CPU的入棧和出棧操作都是以(兩個位元組)為單位進行的。

8086CPU中,有兩個暫存器:

段暫存器SS  存放棧頂的段地址
暫存器SP  存放棧頂的偏移地址

任意時刻,SS:SP指向棧頂元素。

問題:如果我們將10000H~1000FH 這段空間當作棧,初始狀態棧是空的,此時,SS=1000H,SP=?

答:SP = 0010H

我們將10000H~1000FH 這段空間當作棧段,SS=1000H,棧空間大小為16 位元組 ,棧最底部的字單元地址為1000:000E。
 任意時刻,SS:SP指向棧頂,當棧中只有一個元素的時候,SS = 1000H,SP=000EH

push ax(入棧)
(1)SP=SP–2;
(2)將ax中的內容送入SS:SP指向的記憶體單元處,SS:SP此時指向新棧頂。

pop ax
(1)將SS:SP指向的記憶體單元處的資料送入ax中;
(2)SP = SP+2,SS:SP指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。

                         push 指令的執行過程

                            pop指令的執行過程

這裡寫圖片描述
注意:
出棧後,SS:SP指向新的棧頂1000EH,pop操作前的棧頂元素,1000CH 處的2266H 依然存在 ,但是,它已不在棧中
當再次執行push等入棧指令後,SS:SP移至1000CH,並在裡面寫入新的資料,它將被覆蓋

我們要十分清楚的是,push和pop指令同mov指令不同,CPU執行mov指令只需一步操作,就是傳送,而執行push、pop指令卻需要兩步操作
執行push時:
先改變SP,後向SS:SP處傳送。
執行pop時:
先讀取SS:SP處的資料,後改變SP。