C語言函式呼叫過程 棧幀

2021-08-20 11:09:34 字數 1340 閱讀 9074

在學習過函式宣告和定義,了解了函式的引數、實參、形參、引數的設計、函式的使用等一些函式基礎知識之後,函式逐漸變為我們編寫**時重要工具。無論是編寫時引用的庫函式,還是實現程式部分功能時使用的自定義函式,都體現函式的重要性。 

函式特點:

使**開發更高效;

提高**復用性;

使**邏輯更加清晰。

函式所佔據的重要地位,使得我們有必要研究函式,研究函式的呼叫過程。

由一段簡單的**做**:

#include int add(int x, int y)

int main()

通過函式學習知道每一次函式呼叫都是乙個過程(即 函式呼叫過程)。

《在程式除錯時,可以通過檢視【呼叫堆疊】來了解函式呼叫過程。>

在這個過程中要為函式開闢棧空間(即 函式棧幀),用於對本次呼叫中的臨時變數的儲存和現場保護。

棧幀的維護:

通過彙編**,對函式呼叫過程詳細研究:

1.main函式棧幀的建立

2.呼叫add函式。引數傳遞過程:

***這裡要注意call 執行兩步操作:

轉移到呼叫的子程式。

3. 按f11 執行call指令後

再按f11進入add函式的執行**處:

4. add函式呼叫結束,通過之前call指令儲存的位址,找到原來esp位置

00d81a64  call        _add (0d811dbh)  

00d81a69 add esp,8 // 銷毀形參

00d81a6c mov dword ptr [ret],eax //通過eax暫存器,將儲存的計算結果返回給 ret

printf("ret = %d\n", ret); // ret 列印出最終結果

00d81a6f mov esi,esp

希望以上內容,使我們對函式的呼叫過程能有更深的理解。

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

首先舉個栗子 include int add int x,int y int main 在這個程式裡,函式被呼叫才會發揮函式的功能,而函式的呼叫其實是乙個過程,在這個過程計算機要為函式開闢棧空間,用於本次函式臨時變數的儲存和現場保護,這塊空間稱為函式的棧幀。現場保護的作用是為了在呼叫完另乙個函式,返...

函式呼叫過程(棧幀)

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

函式棧幀(呼叫過程)

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