C語言 深度理解函式 函式的棧幀

2021-08-19 19:37:23 字數 888 閱讀 9157

c語言函式是如何呼叫的呢?初學時我想當然地回答:從呼叫部分轉到函式部分逐句執行,就是那麼簡單啊,然而你有沒有想過····

函式呼叫前需要做哪些準備工作?函式是如何傳參的?傳參後又是如何使用的?引數使用完後又是如何銷毀的?呼叫的整個過程是怎樣的呢??

今天就通過下面這個簡單的**帶大家走進函式的世界,一**竟~

#include

int add(int

x,int

y)int main()

上面這個加法函式的使用,想必大家一眼就能看懂,然而轉到反彙編可以看到下面那麼多的**。。。有沒有突然就懵逼了呢?_?想象中簡單的呼叫為何變得如此複雜?這都是在搞什麼嘞??(懵逼臉)

1.main函式開闢空間

每次函式呼叫都會開闢一塊記憶體空間,該程式也不例外,接下來讓我們先看一下具體是如何開闢空間的。下面這幅圖是maincrtstartup呼叫main函式並初始化以及main函式棧幀的具體過程:

2.add函式的呼叫

通過上面的步驟已經為main函式開闢好了空間,接下來進行add函式的呼叫,具體流程如下圖所示:

3.add函式棧幀的銷毀

下圖是add函式呼叫完成後,add函式棧幀的銷毀過程

到這裡函式的棧幀具體過程就介紹完了,通過上面三幅圖大家有沒有對函式棧幀有乙個清晰的認識呢?

C語言 深度理解函式的呼叫(棧幀)

本文講解的函式呼叫棧幀,需要用到彙編。又不知道同學可以自學一下。我們可以知道函式的呼叫是乙個過程,我們通常將這個過程稱之為函式的呼叫過程。從邏輯上講,棧幀就是乙個函式執行的環境 函式引數 函式的區域性變數 函式執行完後返回到 等等。這個過程要為函式開闢棧空間,於本次函式的呼叫中臨時變數 的儲存 現場...

C語言函式棧幀解析

目錄 eax,ebx,ecx ebp 存放了指向函式棧幀棧底的位址 esp 存放了指向函式棧幀棧頂的位址 函式被呼叫時,系統會在棧區為該函式開闢一塊棧空間,這個棧空間就是該函式的函式棧幀。以main函式的呼叫為例 棧幀也叫過程活動記錄,是編譯器用來實現函式呼叫過程的一種資料結構。從邏輯上講,棧幀為乙...

深入理解C 函式棧幀

目錄 每一次函式呼叫都是乙個過程,為函式開闢棧空間,用於本次函式呼叫中臨時gyoosgl變數的儲存 現場保護。這塊棧空間我們稱為函式棧幀。棧是從高位址向低位址延伸的。暫存器ebp指向當前的棧幀的底部 高位址 暫存器esp指向當前的棧幀的頂部 低位址 注 esp 棧指標暫存器 extended sta...