函数调用过程详解
源代码
#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
![](https://i-blog.csdnimg.cn/blog_migrate/55c21bb41dcbe8261c93de9b6b014113.png)
8 pop ebp出栈 main函数栈底送入ebp中
![](https://i-blog.csdnimg.cn/blog_migrate/6622686a09226f83ff488d8be80d4488.png)
![](https://i-blog.csdnimg.cn/blog_migrate/377812e8d84d27e0d19e330be2603c9a.png)
9 ret指令:当前栈顶返回值地址出栈,将弹出地址存入eip(00401093)
![](https://i-blog.csdnimg.cn/blog_migrate/294f9c1d06d3d826334eb1634471f4a8.png)
10
esp+8;恢复main函数栈帧mov eax:存入main函数栈帧中
![](https://i-blog.csdnimg.cn/blog_migrate/96a345e8d0de7c9fed02b78a164449bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1ff68c5d19645a6055ac75d0d944995a.png)