函式的呼叫過程(棧幀)

2021-08-19 04:27:37 字數 912 閱讀 8361

先看乙個簡單的**:

#include#includeint add(int x, int y)

int main()

每次的函式呼叫都是乙個過程,這個過程我們通常稱之為:函式呼叫這個過程要為函式開闢棧空間,用於本次函式的呼叫中臨時變數的儲存、現場保護。這塊棧空間我們稱之為:函式棧幀在學習棧幀時我們必須首先了解兩個暫存器ebp和esp,在函式呼叫過程中這兩個暫存器存放了維護這個棧的棧底和棧頂指標;

比如在呼叫main函式,我們為main函式分配棧幀空間,那麼棧幀維護如下:

要詳細研究函式的呼叫,就必須得用彙編**:

1:任何函式都是從main函式的地方開始,要呼叫main函式(main函式是在maincrtstart()中被呼叫),就要為main函式建立棧幀,首先先觀察main函式棧幀的建立:

暫存器eax帶回30後賦給ret,輸出ret=30後釋放為main函式開闢的堆疊。

以上就是整個函式呼叫的過程。

特別注意的是:

形參是實參的乙份臨時拷貝,改變形參的值並不會改變實參,如果想改變實參的值,函式的引數就應該傳位址,通過對位址解引用可以改變實參。

函式呼叫過程(棧幀)

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

函式棧幀(呼叫過程)

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

函式的呼叫過程 棧幀

在談棧幀之前,我們必須要先知道c c 程式記憶體的分配情況。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放為執行函式而分配的局 部變數 函式引數 返回資料 返回位址等。其操作方式類似於資料結構中的 棧。2 堆區 heap 一般由程式設計師分配釋...