堆栈平衡

参考资料:

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)

通过函数内部的pushpop操作抵消堆栈变化,无需显式清理参数。

确保函数内部压入和弹出操作数量一致

示例:

myFunction:
  push ebp        ; 保存基址
  mov ebp, esp
  push esi        ; 局部变量操作
  pop esi
  pop ebp         ; 恢复基址
  ret             ; 堆栈已平衡
posted @ 2025-03-21 10:19  漫宿骄盛  阅读(124)  评论(0)    收藏  举报