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

2021-08-19 04:51:01 字數 1687 閱讀 2061

我們大家學習c語言肯定都知道函式,但大家可能都只會用函式,對它的了解只是上層的,並不知道它的呼叫過程,今天我們就一起來深入的研究一下函式的呼叫過程。

首先,我們要知道的是,在函式呼叫時,程式將使用乙個執行時堆疊,它裡邊存區域性變數和返回位址,執行時堆疊由ebp(存放維護這個棧的棧底指標)和esp(存放維護這個棧的棧頂指標)兩個暫存器維護,在棧空間開闢。

先看一段簡單的**:

#define _crt_secure_no_warnings 1

#include

int add(int x, int y)

int main()

在按f10逐步執行時,我們可以看見這樣乙個現象:

我們可以發現,其實main函式在_tmaincrtstartup函式中呼叫的,而_tmaincrtstartup函式是在maincrtstartup被呼叫的。

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

當我們要詳細研究函式呼叫過程,就必須得看彙編**。

我們先來看看main函式棧幀的建立。

接下來我們來看看add函式的呼叫。

執行call指令的時候按f11,來到了這裡:

再按f11就進入add函式的執行**處:

剩下的是函式返回部分:

到這裡,我們已經把乙個函式完整的呼叫過程分析完了,可能還有好多人不理解我們為什麼要研究函式的呼叫過程,棧幀的銷毀和建立。那我們就看乙個題目吧。

在vc6.0環境中,下面**的執行結果是什麼?

#include

void fun()

int main()

我們先來猜一下它的輸出結果是多少呢?很多人可能會猜出答案是20,沒錯,就是20,那這到底是為什麼呢?我就簡單來分析分析它的函式呼叫過程吧,感興趣的話可以根據上邊我分析的那個函式定義過程,轉到它的反彙編,自己仔細研究一下。、

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

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

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

1.cpu中的暫存器 通用暫存器 eax,ebx,ecx,edx 程式計數器 eip pc 存放當前正在執行的指令的下一條指令的位址。棧頂 esp暫存器 棧底 ebp暫存器 2.將記憶體中的指令複製到cpu中 讀取指令 分析指令 執行指令 3.什麼是棧?棧是一種特殊的鍊錶形式的資料結構,只允許在鍊錶...

C語言 函式的呼叫過程及棧幀的建立和銷毀

一 說起函式呼叫,我們可能很快就想到 程式從main函式走起,遇到呼叫函式的語句,就跳轉到此函式所在的語句塊執行此函式,執行完之後再返回main函式繼續執行程式。但是這只是籠統的描述,其實在函式內部,函式呼叫要經過一系列的複雜的過程,下面為大家一一詳細敘述。1.說到函式呼叫,我們不可避免的要說到棧幀...