這裡用乙個簡單的add加法程式講解函式呼叫過程
#include
#include
#include
int add(int x, int y)
int main()
先從主函式部分開始。首先建立maincrtstartup函式的棧幀。
esp棧頂指標減0e4(228),開闢了228位元組大小空間。
接著又壓入3個暫存器ebx、esi、edi
然後用下面**把開闢的空間初始化為cc cc cc cc
接下來就是建立區域性變數a,b,ret並賦值。
然後便開始傳參
call呼叫add函式,並且呼叫前儲存了call指定的下一條指定的位址。
main函式
開始add部分剛開始也是一樣為add函式建立棧幀
接著建立z變數,賦值為0
把x放到eax中
把y也加到eax中
把eax放到z裡面
add到這就差不多結束了,開始return z,z放到eax裡,把暫存器變數傳回去;
pop出棧
add函式
函式的呼叫過程 棧幀
在談棧幀之前,我們必須要先知道c c 程式記憶體的分配情況。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放為執行函式而分配的局 部變數 函式引數 返回資料 返回位址等。其操作方式類似於資料結構中的 棧。2 堆區 heap 一般由程式設計師分配釋...
棧幀(函式的呼叫過程)
函式 乙個函式的呼叫包括將資料 以引數和返回值的形式 和控制從 的一部分傳遞到另一部分。另外,他還必須在進入時為函式的區域性變數分配空間。並在退出時釋放這些空間。而其中資料傳遞 區域性變數的分配和釋放都是通過操縱棧來實現的。棧幀 棧用來傳遞函式引數 儲存返回資訊 儲存暫存器用以以後的恢復 以及本地儲...
函式的呼叫過程(棧幀)
先看乙個簡單的 include includeint add int x,int y int main 每次的函式呼叫都是乙個過程,這個過程我們通常稱之為 函式呼叫這個過程要為函式開闢棧空間,用於本次函式的呼叫中臨時變數的儲存 現場保護。這塊棧空間我們稱之為 函式棧幀在學習棧幀時我們必須首先了解兩個...