我对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 处。