函式呼叫過程

2021-09-10 08:27:11 字數 1103 閱讀 1459

c語言種有三種迴圈:

do...while

while

for(初始化;條件判斷;步進)

主函式(main)

庫函式自定義函式

函式的發明,使得變成可以以函式為單位進行模組化,叫做面向過程。

軟體工程中,有「高內聚,低耦合」的要求。 函式就是為了實現以上要求發明的產物。 函式是面向過程的「介面",其介面包含了:引數、返回值。 函式與函式之間,就是通過引數、返回值進行互動的。並且,因為低耦合的設計,函式與函式之間,互相不需要直到對方內部的實現。具體而言,函式呼叫過程,會從傳參開始,到獲取函式呼叫的返回值結束。 

函式是通過棧其實就是一塊記憶體區域,一般而言(純經驗),vs系列,棧的位址為0x0018***x或0x0019***x。 **區域,以0x0040***x, 0x00041***x開頭。

具體的傳參細節要複雜得多,包括:

1. 按照呼叫約定傳參

2. 儲存返回位址

3. 跳轉到被呼叫的函式**移流程)

5. 開闢區域性變數空間

6. 儲存程式環境

7. 開始執行被呼叫函式的**

函式的返回,從最頂部的棧幀開始(較低位址),逐漸往高位址的棧幀轉移。每返回一層函式,它對應的棧幀就「丟棄」。

1. 恢復暫存器環境

2. 放棄棧幀空間(也成為「平衡棧」)

3. 取返回位址並跳轉到該位址 

還剩最後乙個問題,返回值到底是如何返回的?答: 在x86中,函式的返回值放在暫存器eax中。

傳參約定到底約定了什麼? 

答:傳參的順序、用什麼傳參、誰平衡棧 

1、標準約定,__stdcall

1. 從右往左依次傳參

2. 使用棧傳參

3. 被呼叫方平衡棧

2、c約定, __cdecl

1. 從右往左依次傳參

2. 使用棧傳參

3. 呼叫方平衡棧

問:printf的傳參約定是什麼?為什麼?

c約定,因為printf是變參函式,變參函式傳參的個數是變化的,只能呼叫方去平衡棧。

函式呼叫過程

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

函式呼叫過程

引數代入順序 引數入棧的順序是從右向左入棧的。8位元組的引數代入 push入棧的方式將引數傳遞 8位元組的引數代入 先在main函式的棧頂向上移動12位元組,然後將引數的資料拷貝到main函式棧頂開闢的記憶體。int fun1 int a,int b int main 第一步進行函式引數入棧,如圖 ...

函式呼叫過程

主要流程 呼叫前的準備 引數入棧,eip 入棧,ebp 入棧,eip跳轉 函式執行 恢復到呼叫前狀態 返回值 eax,恢復ebp,恢復 eip include intf intmain call f 0b711d6h pushl ebp movl esp,ebp subl 16,esp movl e...