是否需要为X64 Fastcall Leaf功能保留RCX?

时间:2015-10-16 21:08:51

标签: visual-studio assembly masm cpu-registers

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

我在MSDN上找到两个关于保留寄存器的引用:

第一个用于内联汇编,但它明确指出在使用__fastcall时保留ECX。它似乎缺乏对X64的处理,因为它指的是32位寄存器。

第二个告诉我们“RAX,RCX,RDX,R8,R9,R10,R11被视为易失性,必须考虑在函数调用中被销毁”。不幸的是,它明确表明是否需要保留它们。 (如果你仔细观察,它使用误导而不是陈述要采取的行动)。

我认为第二篇文章是在这种情况下进行控制,但我希望能够避免混淆...是否需要为X64 Fastcall Leaf函数保留CX / ECX / RCX?

1 个答案:

答案 0 :(得分:3)

"Using and Preserving Registers in Inline Assembly"文章仅讨论x86,不适用于x86-64。

"Caller/Callee Saved Registers"文章是关于x86-64调用约定的,并明确指出RCX寄存器是易失性的,因此不需要被调用者保存。

@rkhb的评论提到"Overview of x64 Calling Conventions"文章是混淆的根源,大概是因为它说:

  

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

但是,如果您按照该引文中的__fastcall链接进行操作,那么您会看到它,"此调用约定[core.clj]仅适用于x86架构&# 34 ;.我认为概述文章的确意味着说," x64使用类似于__fastcall的调用约定,其中寄存器用于传递参数"。