Visual studio X64快速调用叶函数是否需要保留RCX?
我有一个用MASM64/ML64组装的X64 ASM例程。它是一个独立的叶函数,不是内联程序集。它在Visual Studio解决方案中的C/C++程序中使用 我在MSDN上找到了两个关于保留寄存器的参考:Visual studio X64快速调用叶函数是否需要保留RCX?,visual-studio,assembly,masm,cpu-registers,Visual Studio,Assembly,Masm,Cpu Registers,我有一个用MASM64/ML64组装的X64 ASM例程。它是一个独立的叶函数,不是内联程序集。它在Visual Studio解决方案中的C/C++程序中使用 我在MSDN上找到了两个关于保留寄存器的参考: 第一个是用于内联汇编,但它特别声明在使用\uu fastcall时保留ECX。它似乎也缺少对X64的处理,因为它引用32位寄存器 第二条告诉我们“RAX、RCX、RDX、R8、R9、R10、R11被认为是易失性的,在函数调用时必须被视为已销毁”。不幸的是,它并没有明确说明是否需要保留
\uu fastcall
时保留ECX。它似乎也缺少对X64的处理,因为它引用32位寄存器
第二条告诉我们“RAX、RCX、RDX、R8、R9、R10、R11被认为是易失性的,在函数调用时必须被视为已销毁”。不幸的是,它并没有明确说明是否需要保留它们。(如果你仔细观察,它使用了误导,而不是说明要采取的行动)
我认为第二篇文章在这种情况下是控制性的,但我想澄清一下,以避免混淆。。。X64快速调用叶函数是否需要保留CX/ECX/RCX?本文仅讨论x86,不适用于x86-64
这篇文章是关于x86-64调用约定的,并明确指出RCX寄存器是易失性的,因此不需要被调用方保存
@rkhb的评论提到,这篇文章是混乱的根源,大概是因为它说:
x64只使用调用约定和基于RISC的异常处理模型
但是,如果您遵循该引用中的链接,您会看到它说,“这种调用约定[
\uu fastcall
]仅适用于x86体系结构”。我认为这篇概述文章的真正意思是说,“x64使用类似于\uu fastcall
的调用约定,其中寄存器用于传递参数”。不,不需要保留它。请参阅。Visual Studio 64位不支持内联程序集。@rkhb OP说它不是内联程序集:)为什么要担心x86-64中的\u fastcall
?默认的调用约定在寄存器中传递参数。我认为x86-64只有一个调用约定。好的,谢谢。对不起,这个问题。我在跟踪链接和查找MSDN上的控制文档时遇到问题。(我找到了一些文件,但我不清楚哪一个文件在本案中发挥了最大的控制作用。)大概就是这样。谢谢你的澄清。