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