stack - fastcall:堆栈会发生什么?

标签 stack 64-bit parameter-passing fastcall

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

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

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

有人可以解释我实际发生了什么吗?

谢谢你。

最佳答案

关键在于链接的 MSDN 中的这句话:

The x64 Application Binary Interface (ABI) is a 4 register fast-call calling convention, with stack-backing for those registers.



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

关于stack - fastcall:堆栈会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21991961/

相关文章:

arrays - Excel:将数组传递给用户定义函数 (VBA)

python - 传递变量以供模块导入和使用

c - C 中的简单堆栈损坏

.net - 如何在64位.NET应用程序中显示SVG文件?

c - cortex-m0 上 ISR 的终止函数

c++ - 64 位地址

c - 类型提升/转换

r - 使用运行时生成的省略号参数(点-点-点/三个点)调用 R 函数

c++ - 基于栈的虚拟机函数调用/返回实现问题

rust - 堆栈如何以与创建时不同的顺序处理弹出值?