将内联汇编 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))
是特定于实现的功能(非标准)
即使包含汇编器也是一个特定于实现的功能(非标准)——即每个编译器的实现方式可能略有不同。
总而言之,示例代码适用于编译器和目标处理器,但完全不可移植到另一个工具链或处理器。
我正在寻找不同的方法来计算平方根,特别是一个(来自 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))
是特定于实现的功能(非标准)
即使包含汇编器也是一个特定于实现的功能(非标准)——即每个编译器的实现方式可能略有不同。
总而言之,示例代码适用于编译器和目标处理器,但完全不可移植到另一个工具链或处理器。