描述函数栈帧的调用过程

来源:互联网 发布:特朗普的对华政策 知乎 编辑:程序博客网 时间:2024/06/16 04:18

这次我们通过例子来研究调用过程:

int sum(int a,int b){   int temp = 0;   temp = a+b;   return temp;}int main(){   int a = 10;   int b = 20;   int ret = sum(a,b);   return 0;}

CPU含有两个寄存器:eax,edx
返回值字节:
1. <=4 用eax返回
2. 4-8 用eax和edx返回
3. >8 用临时量返回
1、我们先运行主函数,那么就有主函数的栈:

函数栈的变化
main函数的栈开辟出来为黑色区域,设定栈底指针ebp指向0x100
①在栈底压栈a,压栈b。
②在调用sum时需要在栈顶压栈sum的形参,压栈从右向左压栈。
③压完形参后需要记录现在运行到哪一步指令的信息,于是在栈底压入call下一行指令的地址。
2、这时就进入了sum函数的栈红色区域:
①在进入时需要保存调用sum函数的函数地址在,于是将main函数的ebp压栈,即sum函数的栈底保存0x100。
②这时要给sum栈开辟大小,调整esp和ebp的位置,将ebp指向sum函数的栈底。
③将esp减去4ch,表示开出4ch大小的函数空间。
④将开出的空间初始化,变为0xcccccccc。
①②③④是sum函数中的: {
⑤现在可以运行sum函数的代码,将temp压栈,并将其赋值为0.
⑥要运算 temp = a + b;需要将a的形参值放到寄存器eax中,ebp+8就指向形参a。
⑦ebp+12指向形参b,将形参b带去eax中然后让a和b相加。4
⑧将加的值通过eax带出给temp。
⑨运行return temp,由于temp为四字节,所以通过eax返回,所以讲temp的值放入寄存器eax中,然后返回。
⑤⑥⑦⑧⑨为sum中的代码时的步骤
sum return之后:
⑩释放掉sum函数的内存,即移动ebp和esp,让ebp = esp。
1.这时要回到main函数中,于是pop ebp,找到主函数的地址,回到了主函数,继续pop ebp找到下一行指令地址,将下一行指令地址存到寄存器中。
2.回到了int ret = sum(a,b);中,将返回值eax复制给ret,雨水栈帧结束。

原创粉丝点击