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

发布于 2024-12-24 19:33:12 字数 553 浏览 1 评论 0原文

嘿,我正在尝试学习如何在 C 程序中编写汇编代码。我理解汇编中的整数,但浮点数仍然让我困惑。

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

Hey Im trying to learn how to write assembly code in my C programs. I understand integers in assembly but floats continue to trip me up.

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

As you can see Im just trying to find the square root of x. But whenever I try to compile it I get an operand type mismatch error.

I followed the same syntax used here: http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx?display=Print

PS: Im using MinGW GCC on Windows XP

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

如梦亦如幻 2024-12-31 19:33:12

您需要明确指定所需的 fldfst 指令变体。否则,编译器不知道您的操作数应该是多少。此代码在这里适用于我:

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

您可以使用反汇编程序来仔细检查 64 位 FLD 和 FST 的正确操作码(DD/0DD/2)正在被排放。

You need to explicitly specify which fld and fst instruction variants you want. Otherwise, the compiler doesn't know what size your operand is supposed to be. This code works for me here:

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

You can use a disassembler to double-check that the right opcodes for 64-bit FLD and FST (DD/0 and DD/2) are getting emitted.

月下凄凉 2024-12-31 19:33:12

首先,你为什么要这样做?编译器可以自己求平方根。您只需调用正确的数学库函数,启用优化(因此它将内联标准函数),如果它没有执行您想要的操作,我会感到惊讶。结果是独立于平台的(即,如果您愿意,您可以构建 64 位,甚至是整个其他架构),易于维护代码 - 更好!

如果您坚持以困难的方式做到这一点,gcc 也可以在这里提供帮助(我没有实际测试过这一点):

double asmSqrt(double x) {
  __asm__ ("fsqrt" : "+t" (x));
  return x;
}

t 约束意味着将值放在浮点堆栈的顶部 - 您不必关心它如何到达那里。 + 表示将该值同时用于输入和输出。

编辑:哦,如果您确实想自己将东西放入寄存器中,那么您最好在“clobbers”部分告诉编译器,否则您可能会覆盖它存储在那里的东西。

First, why are you doing this? The compiler can do square roots itself. You just call the proper math library function, enable optimization (so it will inline standard functions) and I'd be surprised if it doesn't do what you want. The result is platform independent (i.e. you can build for 64-bit if you want, or even a whole other architecture), easy to maintain code - much better!

If you insist on doing it the hard way, gcc can also help here (I've not actually tested this):

double asmSqrt(double x) {
  __asm__ ("fsqrt" : "+t" (x));
  return x;
}

The t constraint means put the value on the top of the floating-point stack - you don't have to care how it gets there. The + means to use the value for both input and output.

Edit: Oh, and if you do want to put things in registers yourself then you had better tell the compiler about that in the 'clobbers' section or you might overwrite something it has stored there.

涙—继续流 2024-12-31 19:33:12

双 sqrt1(双 n)
{
__asm{
佛罗里达州
平方根
}
}

调用方法: double result = sqrt1((double)10) 例如

double sqrt1(double n)
{
__asm{
fld n
fsqrt
}
}

call the method: double result = sqrt1((double)10) for example

记忆で 2024-12-31 19:33:12

指定内存位置“=m”而不是“=g”。但最好是在这里阅读本手册:http://ibiblio。 org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s4

无论如何,这是解决方案:

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

Specify memory location "=m" instead of "=g". But best is to read this manual here: http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s4

Anyway, here is the solution:

double asmSqrt(double x) {
  double o;
  __asm__ ("fld %1;"
           "fsqrt;"
           "fst %0;"
           : "=m" (o)
           : "g" (x)
  );
  return o;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文