函式呼叫過程,資料段(棧幀)變化流程

2021-10-09 17:32:23 字數 847 閱讀 8735

int

func2

(int x,

int y)

void

func1

(void

)

push ebp

mov ebp, esp

sub esp 0cch

lea edi [edp-0cch]

mov ecx 033h

mov eax 0cccccccch

rep stos dword ptr es:[edi]

mov [bsp - 4], 1

mov [bsp - 8], 2

mov [bsp - c], 0

mov eax [bsp - 8]

push eax

mov eax [bsp - 4]

push eax

call func2

…mov esp ebp

pop ebp

ret1、將棧幀基位址壓棧(即呼叫者棧幀基位址ebp)

2、更新棧幀基位址ebp為esp;

3、更新棧幀頂位址esp;

4、初始化棧空間為0xcccccccc;

5、初始化區域性變數;

6、在呼叫函式前,將函式實參壓棧;

7、呼叫call指令跳轉到被調函式位址去(先將call指令的下一條指令壓棧,再跳轉到中間位址,再用jmp跳轉到被調函式位址去);

8、進入被調函式,重複1~7流程。

函式呼叫過程(棧幀)

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

函式棧幀(呼叫過程)

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

函式呼叫過程 棧幀 呼叫約定

考慮函式呼叫 func 1,2 需要把1和2這兩個引數進行傳遞,這裡的引數傳遞可以通過兩種方式 1.引數入棧 記憶體 2.引數傳遞到暫存器 大多數情況下,也是c c 的預設形式是通過棧進行傳遞,因為雖然暫存器傳遞方式快但是暫存器數量有限 引數壓入棧中 記憶體 cs ip指向下一條指令位址需要進行跳轉...