Bt世界:bt装配指令(bt x86)

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

10

当书上说“位置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”(从右侧开始的第二个计数)。

2

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(545)
Confucius's:sss和sssd在mysqlioo准备语句中的含义是什么
上一篇
Linux卸载oracle:在 linux上卸载(uninstall linux application)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(49条)