C 函式整個呼叫過程即函式棧幀!

2021-08-01 02:56:12 字數 849 閱讀 7486

在c語言中,函式從記憶體的角度來分析函式的整個呼叫過程呢!

1、首先了解兩個暫存器變數,esp和ebp,他們分別是存放的是棧頂的位址和棧底的位址。

2、要觀察函式的呼叫過程需要從彙編**開始分析。

#include int add(int x,int y)

int main ()

下圖是函式呼叫的簡單草圖

首先進入的是tmaincrtstarup函式,這個函式是在呼叫main函式之前就已經被呼叫了,

在呼叫這個函式的時候會自動的分配好棧頂和棧底,並且在棧底和棧頂開闢出來一片記憶體,並初始化為ccccccccc

接下來就是建立區域性變數是a和b,如圖中的藍線所指部分。

遇到函式的呼叫時,將實參進行拷貝,傳到函式的形參裡。

這裡需要注意的是在對函式進行呼叫前需要對函式的入口進行保護現場操作,即對函式呼叫時進行位址儲存

接下裡就是這裡主要的部分-----對函式的呼叫

在對函式呼叫時,首先會對記憶體進行壓棧,即將main函式的ebp壓到函式呼叫的記憶體底端。

再接下來就是開闢一塊內存在進行函式的引數的建立,當函式完成呼叫後,要將所得結果返回,這是記憶體會進行將資料彈出,

當把esp指向和ebp所指向相同時,系統會彈出ebp的值,這是ebp將會指向,自然按而然的

esp就指向想函式所呼叫時所儲存的位址,這是eax裡儲存的就是函式計算的結果

再將eax的值賦值給ret,經過輸出即可得到資料結果。

到這裡函式的呼叫就結束了

函式呼叫過程(棧幀)

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

函式棧幀(呼叫過程)

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

C語言 函式呼叫過程(棧幀)

首先舉個栗子 include int add int x,int y int main 在這個程式裡,函式被呼叫才會發揮函式的功能,而函式的呼叫其實是乙個過程,在這個過程計算機要為函式開闢棧空間,用於本次函式臨時變數的儲存和現場保護,這塊空間稱為函式的棧幀。現場保護的作用是為了在呼叫完另乙個函式,返...