【问题标题】:Incrementing %esp and CDECL递增 %esp 和 CDECL
【发布时间】:2014-08-30 13:41:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你觉得“清晰”的记忆是什么感觉?你如何“漂浮”在记忆中?
  • Ehm,'clear' 我想我的意思是用于返回到它们在被设置为刚刚弹出的堆栈帧中的其他值之前保持的默认值的字节 - 如果这样甚至存在默认值。 'float' 我的意思是让这些字节保持弹出帧中设置的值。
  • 对不起,如果我没有多大意义,我仍在试图弄清楚堆栈的工作原理以及它与堆的不同之处。我只是很困惑是否必须像在 C 中释放已分配结构的方式一样释放堆栈——首先是每个元素,然后是整个结构;或者操作系统是否为您做到了;或者您是否根本不需要释放它。

标签: assembly x86 cdecl stack-pointer


【解决方案1】:

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

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

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

数据仍然存在于内存中,但会在下次将数据压入堆栈时被覆盖。

【讨论】:

  • 非常感谢!如果数据永远不会被覆盖,它可以被访问吗?
  • 是的,完全正确。虽然可能不是推荐的活动。
猜你喜欢
  • 2023-03-21
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多