6

我对bt汇编指令有疑问。我摘录了本书的一部分以提供上下文。请看最后一个例子,bt Testme, bx。为什么要复制TestMe+8?不应该复制TestMe+65吗?

非常感谢您的帮助!

6.6.4.2 比特测试说明:BT、BTS、BTR、BTC

在 80386 或更高版本的处理器上,您可以使用 bt 指令(位测试)来测试单个位。它的第二个操作数指定第一个操作数的位索引。Bt 将寻址位复制到进位标志中。例如,指令

  bt  ax, 12

将 ax 的第 12 位复制到进位标志中。

bt/bts/btr/btc 指令仅处理 16 位或 32 位操作数。这不是指令的限制。毕竟,如果你想测试 al 寄存器的第三位,你可以很容易地测试 ax 寄存器的第三位。另一方面,如果索引大于寄存器操作数的大小,则结果未定义。

如果第一个操作数是内存位置,则 bt 指令会测试内存中给定偏移处的位,而不管索引的值如何。例如,如果 bx 包含 65 则

  bt  TestMe, bx

将位置 TestMe+8 的第 1 位复制到进位标志中。再一次,操作数的大小无关紧要。出于所有意图和目的,内存操作数是一个字节,您可以使用适当的索引测试该字节之后的任何位。实际位 bt 测试在位位置索引 mod 8 和内存偏移有效地址 + index/8 处。

4

2 回答 2

10

当书中说“位置的位TestMe+8”时,“ 8”指的是地址偏移量,以字节为单位。8 个字节中有 64 位,因此第 65 位是过去 8 个字节的位之一TestMe

  • The byte at TestMe has bits 7..0
  • The byte at TestMe+1 has bits 15..8
  • The byte at TestMe+2 has bits 23..16
  • ...
  • The byte at TestMe+8 has bits 71..64

So "65" refers to "bit 1" (the second counting from the right) of the byte at address TestMe+8.

于 2011-09-22T00:01:04.850 回答
2

bt TestMe, bx其中 bx 包含65的是 8 字节(64 位加 1)的地址之外的访问TestMe。它不复制那里的字节,只复制该字节中的第二位(到进位标志,CF)。

于 2011-09-21T23:58:49.710 回答