函式的呼叫棧幀

2021-08-19 10:27:44 字數 1415 閱讀 5090

今天來給大家分享一下函式的呼叫過程。我也是剛剛開始學的,還請大家多多指教;我們最常說的乙個**是從main()函式開始的,但是main()函式就不呼叫引數麼?那倒未必。現在就來看看main()函式的呼叫。

int add(int x, int y)

int main()

先看看這個**,然後關於main()函式的呼叫。啟用呼叫堆疊來檢視。

那麼我們說其實main()函式也是被呼叫的,如上圖,main函式在_maincrtstartup函式中呼叫的,而_maincrtstartup函式是在maincrtstartup中被呼叫。這就是簡單的main函式的呼叫,

如果要呼叫函式,那麼就需要給函式開闢棧空間,用於本次函式的呼叫中臨時變數的儲存、現場保護。那麼這塊棧空間就稱為函式棧幀。終於到正題了。再來哈,說說兩個暫存器ebp和esp。在函式呼叫的過程中這兩個暫存器放了維護這個棧的棧低和棧頂指標。來看看具體的圖。(我這裡著重說main函式,就舉了兩個函式)

如圖,ebp存放了指向main函式棧幀棧低的位址;esp存放了指向main函式棧幀棧頂的位址。

接下來,讓我們借助反彙編**來研究研究函式的呼叫過程。

1.從main函式開始的地方,要展開main函式的呼叫就得為main函式建立棧幀,先來看main函式棧幀的建立。

2、接下裡就是add函式的呼叫了。

執行call指令的時候按fn+f11,來到了下圖。

在按fn+f11,進入add函式的執行**處。

函式的返回部分

到現在就把簡單的函式呼叫棧幀給簡單的說完了,我是在vs2013上面除錯的,不同的編譯器會有不同的結果,但是總體思路不變。   有上面問題,還請各位大神指點。

函式的呼叫過程(函式棧幀)

乙個完整的能實現一些基本功能的程式總要或多或少的呼叫一些函式,但函式的具體呼叫過程是怎樣的,從列印出來的結果來看,顯然是無法得知的,這就需要對函式的呼叫過程有乙個深入地研究。從簡單的 開始 include intadd int x,int y intmain 進行程式除錯,檢視 呼叫堆疊 如下 可以...

函式呼叫過程(棧幀)

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

函式棧幀(呼叫過程)

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