現今的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指令卻需要兩步操作。
先改變SP,後向SS:SP處傳送。
執行pop時:
先讀取SS:SP處的資料,後改變SP。```