由乙個.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 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...