我对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寄存器的第三位,就可以轻松测试位 三个斧头登记。另一方面,如果指数较大 比寄存器操作数的大小,结果是未定义的。
如果第一个操作数是内存位置,则bt指令进行测试 内存中给定偏移量的位,无论值是多少 指数。例如,如果bx包含65,那么
bt TestMe, bx
将位置TestMe + 8的第一位复制到进位中 旗。再一次,操作数的大小无关紧要。对全部 意图和目的,内存操作数是一个字节,你可以测试 具有适当索引的该字节后的任何位。实际位bt 测试是在位位置索引mod 8和内存偏移有效 地址+索引/ 8。
答案 0 :(得分:6)
当本书说“位置TestMe+8
”时,“8
”指的是地址偏移量,以字节为单位。 8个字节中有64位,因此第65位是TestMe
之后的8个字节中的第1位。
TestMe
处的字节位为7..0 TestMe+1
处的字节位为15..8 TestMe+2
处的字节位为23..16 TestMe+8
处的字节位为71..64 所以“65”指的是地址TestMe+8
处字节的“第1位”(第二位从右边开始计数)。
答案 1 :(得分:2)
bt TestMe, bx
其中bx包含65
是超出TestMe
地址的访问8字节(64位加1)。它不会复制那里的字节,只复制该字节中的第二位(进位标志,CF)。