在 C/x86 中,当从函数返回时,我们通常:
pop ebp
恢复前一个函数的帧指针 ret
其中(据我所知)包含一个隐式 pop eip
以便调用函数可以从返回地址 在这一点上,我可以期望 esp 包含什么?它是指向返回地址正上方的任何内容的指针,还是 esp 的值也被
ret
隐式更改?谢谢 :)
最佳答案
ret
有两种形式:只是 ret
和 ret N
。第一种形式简单地从堆栈中弹出 eip(通常意味着“获取 eip 并添加 esp,4”)并继续执行,因此 esp 指向调用函数时推送的最后一个参数 - 这意味着调用者必须通过随后的 add esp, N
。ret N
意味着在弹出 eip 后,esp 在同一条指令中添加了值 N,因此调用者不需要这样做。缺点是不能使用可变数量的 args,因为 'N' 只能是常量值。
关于c - 函数返回后 esp 的值是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38038715/