X64 Fastcall 叶函数是否需要保留 RCX?

jww*_*jww 2 assembly x86-64 masm cpu-registers calling-convention

我有一个用 MASM64/ML64 组装的 X64 ASM 例程。它是一个独立的叶函数,而不是内联汇编。它用于 Visual Studio 解决方案中的 C/C++ 程序。

我在 MSDN 上找到了两篇关于保存寄存器的参考资料:

第一个是内联汇编,但它特别指出在使用__fastcall. 它似乎也缺乏对 X64 的处理,因为它引用 32 位寄存器。

第二个告诉我们“RAX、RCX、RDX、R8、R9、R10、R11 被认为是易失性的,必须在函数调用时被认为是销毁的”。不幸的是,它没有明确说明是否需要保留它们。(如果你仔细观察,你会发现它使用的是误导,而不是说明要采取的行动)。

我认为第二篇文章在这种情况下是控制性的,但我想澄清以避免混淆......是否需要为 X64 Fastcall Leaf Functions 保留 CX/ECX/RCX?

Mic*_*urr 6

“在内联汇编中使用和保留寄存器”一文仅讨论 x86,不适用于 x86-64。

“调用者/被调用者保存的寄存器”一文是关于 x86-64 调用约定的,并明确指出 RCX 寄存器是易失性的,因此不需要由被调用者保存。

@rkhb 的评论提到“x64 调用约定概述”文章是混乱的根源,大概是因为它说:

x64 仅使用__fastcall调用约定和基于 RISC 的异常处理模型

但是,如果您点击__fastcall该引用中的链接,您会看到它显示“此调用约定 [ __fastcall] 仅适用于 x86 架构”。__fastcall我认为概述文章的真正意思是“x64 使用类似于寄存器传递参数的调用约定”。