堆疊是記憶體中的一塊區域,程式一開始執行時,系統會保留一塊記憶體給堆疊使用。等所有
初始化工作完成,ESP就指向堆疊某處,此位址及比此位址高的記憶體存有系統保留的資料,
比這個位址低的記憶體空間都是空的。此為指稱為堆疊頂。
x86 CPU利用PUSH指令把資料存入堆疊,它的語法是
PUSH 來源運算元
來源運算元可以是暫存器、變數、常數
每當PUSH來源運算元時,ESP會先減少,然後再把來源運算元存入ESP所指的位址。至於減少多
少,要看來源運算元長度。如果是WORD就減少2;如果;是DWORD就減少4。而此時堆疊頂就比原
先少2或少4。像這樣把資料存入堆疊使ESP減少稱為把資料推入堆疊。
而讀取堆疊的資料則用x86指令
POP 目的運算元
目的運算元只能是暫存器、變數
當POP目的運算元時,先把ESP所指的堆疊頂資料存入目的運算元,再使ESP增加。增加多少跟
目的運算元的長度有關。這樣的過程稱為彈出資料。
舉例來說,假如有底下三個指令,X、Y、Z都是字組,ESP為106
堆疊位址 低-->高
指令 ESP 100 102 104 106
PUSH X 106 DDD 尚未執行PUSH X
PUSH Y 104 X DDD 尚未執行PUSH Y,而PUSH X已執行完畢
PUSH Z 102 Y X DDD 尚未執行PUSH Z,而PUSH Y已執行完畢
102 Z Y X DDD PUSH Z已執行完畢
假如現在要把上面三個堆疊的資料依序彈出,且存於位址300處
指令 ESP 100 102 104 106....300 302 304 306
POP [300] 100 Z Y X DDD 尚未執行POP [300]
POP [302] 102 Y X DDD Z 尚未執行POP [302],已執行POP [300]
POP [304] 104 X DDD Z Y 尚未執行POP [304],已執行POP [302]
106 DDD Z Y X 已執行完POP [306]
堆疊有一種很特別的性質,最先推入堆疊的資料,卻是最後才能彈出。上面的例子X是最先推入
堆疊,再彈出後卻是在最高位址。由於堆疊有這種特性,很適合把資料做倒敘排列(就是先後順
序顛倒)
回文詩是中文特有的詩體,正讀與倒讀都有意義,例如底下的例子: