【发布时间】:2016-01-15 17:50:51
【问题描述】:
我有一个用 MASM64/ML64 组装的 X64 ASM 例程。它是一个独立的叶函数,不是内联汇编。它用于 Visual Studio 解决方案中的 C/C++ 程序。
我在 MSDN 上找到了两个关于保留寄存器的参考资料:
第一个用于内联汇编,但它特别声明在使用__fastcall 时保留ECX。它似乎也缺少对 X64 的处理,因为它指的是 32 位寄存器。
第二个告诉我们“RAX、RCX、RDX、R8、R9、R10、R11 被认为是易失的,必须在函数调用时被认为是销毁”。不幸的是,它没有明确说明它们是否需要保存。 (如果你仔细观察,它使用了误导而不是说明要采取的行动)。
我认为第二篇文章是控制这种情况,但我想清楚以避免混淆......是否需要为X64 Fastcall Leaf Functions保留CX/ECX/RCX?
【问题讨论】:
-
不,不需要保留。见here。
-
Visual Studio 64 位不支持内联汇编。
-
@rkhb OP 说 这不是内联汇编 :)
-
为什么要担心 x86-64 中的
_fastcall?默认调用约定在寄存器中传递参数。 -
我以为 x86-64 只有一个调用约定。
标签: assembly x86-64 masm cpu-registers calling-convention