1

これは、アセンブリを使用する最初の試みであり、Intel Architecture instruction を使用しようとしていますFABS。( 399 ページのこのドキュメントを参照)。

これは単に符号ビットをクリアするためのものです。

アセンブリについて私が知っていることはほとんどありませんが、ソースと宛先が関係していますが、この命令の表記法への参照は見当たりません。

以下は、それを使用する私の試みの1つです(Visual Studio 2012、C ++を使用):

double myabs(double x){
  __asm(fabs(x));
return x;
}

この特定の試行により、エラー C2400: inline assembler syntax error in 'opcode'; が発生します。見つかった '('


アセンブリ命令を使用したいので、利用可能な他の/「より良い」オプションには興味がないことに注意してください。

4

2 に答える 2

2

いくつかのポイント: まず - gcc スタイルのインライン アセンブリを使用していますが、MS スタイルで使用できます -

__asm{ ... }

第二に、命令は関数ではないため、括弧も間違っています。

最後に最も重要なfabsことは、引数を取らず、FP スタックの一番上で動作することです。最初に変数を明示的にロードする必要があります。これを試して:

__asm {
    fld x
    fabs
    fstp x
}

とにかく、古い x87 命令を使用することはおそらく良いことではなく、おそらく非常に非効率的です。SSE ソリューションへの切り替えを検討する必要があります。(SSE4まで)

于 2013-11-17T23:07:46.737 に答える
1

VC++ では、アセンブリ言語を括弧で囲みません。正しい構文は次のようになります。

__asm fabs

また:

__asm { 
    fabs
    // possibly more instructions here
}

あなたの特定のケースでは、おそらく次のようなものが必要になるでしょう:

__asm { 
    fload x // load x onto F.P. stack
    fabs    // take absolute value
    fstp x  // store back to x and pop from F.P. stack.
}

ソースと宛先に関する限り、x86 の浮動小数点はスタックを使用します。特に指定しない限り、ほとんどの命令 (ロード/ストア以外) はスタックの一番上からオペランドを取得し、結果もスタックの一番上に置きます。たとえば、オペランドが指定fabsされていない場合、浮動小数点スタックの一番上にあるオペランドの絶対値が取得され、結果が同じ場所に戻されます。

于 2013-11-17T23:10:23.313 に答える