函式的呼叫過程,棧幀的建立與銷毀

2021-08-13 03:02:19 字數 1193 閱讀 6974

以下面一段**為例,說一說函式的呼叫過程,棧幀的建立與銷毀。

這段**要在vc6.0下除錯,因為vc6.0對這部分的處理簡單些,利於學習使用。

#includeint add(int x, int y)

int main()

除錯以上**,看呼叫堆疊視窗,我們可以看到main函式在 __tmaincrtstartup函式中被呼叫,而__tmaincrtstartup函式是在maincrtstartup中被呼叫。

每一次函式呼叫都是乙個過程,這個過程我們叫做:函式的呼叫過程。

這個過程要為函式開闢棧空間,用於本次函式呼叫中臨時變數的儲存、呼叫現場的保護。這塊棧空間我們稱之為函式棧幀

想要了解清楚函式的呼叫過程,棧幀是如何建立和銷毀的,首先要了解一些彙編的知識。

ebp和esp兩個暫存器,在函式呼叫過程中這兩個暫存器存放了維護這個棧的棧底和棧頂的指標。

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

ebp存放指向棧幀棧底的位址,esp存放指向棧幀棧頂的位址。

下面來看除錯模式下的反彙編視窗:(以下截圖均來自vs2013,因博主木有安裝vc6.0)

1.從main函式開始,先來看main函式棧幀的建立

執行call指令,按下f11,如下:

再按f11,來到add函式的執行**處:

接下來是add函式返回部分,add函式棧幀銷毀過程:

以上就是函式呼叫的全部過程。

函式的呼叫過程 棧幀的建立和銷毀

首先我們要了解一些概念。1.棧 stack 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數 函式引數 返回函式 返回位址等。操作方式類似於資料結構中的棧。棧向下生成 先定義的位址高,後定義的位址低 2.堆 heap 由程式設計師分配釋放 若程式設計師不釋放,程式結束時可能由os 分配方式類似...

函式的呼叫過程,棧幀的建立和銷毀

我們大家學習c語言肯定都知道函式,但大家可能都只會用函式,對它的了解只是上層的,並不知道它的呼叫過程,今天我們就一起來深入的研究一下函式的呼叫過程。首先,我們要知道的是,在函式呼叫時,程式將使用乙個執行時堆疊,它裡邊存區域性變數和返回位址,執行時堆疊由ebp 存放維護這個棧的棧底指標 和esp 存放...

函式呼叫過程中棧幀的建立與銷毀

開始之前需要對組合語言中的一些指令進行解釋 esp 棧指標暫存器 extended stack pointer 其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。ebp 基址指標暫存器 extended base pointer 其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底...