ESP 定律原理知道吗
ESP 定律的原理
ESP 定律的核心思想是:在正常的函数调用和返回过程中,栈指针(ESP 在 32 位系统,RSP 在 64 位系统)在进入函数时和离开函数时是相等的
或者更准确地说,call
指令在将返回地址压入栈后,会将 ESP 减小。当函数返回(通过 ret
指令)时,ret
指令会弹出返回地址,并自动调整 ESP,使其回到 call
指令执行之前的状态
ESP 定律的两个核心结论:
- 在函数内部,只要没有发生新的函数调用或异常,
push
和pop
指令的操作是对称的。也就是说,每一个push
都有一个对应的pop
,所以 ESP 的最终变化是零 - 在函数返回时,
ret
指令会正确地将控制权返回给调用方,其前提是函数执行完毕时 ESP 寄存器的值正好指向call
指令压入的返回地址
如果一个函数在返回时,ESP 的值不是返回地址,那么 ret
指令会从一个错误的位置取地址,导致程序崩溃或跳转到不可预知的地址