函数调用过程详解
源代码
#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、1将a压入ebp-4的栈位置,将b压入ebp-8的位置
2 mov EAX,b;push EAX
mov ECX,a;push ECX
3 call指令:1、将当前所执行指令的下一条指令地址压栈
2、修改EIP值,跳转到目标函数的入口地址
4 push ebp
将函数栈底指针压栈
5 mov EBP,ESP EBP同ESP指向同一位置
subESP,44hESP地址下移
6 将a(ebp+8)送入eax
将eax+b(ebp+12)送入eax,然后将eax压栈,将c返回值送入eax中
7 mov esp,ebp

8 pop ebp出栈 main函数栈底送入ebp中


9 ret指令:当前栈顶返回值地址出栈,将弹出地址存入eip(00401093)

10 esp+8;恢复main函数栈帧mov eax:存入main函数栈帧中

