C語言 函式呼叫過程(棧幀)

2021-08-10 18:53:15 字數 937 閱讀 9627

首先舉個栗子:

#include 

int add(int x,int y)

int main()

在這個程式裡,函式被呼叫才會發揮函式的功能,而函式的呼叫其實是乙個過程,在這個過程計算機要為函式開闢棧空間,用於本次函式臨時變數的儲存和現場保護,這塊空間稱為函式的棧幀。現場保護的作用是為了在呼叫完另乙個函式,返回時能回到上乙個函式的執行的地方。

在棧幀裡,靠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函式的步驟;

C語言函式呼叫過程 棧幀

在學習過函式宣告和定義,了解了函式的引數 實參 形參 引數的設計 函式的使用等一些函式基礎知識之後,函式逐漸變為我們編寫 時重要工具。無論是編寫時引用的庫函式,還是實現程式部分功能時使用的自定義函式,都體現函式的重要性。函式特點 使 開發更高效 提高 復用性 使 邏輯更加清晰。函式所佔據的重要地位,...

函式呼叫過程(棧幀)

眾所周知,程式每呼叫乙個函式,系統都會為其開闢一塊空間,當它返回時,才收回這塊空間。程式崩潰有一部分原因就是因為無限制的呼叫函式,卻沒有及時返回,導致記憶體空間不夠。為了更好的維護這一塊空間 通常稱為棧空間 我們需要了解兩個暫存器,乙個為 esp 指向棧頂的指標 乙個為 ebp 指向棧底的指標 棧空...

函式棧幀(呼叫過程)

函式棧幀就是在呼叫函式是為其在棧空間上開闢了一段空間,指向過程呼叫,乙個過程呼叫包括將資料 以過程引數和返回值的形式 和控制從 的一部分傳遞到另一部分。我們以以下 為例講解整個函式呼叫過程 int my add int x,int y int main 一 呼叫main 函式 我們從main 函式的...