fastcall:堆栈会发生什么?

Del*_*vid 7 64-bit stack parameter-passing fastcall

我目前正在学习x64汇编,并且在从c ++调用汇编过程时无法理解堆栈发生的情况.

根据我目前从MSDNIntel的理解,前4个整数/浮点参数存储在rcx/xmm0,rdx/xmm1,r8/xmm2和r9/xmm3寄存器中,其他所有参数都将放在堆栈中.

我不理解为什么我有由于前32个字节在寄存器访问,以访问该第五参数从RSP [RSP + 28H] 40个字节,而不是仅仅8.

有人能解释我究竟发生了什么吗?

谢谢.

rod*_*igo 3

关键在于链接的 MSDN 中的这句话:

x64 应用程序二进制接口 (ABI) 是 4 寄存器快速调用调用约定,并为这些寄存器提供堆栈支持

也就是说,寄存器加载了前 4 个参数,但它们仍然在堆栈中保留了空间。正如 @HansPassant 在下面的注释中指出的那样,调用者不会写入此影子空间,但如果被调用者需要保存寄存器(例如用于调用另一个函数),则可以使用它。