x64 程序集中的'shadow space'是什么?



我找到了有关此阴影空间的很多主题,但是我找不到答案,所以我的问题是:

进入过程之前,我需要从堆栈指针中减去多少字节?

,我应该在减去"影子空间"之前将过程参数推到堆栈中?

我已经分解了我的代码,但是找不到逻辑。

在所谓的函数拥有的返回地址(并且可以用作刮擦空间),如果有的话,stack arg下方是stack arg。在运行call指令之前,呼叫者必须为其Callee的阴影空间保留空间。

它是用来使调试X64更轻松的。

回想一下前4个参数是在寄存器中传递的。如果您闯入调试器并检查呼叫堆栈是否有线程,则将无法看到传递给函数的任何参数。存储在寄存器中的值是瞬态的,在呼叫堆栈上移动时不能重建。

这是 Home Space 发挥作用的地方:编译器可以使用它在堆栈上保留寄存器值的副本,以便以后在调试器中进行检查。这通常发生在不优化的构建中。但是,当启用优化时,编译器通常将 Home Space 视为可用于划痕的使用。堆栈上没有任何副本,然后调试撞车事故变成一场噩梦。

调试优化X64代码的挑战提供有关此问题的深入信息。

阴影空间是强制性的32个字节(4x8字节),您必须保留所谓的过程。这只是意味着您必须在打电话之前在堆栈上提供32个字节。这个空间可以非直接化,没关系。

请注意,在X64呼叫惯例中,将第4个之后的参数推到堆栈上,该堆栈位于此阴影空间的顶部(在32个字节之前推了)。

简而言之,您可以将其视为X64中的功能至少有4个参数,但具有4个第一个值的值。

调用x64时也应考虑堆栈对齐等

相关内容

  • 没有找到相关文章

最新更新