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