10

このコードをコンパイルしようとすると:

#include <stdio.h>

main(int argc, char *argv[]) {
   double y = 0;

   __asm__ ("fldl $150;"
            "fsqrt;"
            "fstl %0;" : : "g" (y) );

   printf("%f\n", y);


   return 0;
}

次のエラーが表示されます。

sqrt.c: Assembler messages:
sqrt.c:6: Error: suffix or operands invalid for `fld'

なぜこれが機能しないのですか?浮動小数点演算で数値「150」をスタックにプッシュできないのはなぜですか?

4

5 に答える 5

9

すぐに使用できるリテラル浮動小数点定数をサポートするアセンブリ言語を知りません。通常の手段は、浮動小数点定数を含む初期化されたストレージを宣言し、それを参照することです。

const1:     dq  1.2345
...
     fldl    const1

あなたが与える例では、これをより直接的に行うことができます:

printf ("%f\n", sqrt (150));

そうでなければ、これは人為的に複雑なプロジェクト、おそらく宿題に違いありません。

于 2011-06-29T00:36:28.477 に答える
1

この命令の有効なオペランドは、fldメモリまたは浮動小数点スタック レジスタのみです。

(また、ブロックyの入力オペランドとして指定しましたが、それは出力である必要があります。おそらく、それをメモリ (ではなく)asmに制約する方が安全です。)"m""g"

本当にインライン アセンブリでこれを行いたい場合は、次のようにします。

#include <stdio.h>

int main(void)
{
   double y;
   const double k = 150.0;

   __asm__ ("fldl %1;"
            "fsqrt;"
            "fstl %0;" : "=m" (y) : "m" (k) );

   printf("%f\n", y);

   return 0;
}
于 2011-06-29T01:06:10.763 に答える