7

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

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

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

有人可以解释一下实际发生的事情吗?

谢谢你。

4

1 回答 1

3

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

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

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

于 2014-02-24T15:36:58.200 回答