将内联汇编 x87 fsqrt 函数从 C++ 转换为适用于 x86-64 的 C

Converting an inline-asm x87 fsqrt function from C++ to C for x86-64

我正在寻找不同的方法来计算平方根,特别是一个(来自 here 的 sqrt14)引起了我的注意,不幸的是它是用 C++ 编写的(它只使用汇编),它很难我把它翻译回 C - 如果可能的话。

double inline __declspec (naked) __fastcall sqrt14(double n)
{
    _asm fld qword ptr [esp+4]
    _asm fsqrt
    _asm ret 8
} 

可以看出here,在C++中插入汇编与C不同

我想问你是否有可能有一个 C 等价物,如果有,我可以请你写吗?如果有用,我的架构是64位的。

我怀疑函数声明会像这样:

double inline __attribute__((fastcall, naked)) sqrt14(double n);

...但我对汇编的了解还不够多,无法完成剩下的...

您引用的示例非常特定于一个编译器...

  • __declspec (naked) 是特定于实现的功能(非标准)
  • __fastcall 是特定于实现的功能(非标准)

即使在您修改后的示例中:

  • __attribute__((fastcall, naked)) 是特定于实现的功能(非标准)

即使包含汇编器也是一个特定于实现的功能(非标准)——即每个编译器的实现方式可能略有不同。

总而言之,示例代码适用于编译器和目标处理器,但完全不可移植到另一个工具链或处理器。