2009-03-08 12 views
0

私はアセンブリ言語を初めて使用しています。 gccはMSVCのようにintrin.hの_bittestandset関数を持っていないようですので、新しいものを実装しました。この1つはLinuxでは正常に動作しますが、それはwinVista機でmingwのと間違って行く、コードは次のとおりです。私のバージョンの_bittestandsetに問題があります

inline unsigned char _bittestandset(unsigned long * a, unsigned long b) 
{ 
    __asm__ ("bts %1, %[b]" 
      : "=g"(*a) 
      : [b]"Ir"(b), "g"(*a)); 
    return 0; 
}

答えて

3

あなたは働いていないものを、いくつかのさらなる説明を与えるだろうか?たぶん、そのような使い方の簡単な例です。コードの何が間違っているのかを推測するのは難しいです。

これまでのところ、ちょっとしたもの:ビットテスト用のオペコードを実行しますが、その結果は無視してください。テストして設定したビットは、オペコードの後のキャリーフラグで終わります。

結果を取得するには、他の出力レジスタにキャリーフラグを取得する追加の命令が必要です。 (SBB EAX、EAXなど)。それ以外の場合は

- あなたは結果を必要としない場合 - それは3つの単純アセンブラオペコードとBTS命令を置き換えるためにはるかに安いです。これらの線に沿って

何か:

; bit-index in cl 
    ; Value in ebx 
    ; eax used as a temporary (trashed) 
    mov eax, 1 
    shl eax, cl 
    or ebx, eax 

私にはありませんので、あなたの正確なバージョンで簡単なテストケースのアセンブリ出力を実行すると、何が起こっているのかわかりません。

-1

BTS命令を使用しないでください。それはひどく遅いです。より良い方法は、シンプルなシフト+またはシフトを使用して実装することです。また、ボーナスとして、純粋で移植性のあるC++で、アセンブリなしで実行できます。

関連する問題