函数 returns 后 esp 的值是多少?

What is the value of esp after a function returns?

在 C / x86 中,当 return 从函数中调用时,我们通常:

  1. pop ebp恢复上一个函数的帧指针
  2. ret 其中(据我了解)包含隐式 pop eip 以便调用函数可以从 return 地址继续执行

此时,我期望 esp 包含什么?它会是指向 return 地址正上方的任何内容的指针,还是 esp 的值也被 ret 隐式更改?

谢谢:)

ret 之后,如果中间没有发生恶作剧,esp 应该包含与相应 call 之前相同的值。 call 指令将 return 值压入堆栈,ret 指令将其弹出。所以是的,你的直觉是正确的。

在 ret 之后,sp 应该与调用函数时的位置相同。

所以它会指向最后被压入堆栈的内容。

Will it be a pointer to whatever was directly above the return address, or is the value of esp also implicitly changed by ret ?

ret有两种形式:retret N。第一种形式简单地从堆栈中弹出 eip(这通常意味着 "take eip and add esp,4")并继续执行,因此 esp 指向调用函数时压入的最后一个参数 - 这意味着调用者必须通过后续 add esp, N.

ret N 表示弹出 eip 后,esp 在同一条指令中加上值 N,因此调用者不需要这样做。缺点是你不能使用可变数量的参数,因为 'N' 只能是常量值。