6

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 にあります。

4

2 に答える 2

10

本に「位置のビット 1 」と記載されているTestMe+8場合、「 」はバイト単位で測定されるアドレス オフセット8を指します。8 バイトには 64 ビットがあるため、65 番目のビットは 8 バイト後のビット 1 です。TestMe

  • のバイトにTestMeはビット 7..0 があります
  • のバイトにTestMe+1はビット 15..8 があります
  • のバイトにTestMe+2はビット 23..16 があります
  • ...
  • のバイトにTestMe+8はビット 71..64 があります

したがって、「65」は、アドレスのバイトの「ビット 1」(右から数えて 2 番目) を指しますTestMe+8

于 2011-09-22T00:01:04.850 に答える
2

bt TestMe, bxここで、bx に65は、 のアドレスから 8 バイト (64 ビット + 1) 先のアクセスが含まれますTestMe。そこにはバイトはコピーされず、そのバイトの 2 番目のビットのみが (キャリー フラグ、CF に) コピーされます。

于 2011-09-21T23:58:49.710 に答える