在 Linux(或 OS X)中进行函数调用时,被调用者可以修改堆栈上参数的值吗?我的假设是,由于调用者是清理它们的人,因此它们在函数调用后应该包含相同的值。但是我发现带有 -O2 的 GCC 正在修改在堆栈上传递给它的参数。我还查找了包括 System V i386 调用约定在内的文档,但找不到确定的回答这个问题。
这是我正在调试的一些示例代码。
pushl %eax # %eax = 0x28
call _print_any
popl %eax
# %eax is now 0x0a
我认为 GCC 修改堆栈上的参数是可以的,但我想知道它是在哪里指定的can do so.
尽管调用者(在某些调用约定中)是清理参数的人,但它真正所做的只是解除空间分配先前在堆栈上分配用于保存参数值。被调用者可以在函数执行期间自由修改这些值,因为调用者稍后不会查看它们的值。
在您发布的示例中,GCC 已发出popl %eax
指令释放堆栈上参数占用的空间。它真正需要做的就是将 4 添加到 %esp(x86 上的堆栈增长向下在内存中),并执行popl %eax
指令是做到这一点的最短、最快的方法。如果编译器需要释放 20 个值,它可能会直接修改 %esp 而不是发出 20 个值popl
指示。
您可能会发现以下代码中没有使用 %eax 的新值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)