C語言05 函式及函式的呼叫過程

2021-10-02 03:52:23 字數 1199 閱讀 9069

函式呼叫過程

集中處理非常樸素的道理,實踐以下**,變參函式的話題。。。

有意義機器碼

通過反彙編視窗確認

另外,也可以從列印函式名確認:

void funtest()

void funvalarg(char* arg1, ...)

void myaddval(...)

int main(int argc, char* ar**)

作業系統為了好管理,記憶體是分區域的。

對於去掉隨機基位址的工程,可以通過記憶體位址,簡單區分它屬於哪塊記憶體區域。

int main(int argc, char* ar**)

函式呼叫過程

int myadd(int x, int y);

int main(int argc, char* ar**)

int myadd(int x, int y)

涉及兩方:

函式的呼叫及返回的過程,就是在呼叫方和被呼叫方切換流程的過程。 又因為函式肩負著介面的作用,所以,除了流程切換之外,還需要保證:(過得去,回得來)

記憶體區域有一塊被劃分為棧,所有被呼叫的函式,都會使用這塊區域,但是,他們的區域性變數、引數等並不會重疊。

每一次函式被呼叫,都有特定的一塊佔記憶體與這次呼叫對應,這稱為「棧幀」。

開始呼叫某函式,會自動分配棧幀空間。

如果某函式呼叫結束,那麼會**棧幀空間,這個過程,稱為平衡棧。

大概輪廓:

c語言的預設呼叫約定,具體的操作是:

實際上,c語言呼叫約定有三種:

int _cdecl myadd(int x, int y);

int _stdcall myadd2(int x, int y);

int main(int argc, char* ar**)

int myadd(int x, int y)

int _stdcall myadd2(int x, int y)

節省空間角度而言,_stdcall更優秀

C 函式呼叫過程

int fun1 int a,int b int main 將彙編 執行到函式呼叫的地方,檢視函式呼叫引數帶入的指令。int a fun1 10,20 0131141e push 14h 01311420 push 0ah 01311422 call fun1 0131118bh 引數順序是10,2...

C函式的呼叫過程

c函式的引數傳遞過程 基礎知識 函式呼叫的本質將在這裡得到闡明。首先請讀者理解堆疊的操作。函式和堆疊的關係密切,這是因為 c語言程式通過堆疊把引數從函式外部傳入到函式內部。此外,在堆疊中劃分區域來容納函式的內部變數。呼叫push和pop指令的時候,暫存器 esp用於指向棧頂的位置 棧頂總是棧中位址最...

函式呼叫過程

每乙個未執行完的函式都對應著乙個棧幀,系統為單個函式分配的那部分棧空間就叫做棧幀,棧幀儲存了函式的資訊。以下面的 為例,通過彙編 的執行過程介紹棧幀建立和銷毀的過程 include int add int x,int y int main 從main函式建立自己的棧幀開始 其他內容先忽略 初始狀態 ...