我目前正在学习x64汇编,并且无法理解从c ++调用汇编过程时堆栈发生的情况。
根据我目前对MSDN和Intel的理解,前4个整数/浮点参数存储在rcx / xmm0,rdx / xmm1,r8 / xmm2和r9 / xmm3寄存器中,所有其他人将被放在堆栈上。
我只是不明白为什么我必须从rsp [rsp + 28h]访问第5个参数40个字节而不是8个,因为在寄存器中访问前32个字节。
有人能解释一下我究竟发生了什么吗?
谢谢。
答案 0 :(得分:3)
密钥来自链接的MSDN:
x64应用程序二进制接口(ABI)是一种4寄存器快速调用约定,支持这些寄存器的堆栈。
也就是说,寄存器加载了前4个参数,但是它们在堆栈中保留了空间。正如@HansPassant在下面的注释中所述,调用者不会写入此 shadow 空间,但是如果需要保存寄存器(例如调用其他函数),则调用者可以使用它。