在學習過函式宣告和定義,了解了函式的引數、實參、形參、引數的設計、函式的使用等一些函式基礎知識之後,函式逐漸變為我們編寫**時重要工具。無論是編寫時引用的庫函式,還是實現程式部分功能時使用的自定義函式,都體現函式的重要性。
函式特點:
使**開發更高效;
提高**復用性;
使**邏輯更加清晰。
函式所佔據的重要地位,使得我們有必要研究函式,研究函式的呼叫過程。
由一段簡單的**做**:
#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 函式的...