我对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 的第一位复制到进位标志中。同样,操作数的大小并不重要。出于所有意图和目的,内存操作数是一个字节,您可以使用适当的索引测试该字节之后的任何位。实际的位 bt 测试是在位位置索引 mod 8 和内存偏移有效地址 + 索引 / 8 处。
当书上说“位置TestMe+8
的第一位”时,“8
”是指地址偏移,以字节为单位。8 个字节中有 64 位,因此第 65 位是TestMe
之后 8 个字节中的第一位。
TestMe
处的字节具有位 7..0
TestMe+1
处的字节具有位 15..8
TestMe+2
处的字节具有位 23..16
...
TestMe+8
处的字节具有位 71..64
因此,“65”是指地址TestMe+8
处的字节的“位 1”(从右侧开始的第二个计数)。
bt TestMe, bx
,其中 bx 包含65
是对地址TestMe
以外的 8 个字节(64 位加 1)的访问。它不会在那里复制字节,只复制该字节中的第二位(到进位标志 CF)。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(8条)