【问题标题】:Does RCX need be be preserved for X64 Fastcall Leaf Functions?是否需要为 X64 Fastcall 叶函数保留 RCX?
【发布时间】: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


【解决方案1】:

"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 链接,您会看到它说:“此调用约定 [__fastcall] 仅适用于 x86 架构”。我认为概述文章的真正意思是说“x64 使用类似于__fastcall 的调用约定,其中寄存器用于传递参数”。

【讨论】:

  • 好的,谢谢。对不起这个问题。我在访问 MSDN 上的链接和查找 控制文档时遇到了麻烦。 (我找到了几份文件,但我不清楚在这种情况下哪一份文件的控制权最大)。
  • 大概 = 完全正确。谢谢你的澄清。
  • 既然 x64 vectorcall 存在,MS 在其官方文档中确实使用名称“fastcall”来描述其原始 x64 调用约定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2012-10-19
相关资源
最近更新 更多