1

我一直在阅读 x86 堆栈和 CDECL 约定,并阅读了一些让我感到困惑的东西。

列出的调用者的职责包括弹出参数、使用它们或简单地增加 %esp 以删除它们。

最后一部分是如何工作的?

例如,假设 %esp 的初始值为 0x105000,并且您将当前堆栈帧的值减少 $0x1c。您分配了一些数据,然后将其递增回来 - 在这种情况下,这些数据不会仍然在内存中浮动吗?内存是怎么清除的?访问 0x104FF4 会导致分段错误,如果是,是什么清除了那里的数据?

4

1 回答 1

4

POP 只是将数据移动到寄存器并调整堆栈指针。它不会删除数据或有任何其他副作用。

因此,如果您不需要将数据移回寄存器,则只需使用 ADD 调整堆栈指针即可。您可以将堆栈指针返回到您想要的位置,而无需使用 POP 指令破坏寄存器。

它也可能更有效。您将只需要一条 ADD 指令,而不是一系列可能会更慢或导致代码更大的 POP。

数据确实仍然存在于内存中,但会在您下次将数据推送到堆栈时被覆盖。

于 2014-07-09T13:47:17.250 回答