我对bt
汇编指令存有疑问。我摘录了本书的一部分以提供上下文。请参见最后一个示例bt Testme, bx
。为什么复制TestMe+8
?它不应该复制TestMe+65
吗?
非常感谢您的帮助!
6.6.4.2位测试指令:BT,BTS,BTR和BTC
[在80386或更高版本的处理器上,您可以使用bt指令(位测试)来测试一位。它的第二个操作数指定位索引到第一个操作数。 Bt将寻址的位复制到进位旗。例如,指令
bt ax, 12
将斧头的第十二位复制到进位标记中。
bt / bts / btr / btc指令仅处理16或32位操作数。这不是指令的限制。毕竟,如果您想测试al寄存器的第三个位,就可以轻松测试一下三把斧头寄存器。另一方面,如果索引较大小于寄存器操作数的大小,结果是不确定的。
如果第一个操作数是内存位置,则bt指令将进行测试内存中给定偏移量的位,无论指数。例如,如果bx包含65,则
bt TestMe, bx
将位置TestMe + 8的第一位复制到进位旗。再一次,操作数的大小无关紧要。对全部意图和目的,内存操作数是一个字节,您可以测试该字节之后的任意位,带有适当的索引。实际位bt测试在位位置索引为mod 8且内存偏移有效地址+索引/ 8。
[书中说“位置TestMe+8
的一位”时,“ 8
”指的是地址偏移量,以字节为单位。 8个字节中有64位,因此第65位是TestMe
之后的8个字节中的第1位。
TestMe
处的字节具有位7..0TestMe+1
处的字节具有位15..8TestMe+2
处的字节具有位23..16TestMe+8
处的字节具有位71..64因此,“ 65”是指地址TestMe+8
处字节的“位1”(从右数第二个计数。)>
bt TestMe, bx
其中bx包含65
是超出TestMe
地址8个字节(64位加1)的访问。它不将字节复制到那里,而仅复制该字节的第二位(到进位标志CF)。