VS C ++でIA32命令「FAB」を使用する方法
-
21-12-2019 - |
質問
これはアセンブリを使用することが私の最初の試みであり、私は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
は浮動小数点スタックの上部にあるオペランドの絶対値を取り、結果を同じ場所に戻します。
所属していません StackOverflow