c 函式堆疊呼叫

2021-09-25 15:15:18 字數 1554 閱讀 2409

由乙個.cpp/.c檔案到達乙個可執行檔案分為以下幾部分

預編譯階段:進行巨集替換,刪除注釋,展開標頭檔案,新增行號等

編譯階段:進行詞法,語法,語義分析,和**優化,生成彙編指令

彙編:翻譯指令

連線階段:合併段和符號表,符號解析

執行階段:建立虛擬位址和物理對映,載入指令和資料,程式入口位址寫入暫存器中

c++記憶體分布

c++函式呼叫引數傳遞(編譯器為vs2013)

執行乙個簡單的函式

#include

using namespace std;

void fun(int a, int b)

int main()

main函式棧開闢完成後對ab進行賦值其中esp棧頂指標,ebp棧底指標

呼叫fun函式之前,main函式首先開闢空間初始化形參

通過兩次push將實參壓入,形參初始化

從彙編可以看出形參是通過從右向左賦值

然後跳轉到fun函式位址執行

call指令會將下一條彙編指令入棧,然後跳轉

esp中的值為0x005df750,根據call指令則在棧頂應為call的下一條指令位址

檢視記憶體:

此時函式棧應為:

fun函式首先將ebp暫存器中值壓入棧中,這樣可以回退到main函式中,然後在跳轉到fun函式棧上

此時棧為:

開闢空間並初始化為0cccccccch

執行完成,清除空間並返回ebp值,ret用棧中的值修改ip值,此時棧應為:

在main函式中執行

清理為形參開闢的空間

從這呼叫可以看出在c語言預設的呼叫約定下有呼叫者開闢形參空間,並且由呼叫者釋放空間

C 堆疊與函式呼叫

一 c 程式記憶體分配 1 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都在棧上建立,函式結束是,這些儲存單元自動被釋放。棧記憶體的分配運算內置於處理器的指令集中,一般採用暫存器來訪問,效率很高但是分配的記憶體容量有限。2 從堆上分配,亦稱動態記憶體分配。程式在執行時malloc或new任意...

函式呼叫堆疊

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

函式呼叫堆疊

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