函式呼叫的具體過程以及棧幀的建立和銷毀

2021-08-10 07:03:50 字數 910 閱讀 6632

這裡用乙個簡單的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 每次的函式呼叫都是乙個過程,這個過程我們通常稱之為 函式呼叫這個過程要為函式開闢棧空間,用於本次函式的呼叫中臨時變數的儲存 現場保護。這塊棧空間我們稱之為 函式棧幀在學習棧幀時我們必須首先了解兩個...