什么是影子空间'在x64汇编中?

时间:2015-05-12 11:55:22

标签: c++ assembly 64-bit low-level

我发现了很多关于这个影子空间的话题,但是我找不到答案,所以我的问题是:

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

在减去"阴影空间&#34之前,我应该将过程参数推送到堆栈吗?

我已经拆解了我的代码,但我无法找到逻辑。

2 个答案:

答案 0 :(得分:22)

阴影空间(有时也称为溢出空间 Home space )旨在用于简化调试x64。< / p>

回想一下first 4 parameters are passed in registers。如果您进入调试器并检查线程的调用堆栈,您将无法看到传递给函数的任何参数。存储在寄存器中的值是瞬态的,并且在向上移动调用堆栈时无法重建。

这就是 Home space 发挥作用的地方:编译器可以使用它将寄存器值的副本留在堆栈上,以便以后在调试器中进行检查。这通常发生在未经优化的构建中。但是,在启用优化时,编译器通常将 Home space 视为可用于临时使用。没有副本留在堆栈上,调试崩溃转储变成了一场噩梦。

Challenges of Debugging Optimized x64 Code提供有关此问题的深入信息。

答案 1 :(得分:6)

影子空间是必须为被调用过程保留的必需32字节(4x8字节)。它只是意味着在调用之前必须在堆栈上提供32个字节。这个空间可以保持未初始化,这并不重要。

请注意,在x64调用约定中,第4个之后的参数被压入堆栈,这些参数位于此阴影空间的顶部(在32个字节之前推送)。

简而言之,你可以看到它就像x64中的函数至少有4个参数一样,但是寄存器中的第一个值是4。

调用x64时也应考虑堆栈对齐之类的事情。