c - 函数返回后esp的值是多少?

标签 c assembly x86 nasm

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

  1. pop ebp 恢复上一个函数的帧指针
  2. 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 有两种形式:retret N。第一种形式简单地从堆栈中弹出 eip(这通常意味着“获取 eip 并添加 esp,4”)并继续执行,因此 esp 指向调用函数时压入的最后一个参数 - 这意味着调用者必须通过随后 添加 esp, N

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

关于c - 函数返回后esp的值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038715/

相关文章:

android - 如何为Android编译并运行简单的C代码?

c++ - 全阵列替代

c++ - mov + mfence在NUMA上安全吗?

c++ - 汇编代码中的数字非常大,但在 C++ 中无效

c - 减少C中链表遍历时的迭代次数

c - 如何通过用 C 编写的 cgi-bin 程序检索表单 "POST"数据

当队列中没有连接时,C 套接字 accept() 失败

assembly - x86 代表前缀,计数为零 : what happens?

assembly - x86-64 将 long 转换为 double

performance - 在循环中插入 nop 以及在 movnti 商店附近阅读时意外减速