函式的呼叫過程(棧幀)

2021-08-19 07:25:41 字數 1753 閱讀 5825

函式就是一系列c語句的集合,為了完成某個會重複使用的特定功能。

需要該功能的時候,直接呼叫該函式即可,不用每次都堆疊一大堆的**;

需要修改該功能的時候,也只要修改和維護這乙個函式即可。

總之,將語句集合成函式,好處就是方便**重用。並且,乙個好的函式名,

可以讓人一眼就知道這個函式實現的是什麼功能,方便維護。

##函式的呼叫過程

那我們深入的研究一下函式的呼叫過程

先看看下面這段**,當我們進行除錯的時候,檢視【呼叫堆疊】

-檢視呼叫堆疊,我們可以發現其實 main 函式在_tmaincrtstartup 函式中 呼叫的,而_tmaincrtstartup函式在 maincrtstartup 被呼叫的

- 每一次函式呼叫都是乙個過程,通常稱為:【函式的呼叫過程】

- 函式要跑起來的話,它要向記憶體申請一段空間;而這段空間在棧上開闢,那麼這塊

棧空間我們稱之為【函式棧幀】;記住棧的使用順序是由高位址到低位址。

- 我們平時知道的暫存器有eax,ebx,ecx,edx;

- 還有兩個ebp和esp,在函式呼叫的過程中這兩個暫存器存放了維護這個棧的

棧底和棧頂指標。來維護開闢出這段位址的起始和結尾的記憶體位址。

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

######ebp指向了函式棧幀棧底的位址;esp指向了函式棧幀棧頂的位址。

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

從main函式開始,要展開main函式的呼叫就得為main函式建立棧幀。

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

接下來是add函式的呼叫。引數傳遞過程:

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

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

剩下的是函式返回部分

棧幀這部分內容在不同的編譯器上實現存在差異,但是思想是一致的

函式呼叫過程(棧幀)

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

函式棧幀(呼叫過程)

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

函式的呼叫過程 棧幀

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