在 C/x86 中,当从函数返回时,我们通常:

  • pop ebp 恢复前一个函数的帧指针
  • ret 其中(据我所知)包含一个隐式 pop eip 以便调用函数可以从返回地址
  • 继续执行

    在这一点上,我可以期望 esp 包含什么?它是指向返回地址正上方的任何内容的指针,还是 esp 的值也被 ret 隐式更改?

    谢谢 :)

    最佳答案


    ret 有两种形式:只是 retret 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/

    10-11 22:49