C 内联汇编 - 'fst' 的操作数类型不匹配

标签 c gcc assembly mingw inline-assembly

嘿,我正在尝试学习如何在我的 C 程序中编写汇编代码。我理解汇编中的整数,但 float 继续让我失望。

double asmSqrt(double x) {
    double o;
    __asm__ ("fld %1;"
             "fsqrt;"
             "fst %0;"
             : "=g" (o)
             : "g"  (x)
    );
    return o;
}

如您所见,我只是想求 x 的平方根。但是每当我尝试编译它时,我都会收到操作数类型不匹配错误。

我遵循了此处使用的相同语法:http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx?display=Print

PS:我在 Windows XP 上使用 MinGW GCC

最佳答案

您需要明确指定您想要的fldfst 指令变体。否则,编译器不知道您的操作数应该有多大。这段代码在这里对我有用:

__asm__ ("fldl %1  ;"
         "fsqrt    ;"
         "fstl %0  ;"
         : "=g" (o)
         : "g"  (x)
);

您可以使用反汇编程序仔细检查是否发出了 64 位 FLD 和 FST(DD/0DD/2)的正确操作码。

关于C 内联汇编 - 'fst' 的操作数类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8736601/

相关文章:

c - 汇编 如何将 REP STOS 转换为 C 代码

c - 逐页显示文件

c - 从一棵空树开始,用大 O 表示法插入红黑树的复杂度是多少?

c++ - 为什么 March=native 会破坏我的程序?

android - 使用 gcc 的 C++ 前端编译 C 代码的好处

通过 macOS 终端编译, fatal error : stdio. h: No such file or directory

c - 为什么无符号变量存储负值?

c - 我如何定期从 c 中允许值的位掩码中选择值?

cl.exe 产生奇怪的汇编代码

组装在模式 x 中读取平面是否需要与写入不同的输出到 VGA 端口?