堆栈平衡(子程序调用)

堆栈平衡就是在调用子程序的时候, 为了让子程序执行前后 esp(栈顶指针寄存器)  ebp (存取堆栈指针) 的数据一样(恢复子程序执行前的状态),保证持续正确运行

push 也就是保护现场(当前栈指向位置), pop 恢复现场


..

/*源代码.cpp*/

int  a(int aa,int v1)
{

		return 5;
}

int main()
{
	int x = 5;
	int t=a(5, 4);

	return 0;
}



/*    debug 反汇编         */

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------
int main()
{
00213AB0  push        ebp  
00213AB1  mov         ebp,esp  
00213AB3  sub         esp,0D8h  
00213AB9  push        ebx  
00213ABA  push        esi  
00213ABB  push        edi  
00213ABC  lea         edi,[ebp-0D8h]  
00213AC2  mov         ecx,36h  
00213AC7  mov         eax,0CCCCCCCCh  
00213ACC  rep stos    dword ptr es:[edi]  
	int x = 5;
00213ACE  mov         dword ptr [x],5  
	int t=a(5, 4);
00213AD5  push        4 /*第二参数入栈*/
00213AD7  push        5  /*第一参数入栈*/
00213AD9  call        a (021142Eh)   /*调用a*/
00213ADE  add         esp,8  /*  esp 恢复正确位置,参数占用8字节,  为__cdecl 调用 (调用者 堆栈平衡) */
00213AE1  mov         dword ptr [t],eax  /*函数返回值位于eax寄存器内*/

	return 0;
00213AE4  xor         eax,eax  /*清空eax*/
}

00213AE6  pop         edi  
00213AE7  pop         esi  
00213AE8  pop         ebx  
00213AE9  add         esp,0D8h  
00213AEF  cmp         ebp,esp  
00213AF1  call        __RTC_CheckEsp (02112DFh)  
00213AF6  mov         esp,ebp  
00213AF8  pop         ebp  
00213AF9  ret








/*函数a内 反汇编*/

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------
#include "iostream"
using namespace std;

int  a(int aa,int v1)
{
013241A0  push        ebp  /*保护缺点ebp 状态*/
013241A1  mov         ebp,esp  /*ebp指向栈顶(esp 指向 变量aa )*/
013241A3  sub         esp,0C0h  /*预留 192 字节空间*/
013241A9  push        ebx  
013241AA  push        esi  
013241AB  push        edi  
013241AC  lea         edi,[ebp-0C0h]  
013241B2  mov         ecx,30h  
013241B7  mov         eax,0CCCCCCCCh  
013241BC  rep stos    dword ptr es:[edi]  

		return 5;
013241BE  mov         eax,5  /*返回值保存eax寄存器中*/
}
013241C3  pop         edi  
013241C4  pop         esi  
013241C5  pop         ebx  
013241C6  mov         esp,ebp  /恢复现场  恢复函数a执行前的 栈顶 (esp)*/
013241C8  pop         ebp  
013241C9  ret


转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/467071

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值