fastcall:堆栈会发生什么?

我目前正在学习x64程序集,并且无法从c ++调用汇编程序时了解堆栈发生了什么。

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

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

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

谢谢。


关键在于来自链接MSDN的这个短语:

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

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

链接地址: http://www.djcxy.com/p/19143.html

上一篇: fastcall: What happens with the stack?

下一篇: Ignore create/change of model for a SQL View using Entity Framework