C語言—函數棧幀

函數的調試過程—棧幀

每一次函數的調用都是一個過程,這個調用過程要爲函數開闢棧空間,用於此次函數調用中變量的保存、現場保護。而這塊棧空間就稱爲函數棧幀。
下面對函數的調用過程進行逐步的分析:

(1)首先寫一個簡單的加法函數,再寫一個main函數進行調用,並轉到彙編代碼,如下圖
這裏寫圖片描述
(2)從main函數開始,先爲main函數創建棧幀,過程如下
這裏寫圖片描述
補充:esp和ebp都爲寄存器;
esp存指向函數棧幀棧頂的地址
ebp存指向函數棧幀棧底的地址
下圖爲棧幀的創建過程
這裏寫圖片描述
補充:main函數在_tmainCRTStartup函數中調用的,而_tmainCRTStartup函數是在mainCRTStartup被調用的。
(3)接下來是Add函數的調用
這裏寫圖片描述
這裏寫圖片描述
(4)到call指令按F11到這裏:
這裏寫圖片描述
再按F11進入函數:
這裏寫圖片描述
補充:最後的ret指令會使得出棧一次,並將出棧的內容當作地址。將程序執行跳轉到該地址處。
這裏寫圖片描述
(5)最後跳回主函數,輸出結果

這裏寫圖片描述
下面是整體圖:
這裏寫圖片描述
總結:爲什麼函數調用要用棧來實現呢?
我們知道大部分函數順序執行,且函數的調用是可嵌套的,而棧是一個合適的實現方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章