参考资料:
https://blog.csdn.net/boildoctor/article/details/121181152
https://www.52pojie.cn/thread-1451831-1-1.html
1.介绍
堆栈平衡指在函数调用过程中,通过调整堆栈指针(ESP)或基址指针(EBP),使函数执行完毕后堆栈恢复到调用前的状态。
函数调用时:会push
参数入栈(给函数传参),使ESP减4*n
函数返回时:会清除栈上的参数,使得ESP复原,ESP加4*n
目的:为了防止栈溢出,或者CPU访问错误的地址
2. 方式:
1. 外平栈(Caller Cleanup)
由调用者在函数返回后清理参数空间。
通过add esp xx
实现
示例:
asm
push param3 ; 参数入栈
push param2
push param1
call myFunction
add esp, 12 ; 调用者清理12字节参数空间
2.内平栈(Callee Cleanup)
由被调用函数在返回时清理参数空间。
被调用函数通过 ret xx
指令(xx为参数总字节数)同时返回并清理堆栈。
示例:
myFunction:; 函数逻辑ret 12 ; 返回并清理12字节参数空间
3. 平衡堆栈(Self-Balancing)
通过函数内部的push
和pop
操作抵消堆栈变化,无需显式清理参数。
确保函数内部压入和弹出操作数量一致
示例:
myFunction:push ebp ; 保存基址mov ebp, esppush esi ; 局部变量操作pop esipop ebp ; 恢复基址ret ; 堆栈已平衡