函式呼叫堆疊

2021-08-09 20:22:07 字數 1171 閱讀 1480

一、棧

1、傳統的棧:被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入

棧中的資料彈出,但必須遵守一條規則:先進後出。

2、計算機系統中的棧:是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,

彈出操作使棧減小。棧通常是向下增長的。

3、 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通常被稱為堆疊幀。

二、函式呼叫堆疊過程

函式呼叫堆疊過程書上從反彙編函式去一步一步分析的,我這兒我想從壓棧

和清棧兩方面去總結。

壓棧:

對呼叫方函式來說:

1) 壓入形參變數的位址和值;

2) 壓入函式呼叫返回後要執行的指令的位址;

對被呼叫函式來說:

1) 壓入呼叫函式的棧底指標,把棧底指標暫存器指向被呼叫函式的棧底;

2) 開闢被呼叫函式的棧幀大小,並初始化為cc;

清棧:

對呼叫函式來說:

1) 清理形參變數的記憶體;

對被呼叫函式來說:

1) 清理被呼叫函式開闢的棧幀大小;

2) 回退棧底指標到呼叫函式的棧底;

3) 把回退到呼叫函式要執行的指令位址給pc暫存器;

三、舉例

下面寫乙個簡單的程式來解釋一下函式呼叫堆疊過程:函式的活動記錄用

ebp和esp這兩個暫存器(幀指標)規定範圍,esp始終指向棧的頂部,ebp指向

函式活動記錄的乙個固定位置。下面sum()函式為被呼叫函式,main()為呼叫方函

數。

int

sum(int a,int b)

int main()

從main()開始執行,下面是壓棧過程:

壓棧過程是從下到上,清棧自然是從上到下。

sum()函式執行完函式返回時,開始清棧:

1) 清理sum()開闢的棧幀大小,move esp;

2) pop ebp:從棧中恢復儲存的ebp的值,ebp回到main()的棧底;

3) ret:從棧中獲得返回位址,並跳轉到該位置。

4) return 之後esp指向最開始形參a的位置。

函式呼叫堆疊

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

函式呼叫堆疊

乙個函式的執行在棧上開闢記憶體。在函式呼叫時,第乙個進棧的是主函式呼叫語句的下一條可執行語句的位址,然後是函式的各個引數。在大多編譯器中,引數是由右往左入棧的,然後再是函式中的區域性變數。下面給乙個例項 int sum int a,int b int main 其中,main函式的反彙編指令 其中,...

函式呼叫堆疊

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