質問

私はアセンブリ言語の初心者です。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 ++で、アセンブリなしで実行できます。

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