我发现有很多关于这个“影子空间”的话题,但是在它们中没有找到答案,所以我的问题是:
在进入一个过程之前,我需要减去多少字节的堆栈指针?
在减去“影子空间”之前,我应该将过程参数推送到堆栈中吗?
我已经反汇编了我的代码,但是我找不到逻辑。
我发现有很多关于这个“影子空间”的话题,但是在它们中没有找到答案,所以我的问题是:
在进入一个过程之前,我需要减去多少字节的堆栈指针?
在减去“影子空间”之前,我应该将过程参数推送到堆栈中吗?
我已经反汇编了我的代码,但是我找不到逻辑。
call
指令之前,调用者必须为其被调用者的影子空间保留空间。printf
的开始可以将4个整数参数寄存器转储到影子空间中,而不需要找出哪些参数是“double”。或者它可以直接使用xmm0
中的内容。这种做法非常令人恼火,看起来过于追求简单而牺牲了性能。 :/ - Peter Cordes阴影空间是必须预留给被调用过程的32个字节(4x8字节)的空间。这意味着在调用之前你必须在栈上提供32个字节的空间。该空间可以不初始化,没有关系。
需要注意的是,在x64调用约定中,第四个参数后的参数都被推送到栈上,它们在这个阴影空间的顶部(在32字节之前被推入栈中)。
简而言之,你可以将其看作是在x64函数中具有至少4个参数,但前4个的值在寄存器中。
在调用x64时还应考虑堆栈对齐等问题。