函式棧幀問題

2022-07-21 18:12:17 字數 892 閱讀 3284

函式呼叫另乙個詞語表示叫作過程。乙個過程呼叫包括將資料和控制從**的一部分傳遞到另一部分。另外,它還必須在進入時為過程的區域性變數分配空間,並在推出時釋放這些空間。而資料傳遞,區域性變數的分配和釋放通過操縱程式棧來實現。

棧幀(stack frame),機器用棧來傳遞過程引數,儲存返回資訊,儲存暫存器用於以後恢復,以及本地儲存。為單個過程(函式呼叫)分配的那部分棧稱為棧幀。棧幀其實是兩個指標暫存器,暫存器%ebp為幀指標,而暫存器%esp為棧指標,當程式執行時,棧指標可以移動(大多數的資訊的訪問都是通過幀指標的)。總之簡單一句話,棧幀的主要作用是用來控制和儲存乙個過程的所有資訊的。棧幀結構如下所示:

下面舉個例子:

執行結果:正常返回到main函式中的呼叫的地方

修改一點**:

執行結果:直接執行了bug函式,沒有返回到main函式

簡單畫圖分析一下:

那麼在不使用y變數名稱的情況下,如何改變y的內容?很簡單了~首先要知道的是引數入棧順序是從右向左的,即y在上,x在下,令p指向x,指標p++,則p指向了y,再用*p去改變y的值就可以了。

結果:

函式的棧幀

includeint add int x,int y int main 我們發現其實main函式在 tmaincrtstartup 函式中調 用的,tmaincrtstartup 函式是在 maincrtstartup 被調 用的。我們知道每一次函式呼叫都是乙個過程。這個過程我們通常稱之為 函式的調...

函式的棧幀過程

幾乎所有的函式都使用了棧,沒有棧就沒有函式,沒有區域性變數。在程式執行過程中,棧儲存了乙個函式呼叫所需要的維護資訊,也可稱為堆疊幀或者活動記錄。堆疊幀一般包括以下幾個方面 1 函式的返回位址和引數 2 臨時變數 包括函式的非靜態區域性變數以及編譯器自動生成的其他臨時變數 3 儲存的上下文 包括在函式...

函式的呼叫棧幀

今天來給大家分享一下函式的呼叫過程。我也是剛剛開始學的,還請大家多多指教 我們最常說的乙個 是從main 函式開始的,但是main 函式就不呼叫引數麼?那倒未必。現在就來看看main 函式的呼叫。int add int x,int y int main 先看看這個 然後關於main 函式的呼叫。啟用...