天天看點

C語言_函數調用過程(棧幀)

首先舉個栗子:

#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)以此從高位址處給變量開辟空間;
           
C語言_函數調用過程(棧幀)

(6)調用add函數:

(1)參數壓棧,形參從右往左依次壓入,先b 後a;

(2)現場保護,把調用add函數時main函數運作時的位址壓棧;

(3)把ebp壓棧;把esp的值賦給ebp,産生add的ebp;

(4)再給esp減去一個十六進制數,産生一個add的esp;

(5)類似上述mian函數的步驟;

C語言_函數調用過程(棧幀)

調用完成之後釋放調用函數的棧幀空間,回到原來環境。

繼續閱讀