棧和函式呼叫

2022-07-19 01:39:10 字數 962 閱讀 3774

pushl   %ebp

movl %esp , %ebp

+|  棧底方向         | 高位位址

| ...    |

| ...    |

| 引數3   |

| 引數2   |

| 引數1   |

| 返回位址 |

| 上一層[ebp] | <-------- [ebp]

| 區域性變數 | 低位位址

函式呼叫棧結構

這兩條彙編指令的含義是:首先將ebp暫存器入棧,然後將棧頂指標esp賦值給ebp。「mov ebp esp」這條指令表面上看是用esp覆蓋ebp原來的值,其實不然。因為給ebp賦值之前,原ebp值已經被壓棧(位於棧頂),而新的ebp又恰恰指向棧 頂。此時ebp暫存器就已經處於乙個非常重要的地位,該暫存器中儲存著棧中的乙個位址(原ebp入棧後的棧頂),從該位址為基準,向上(棧底方向)能獲取 返回位址、引數值,向下(棧頂方向)能獲取函式區域性變數值,而該位址處又儲存著上一層函式呼叫時的ebp值。

一般而言,ss:[ebp+4]處為返回位址,ss:[ebp+8]處為第乙個引數值(最後乙個入棧的引數值,此處假設其占用4位元組記憶體),ss: [ebp-4]處為第乙個區域性變數,ss:[ebp]處為上一層ebp值。由於ebp中的位址處總是「上一層函式呼叫時的ebp值」,而在每一層函式呼叫 中,都能通過當時的ebp值「向上(棧底方向)」能獲取返回位址、引數值,「向下(棧頂方向)」能獲取函式區域性變數值。如此形成遞迴,直至到達棧底。這就 是函式呼叫棧。

那麼最開始進入main函式之前,ebp的初始值是多少呢?

關於ebp和esp暫存器,參考這篇部落格。

關於棧的詳細介紹,參考《understanding the stack 》。

》。

其他 棧 和 函式呼叫

程式 演算法 資料結構 演算法 記憶體正文區 text 的執行邏輯 資料結構 堆 棧 其他資料儲存區 棧是程序虛擬記憶體模型中的一塊連續記憶體區域,不同的作業系統對於虛擬記憶體的劃分策略存在一定的差異,但是不論是什麼作業系統都會流出一大塊記憶體區用作棧空間 大多數情況下是堆和棧共享 x86架構下,棧...

函式呼叫棧

當程式進行函式呼叫的時候,系統會用到下面三種暫存器 3.ebp ebp暫存器裡儲存的是棧基址,是在函式呼叫之前,由esp賦值給ebp的。棧底方向,高位位址 call fun arg1,arg2,arg3 修改esp,棧向下增長,引數入棧,返回位址入棧 arg3 arg2 arg1 返回位址 上一層e...

棧 函式呼叫

編譯以下程式,分析此程式以得出棧的精髓 1 主函式被上層呼叫者呼叫後,執行push ebp,esp 4 因為ebp入棧 ebp值沒有改變,值得注意的是剛開始分配站的時候,第乙個入棧的是return,主函式的返回位址,然後是ebp 2 然後是mov ebp,esp,將esp的值賦給ebp,該語句未執行...