堆栈平衡就是在调用子程序的时候, 为了让子程序执行前后 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