函式呼叫機制 棧結構

2022-06-04 07:21:09 字數 2354 閱讀 9124

函式呼叫機制:

首先我們看下源**:

將a

賦值為5,b

賦值為3

可以看到我已經在呼叫函式那一行設定了斷點

然後我們f5

開始除錯檢視函式呼叫流程:

現在我們f11

進入函式:

然後取x

可以看到x和y

的值已經壓入棧中

傳參順序是從右往左依次入棧,所以y

值在下,

x值在上

然後我們繼續單步走:

可以看到將引數壓入棧中後緊跟著儲存了返回位址,

為什麼儲存返回位址?

這00401053

是誰的位址?

當函式結束後為什麼可以知道呼叫方的下一條指令呢?

當函式結束後就會返回到這個位址上繼續執行呼叫方的**

這個指令就是**中main

函式的return

語句的位址;

為了證明這一點我剛剛悄悄看了下反彙編並且截圖:

正好是00401053

然後我們繼續看:

然後看到返回位址之後又壓入了0012ff48

這個位址是呼叫方的棧資訊也就是指向呼叫方棧空間的指標

,儲存當前的棧資訊,以便函式出去時還原到進來時狀態;

現在我們解釋下為什麼這麼多c,

原來這些都是編譯器為棧申請的空間在

debug

版裡面優化選項是預設關閉的

所以申請的區域性變數空間是大於等於實際區域性變數空間的

;有了優化後申請的區域性變數空間會小於等於實際區域性變數空間

最後看到儲存了暫存器的環境,

因為之前為區域性變數空間大小將

將棧頂做了調整所以將修改的暫存器儲存在棧內;

以上就是基本的函式棧空間結構了;

然後這些儲存完成之後就是執行函式**了;

執行完成之後就是恢復暫存器環境釋放區域性空間(

平衡使用的棧空間

)還原到進來時期的狀態,接著

return返回;

跳轉到剛才儲存的返回位址去執行下一條指令

本人初學 如有**說不對的 望提指正 !

函式呼叫棧

當程式進行函式呼叫的時候,系統會用到下面三種暫存器 3.ebp ebp暫存器裡儲存的是棧基址,是在函式呼叫之前,由esp賦值給ebp的。棧底方向,高位位址 call fun arg1,arg2,arg3 修改esp,棧向下增長,引數入棧,返回位址入棧 arg3 arg2 arg1 返回位址 上一層e...

棧 函式呼叫

編譯以下程式,分析此程式以得出棧的精髓 1 主函式被上層呼叫者呼叫後,執行push ebp,esp 4 因為ebp入棧 ebp值沒有改變,值得注意的是剛開始分配站的時候,第乙個入棧的是return,主函式的返回位址,然後是ebp 2 然後是mov ebp,esp,將esp的值賦給ebp,該語句未執行...

函式呼叫 函式棧

函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...