【问题标题】:bt assembly instructionbt 汇编指令
【发布时间】:2011-11-22 09:50:58
【问题描述】:

我对@9​​87654321@ 汇编指令有疑问。我摘录了本书的一部分以提供上下文。请参阅最后一个示例,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 寄存器的位 3,你可以很容易地测试位 三个斧头寄存器。另一方面,如果索引较大 大于寄存器操作数的大小,则结果未定义。

如果第一个操作数是内存位置,bt 指令测试 内存中给定偏移处的位,无论 指数。例如,如果 bx 包含 65 则

  bt  TestMe, bx

将位置 TestMe+8 的第 1 位复制到进位 旗帜。再一次,操作数的大小无关紧要。对所有人 意图和目的,内存操作数是一个字节,你可以测试 该字节之后的任何位具有适当的索引。实际位 bt 测试在位位置索引 mod 8 和内存偏移有效 地址+索引/8。

【问题讨论】:

    标签: assembly x86 masm masm32


    【解决方案1】:

    当书中说“位置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 包含65TestMe 地址之外8 个字节(64 位加1)的访问。它不复制那里的字节,只复制该字节中的第二位(到进位标志,CF)。

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 2014-05-28
        • 2014-05-27
        • 2011-12-29
        相关资源
        最近更新 更多