fastcall:堆栈会发生什么?

时间:2014-02-24 15:29:49

标签: stack 64-bit parameter-passing fastcall

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

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

我只是不明白为什么我必须从rsp [rsp + 28h]访问第5个参数40个字节而不是8个,因为在寄存器中访问前32个字节。

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

谢谢。

1 个答案:

答案 0 :(得分:3)

密钥来自链接的MSDN:

  

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

也就是说,寄存器加载了前4个参数,但是它们在堆栈中保留了空间。正如@HansPassant在下面的注释中所述,调用者不会写入此 shadow 空间,但是如果需要保存寄存器(例如调用其他函数),则调用者可以使用它。