淺談彙編(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。