函式棧幀就是在呼叫函式是為其在棧空間上開闢了一段空間,指向過程呼叫,乙個過程呼叫包括將資料(以過程引數和返回值的形式)和控制從**的一部分傳遞到另一部分。
我們以以下**為例講解整個函式呼叫過程:
int my_add(int x, int y)
int main()
一、呼叫main()函式:
我們從main()函式的地方開始,要展開main()函式的呼叫就得為main()函式建立棧幀。
strat函式呼叫main()函式,把ebp先壓棧,用來儲存strat函式ebp占地指標的位置
將strat函式的esp的值賦給ebp,也就是讓ebp作為將要開闢的main函式的棧底
讓ebp減去某個值,這是在為main函式棧幀開闢空間
將mian函式中的變數依次壓入棧中
二、呼叫my_add函式:
三、my_add函式棧幀的建立
四、my_add函式呼叫完畢返回main函式
五、main函式的返回
總結:1.函式呼叫過程中會形成臨時變數(形參例項化)在呼叫函式和被呼叫函式的棧幀之間
2.形參例項化的順序,從右往左
3.臨時變數為什麼具有臨時性?
函式呼叫時形成棧幀,返回時銷毀棧幀,而定義的變數在自己的棧幀中,所以臨時變數的生命週期伴隨著自己的棧幀結構
4.每乙個函式都有自己的棧幀,由自己產生(修改ebp,esp)
函式通過修改ebp,esp形成自己的棧幀
5.常規情況下,函式的返回值都會以暫存器的形式返回
總結:棧幀的主要作用是用來控制和儲存乙個函式呼叫的所有資訊的。
函式呼叫過程(棧幀)
眾所周知,程式每呼叫乙個函式,系統都會為其開闢一塊空間,當它返回時,才收回這塊空間。程式崩潰有一部分原因就是因為無限制的呼叫函式,卻沒有及時返回,導致記憶體空間不夠。為了更好的維護這一塊空間 通常稱為棧空間 我們需要了解兩個暫存器,乙個為 esp 指向棧頂的指標 乙個為 ebp 指向棧底的指標 棧空...
函式呼叫過程 棧幀 呼叫約定
考慮函式呼叫 func 1,2 需要把1和2這兩個引數進行傳遞,這裡的引數傳遞可以通過兩種方式 1.引數入棧 記憶體 2.引數傳遞到暫存器 大多數情況下,也是c c 的預設形式是通過棧進行傳遞,因為雖然暫存器傳遞方式快但是暫存器數量有限 引數壓入棧中 記憶體 cs ip指向下一條指令位址需要進行跳轉...
函式的呼叫過程 棧幀
在談棧幀之前,我們必須要先知道c c 程式記憶體的分配情況。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放為執行函式而分配的局 部變數 函式引數 返回資料 返回位址等。其操作方式類似於資料結構中的 棧。2 堆區 heap 一般由程式設計師分配釋...