gpt4 book ai didi

assembly - 是否需要为 X64 快速调用叶函数保留 RCX?

转载 作者:行者123 更新时间:2023-12-02 17:31:06 24 4
gpt4 key购买 nike

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

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

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

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

我认为第二篇文章在这种情况下是控制性的,但我想清楚一点以避免混淆......是否需要为 X64 快速调用叶函数保留 CX/ECX/RCX?

最佳答案

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

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

@rkhb 的评论提到 "Overview of x64 Calling Conventions" article 是困惑的根源,大概是因为它说:

x64 just uses the __fastcall calling convention and a RISC-based exception-handling model

但是,如果您遵循 __fastcall在该引用中链接,您会看到它说,“This calling convention [__fastcall] only applies to the x86 architecture”。我认为概述文章的真正意思是说“x64 使用类似于 __fastcall 的调用约定,其中寄存器用于传递参数”。

关于assembly - 是否需要为 X64 快速调用叶函数保留 RCX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com