天天看點

淺談彙編(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 指令的執行過程
           
淺談彙編(2)——堆棧指令
pop指令的執行過程
           
淺談彙編(2)——堆棧指令

注意:

出棧後,SS:SP指向新的棧頂1000EH,pop操作前的棧頂元素,1000CH 處的2266H 依然存在 ,但是,它已不在棧中。

當再次執行push等入棧指令後,SS:SP移至1000CH,并在裡面寫入新的資料,它将被覆寫

我們要十厘清楚的是,push和pop指令同mov指令不同,CPU執行mov指令隻需一步操作,就是傳送,而執行push、pop指令卻需要兩步操作。

先改變SP,後向SS:SP處傳送。
執行pop時:
先讀取SS:SP處的資料,後改變SP。```





           

繼續閱讀