1. 程式人生 > >函式呼叫過程(棧幀)

函式呼叫過程(棧幀)

函式呼叫過程詳解

原始碼
#include<stdio.h>

int add(int x,int y)
{
	int c=x+y;
	return c;
}
int main()
{
	int a=0xaaaaaaaa;
	int b=0xbbbbbbbb;
	int c=add(a,b);
	printf("you should run here:%d\n",c);

	system("pause");
	return 0;
}
1、

1a壓入ebp-4的棧位置,將b壓入ebp-8的位置

2mov EAXbpush EAX

mov ECXapush ECX

3call指令:1、將當前所執行指令的下一條指令地址壓棧

2、修改EIP值,跳轉到目標函式的入口地址

4pushebp

將函式棧底指標壓棧

5mov EBP,ESPEBPESP指向同一位置

subESP,44hESP地址下移

6aebp+8)送入eax

eax+bebp+12)送入eax,然後將eax壓棧,將c返回值送入eax

7 movespebp8pop ebp出棧 main函式棧底送入ebp9 ret指令:當前棧頂返回值地址出棧,將彈出地址存入eip0040109310 esp+8;恢復main函式棧幀mov eax:存入main函式棧幀中