函式呼叫堆疊

2021-08-09 21:38:59 字數 1117 閱讀 6352

乙個函式的執行在棧上開闢記憶體。 在函式呼叫時,第乙個進棧的是主函式呼叫語句的下一條可執行語句的位址,然後是函式的各個引數。在大多編譯器中,引數是由右往左入棧的,然後再是函式中的區域性變數。

下面給乙個例項:

int

sum(int a,int b)

int main()

其中,main函式的反彙編指令

其中,mov表示移動記憶體的值;lea表示移位址;word佔2個位元組,dword4個位元組。

其中:0401078 mov dword ptr [epb-4],0ah;

代表把0ah放在[epb-4]位址所表示的位元組的記憶體中。0401078代表的是虛擬位址(空間)。

最後簡單描述一下函式出棧的順序:

①esp回退至ebp,到0x100的位置;

②pop出棧:esp向下移至下一行指令儲存位置,將0x100賦給ebp,ebp指回main函式棧底;

③pop出棧:esp移至a 10;

④add esp,8 :esp += 8,即esp移至原main函式真正的棧頂;

⑤ret = 30;

⑥下一句指令。

函式呼叫堆疊

一 函式呼叫堆疊 認真體會每一行指令位址!include intsum int a,int b mov ebp,esp 讓esp回退到ebp的位置,回退棧幀的過程中,沒有對棧幀中的值進行清0的操作 pop ebp 出棧並把出棧的值賦給ebp int main 下圖為上面示例函式,程式在sum函式中,...

函式呼叫堆疊

一 棧 1 傳統的棧 被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入 棧中的資料彈出,但必須遵守一條規則 先進後出。2 計算機系統中的棧 是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,彈出操作使棧減小。棧通常是向下增長的。3 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...

函式呼叫堆疊

1.函式呼叫堆疊 壓棧 呼叫函式 1.壓入形參變數的位址和值 2.壓入函式呼叫返回後要執行的指令的位址 被呼叫函式 1.壓入呼叫函式的棧底指標,把棧底指標暫存器指向被呼叫函式的棧底 2.開闢被呼叫函式的棧幀大小,並初始化為cc 清棧 被呼叫函式 1.清理被呼叫函式開闢的棧幀大小 2.回退棧底指標到呼...