私のバージョンの _bittestandset の何が問題なのでしょうか
-
05-07-2019 - |
質問
私はアセンブリ言語の初心者です。gcc には MSVC のように intrin.h に _bittestandset 関数がないようなので、新たに実装しました。これは Linux では正常に動作しますが、winVista マシンで mingw を実行すると問題が発生します。コードは次のとおりです。
inline unsigned char _bittestandset(unsigned long * a, unsigned long b)
{
__asm__ ( "bts %1, %[b]"
: "=g"(*a)
: [b]"Ir"(b), "g"(*a) );
return 0;
}
解決
何が機能していないのか、さらに説明してもらえますか?簡単な使用例程度でしょうか。コードの何が問題なのかを推測するのは難しいです。
これまでのところ安っぽく見える点が 1 つあります。ビットテストオペコードを実行しましたが、結果を無視しました。テスト (および設定) したビットは、オペコードの後のキャリー フラグになります。
結果を取得したい場合は、キャリー フラグを他の出力レジスタに取得する追加の命令が必要です。(SBB EAX、EAX など)。
それ以外の場合、つまり結果が必要ない場合は、BTS 命令を 3 つの単純なアセンブラ オペコードに置き換える方がはるかに安価です。
次のような内容です。
; bit-index in cl
; Value in ebx
; eax used as a temporary (trashed)
mov eax, 1
shl eax, cl
or ebx, eax
私はあなたの正確なバージョンで mingw を持っていないので、単純なテストケースのアセンブリ出力を実行すると、何が問題なのか手がかりが得られる可能性があります。
他のヒント
BTS命令を使用しないでください。それは恐ろしく遅いです。より良い方法は、単純なshift + orを使用して実装することです。ボーナスとして、純粋なポータブルC ++で、アセンブリなしで実行できます。
所属していません StackOverflow