Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio X64快速调用叶函数是否需要保留RCX?_Visual Studio_Assembly_Masm_Cpu Registers - Fatal编程技术网

Visual studio X64快速调用叶函数是否需要保留RCX?

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被认为是易失性的,在函数调用时必须被视为已销毁”。不幸的是,它并没有明确说明是否需要保留

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

我在MSDN上找到了两个关于保留寄存器的参考:

第一个是用于内联汇编,但它特别声明在使用
\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上的控制文档时遇到问题。(我找到了一些文件,但我不清楚哪一个文件在本案中发挥了最大的控制作用。)大概就是这样。谢谢你的澄清。