質問

これはアセンブリを使用することが私の最初の試みであり、私はIntelアーキテクチャ命令FABSを使用しようとしています。(

役に立ちましたか?

解決

いくつかのポインタ:最初 - あなたが使用できるMSスタイルでGCCスタイルのインラインアセンブリを使用しています -

__asm{ ... }
.

2番目の命令は機能ではないので、括弧も間違っている。

最後に重要な - fabsは引数を取りません。これは、FPスタックの上部に機能します。あなたは最初にそこに変数を明示的にロードする必要があります。これを試してください:

__asm {
    fld x
    fabs
    fstp x
}
.

とにかく、古いx87の指示を使用することはおそらく良いことではありませんが、おそらく非常に非効率的です - あなたはSSEソリューションに切り替えることを検討する必要があります。-to-absolute-2-double-or-floats-united-sse-instroup-set-to-sse4 "> SSE命令セットを使用した2倍または4の浮き上がり?(SSE4まで)

他のヒント

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.
}
.

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top