bt汇编指令

问题描述 投票:6回答:2

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

assembly x86 masm masm32
2个回答
9
投票

[书中说“位置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”(从右数第二个计数。)>


2
投票

bt TestMe, bx其中bx包含65是超出TestMe地址8个字节(64位加1)的访问。它不将字节复制到那里,而仅复制该字节的第二位(到进位标志CF)。

© www.soinside.com 2019 - 2024. All rights reserved.