x64调用约定中前4个参数的阴影空间的用法是什么

时间:2014-11-16 16:41:01

标签: assembly 64-bit calling-convention

根据http://msdn.microsoft.com/en-us/us-en/library/ms235286.aspxhttp://msdn.microsoft.com/en-us/us-en/library/ew5tede7.aspx 调用者必须始终为4个寄存器参数分配足够的空间,即使被调用者没有那么多参数也是如此。始终为寄存器参数分配空间,即使参数本身从不归位到堆栈。

这个影子空间对4个寄存器参数的用法是什么?

我反汇编了由VS和G ++编译的一些程序,发现被调用者在开始时将寄存器参数保存在阴影空间中。例如,WinMain(HINSTANCE * hInstance,HINSTANCE * hPrevInstance,char * lpCmdLine,int nCmdShow)函数在其开头执行以下操作:

mov     [rsp+arg_18], r9d
mov     [rsp+arg_10], r8
mov     [rsp+arg_8], rdx
mov     [rsp+arg_0], rcx

为什么被调用者将寄存器参数保存在阴影空间中?如果被调用者必须将寄存器参数保存在堆栈中,为什么他们使用寄存器来传递参数而不是直接通过堆栈传递所有参数?

1 个答案:

答案 0 :(得分:0)

被叫方可能需要也可能不需要保存它们,这完全取决于具体情况。例如,只返回参数总和的函数可能不需要保存它们。在这种情况下,使用寄存器可以节省存储和负载,而在其他情况下不会产生任何开销(存储只是从调用者移动到被调用者)。

如果与调用者中的局部变量一起使用,则分配阴影空间几乎是免费的,并且具有如下优点:如果被调用者需要保存参数,则生成的块将与其余参数连续在堆栈上。