Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我目前正在自己学习 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 在下面的评论中指出的那样,调用者不会写入这个影子空间,但如果它需要保存寄存器(例如调用另一个函数),它可供被调用者使用。