0

私はアセンブリ言語が初めてです。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;
}
4

2 に答える 2

3

何が機能していないのか、さらに説明していただけますか?使い方の簡単な例かもしれません。コードの何が問題なのかを推測するのは難しい..

これまで安っぽく見えることの 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を持っていないので、単純なテストケースのアセンブリ出力を実行すると、何が問題なのかの手がかりが得られる可能性があります.

于 2009-03-08T16:27:53.700 に答える
-1

BTS 命令は使用しないでください。恐ろしく遅いです。より良い方法は、単純な shift+or を使用して実装することです。おまけとして、純粋で移植可能な C++ で、アセンブリなしで実行できます。

于 2009-06-30T21:03:29.423 に答える