函数调用栈

例如:

int sum(int a,int b)

{

push ebp

mov ebp,esp

sub esp,4ch

int  tmp=0;

mov dword ptr[ebp -4],0

tmp=a+b;

mov eax ,dword ptr[ebp +8] ;

add eax,dword ptr[ebp+OCH],mov dword ptr[ebp-4],eax;


  return tmp;

mov eax,dword ptr[ebp-4]


}

mov esp,ebp

pop ebp

int main()

{

int x =10;

mov dword ptr[ebp -4],0Ah

int y=20;

mov dword ptr[ebp -8] ,14h

int ret =sum(x,y);

mov eax,dword ptr[ebp-8]

push ecx;

call sum

add esp+8

mov dword ptr[ebp OCh],eax;


printf("ret=%d\n");

return 0;

}



如图:首先找到调用main函数的函数栈的底地址,移动ebp把变量一次压入栈,被调用的函数的变量都是从右向左压栈,存放下一行指令是为了回到主函数后没有必要从头开始执行,将esp 赋给ebp 开辟栈帧,存放main函数的栈底地址,作为新栈帧的底地址,进入tmp函数寻找a b地址时ebp+8,ebp+10;将结果保存到eax寄存器中;函数指针的回退出栈,到2 时 ebp回到了main 栈帧底部,eps执行到下一行指令时,执行到ret函数释放啊,a b,将eax值赋值给ret 



如果返回值<4字节   用eax

                    >4且< 8用eax edx 

                   >8 时 就会产生一个临时量:



这个临时量是在调用函数之前就确定了,在压栈时候在main函数栈帧中开辟临时量空间,还有在下一行指令下面压如临时量的地址,在执行完tmp时候,返回值将会赋值给临时量,通过临时量传给ret 其余都和函数返回值小于四字节的一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值