bt
組み立て説明書について質問です。文脈を提供するために本の一部を抜粋しました。最後の例を参照してくださいbt Testme, bx
。なぜコピーするのTestMe+8
ですか?コピーするべきではありませんTestMe+65
か?
助けてくれてどうもありがとう!
6.6.4.2 ビット テスト命令: BT、BTS、BTR、および BTC
80386 以降のプロセッサでは、bt 命令 (ビット テスト) を使用して 1 ビットをテストできます。その 2 番目のオペランドは、最初のオペランドへのビット インデックスを指定します。Bt は、アドレス指定されたビットをキャリー フラグにコピーします。たとえば、
bt ax, 12
ax のビット 12 をキャリー フラグにコピーします。
bt/bts/btr/btc 命令は、16 ビットまたは 32 ビットのオペランドのみを扱います。これは命令の制限ではありません。結局のところ、al レジスタのビット 3 をテストしたい場合は、ax レジスタのビット 3 を簡単にテストできます。一方、インデックスがレジスタ オペランドのサイズより大きい場合、結果は未定義です。
最初のオペランドがメモリ ロケーションの場合、bt 命令は、インデックスの値に関係なく、メモリ内の指定されたオフセットでビットをテストします。たとえば、bx に 65 が含まれている場合
bt TestMe, bx
TestMe+8 の位置のビット 1 をキャリー フラグにコピーします。繰り返しますが、オペランドのサイズは重要ではありません。すべての意図と目的のために、メモリオペランドはバイトであり、適切なインデックスを使用して、そのバイトの後の任意のビットをテストできます。実際のビット bt テストは、ビット位置 index mod 8 およびメモリ オフセット実効アドレス + index/8 にあります。