首先舉個栗子:
#include <stdio,h>
int add(int x,int y)
{
int c=;
c=x+y
return c;
}
int main()
{
int a=;
int b=;
int c=;
c=add(a,b);
}
在這個程式裡,函數被調用才會發揮函數的功能,而函數的調用其實是一個過程,在這個過程計算機要為函數開辟棧空間,用于本次函數臨時變量的儲存和現場保護,這塊空間稱為函數的棧幀。現場保護的作用是為了在調用完另一個函數,傳回時能回到上一個函數的運作的地方。
在棧幀裡,靠ebp和esp維護棧的棧底和棧頂指針。在記憶體裡,變量的儲存是從高位址向低位址。
首先main函數其實被__tmainCRTStartup函數調用,而__tmainCRTStartup函數在mainCRTStartup被調用
main函數的調用過程:
(1)首先壓棧ebp,友善函數傳回後的現場還原,再把esp的值賦給ebp,産生新
的ebp;
(2)再給esp減去一個十六進制數,産生一個新的esp;
(3)依次壓棧ebx、esi、edi,然後把edi移到棧頂的有效位址處;
(4)初始化edi到ebp的空間;
(5)以此從高位址處給變量開辟空間;

(6)調用add函數:
(1)參數壓棧,形參從右往左依次壓入,先b 後a;
(2)現場保護,把調用add函數時main函數運作時的位址壓棧;
(3)把ebp壓棧;把esp的值賦給ebp,産生add的ebp;
(4)再給esp減去一個十六進制數,産生一個add的esp;
(5)類似上述mian函數的步驟;
調用完成之後釋放調用函數的棧幀空間,回到原來環境。