bt汇编指令

tin*_*yaa 6 x86 assembly masm masm32

我对bt汇编指令有所了解.我摘录了部分书籍以提供背景信息.请看最后一个例子bt Testme, bx.为什么复制TestMe+8?不应该复制TestMe+65

非常感谢你的帮助!

6.6.4.2位测试指令:BT,BTS,BTR和BTC

在80386或更高版本的处理器上,您可以使用bt指令(位测试)来测试单个位.它的第二个操作数指定第一个操作数的位索引.Bt将寻址的位复制到进位标志中.例如,指令

  bt  ax, 12
Run Code Online (Sandbox Code Playgroud)

将第12位斧头复制到进位标志中.

bt/bts/btr/btc指令仅处理16或32位操作数.这不是指令的限制.毕竟,如果你想测试al寄存器的第三位,你可以很容易地测试ax寄存器的第三位.另一方面,如果索引大于寄存器操作数的大小,则结果是未定义的.

如果第一操作数是存储位置,在BT测试指令在索引的给定的存储器偏移量,而不管值的比特.例如,如果bx包含65则

  bt  TestMe, bx
Run Code Online (Sandbox Code Playgroud)

将位置TestMe + 8中的第一位复制到进位标志中.再一次,操作数的大小无关紧要.对于所有意图和目的,内存操作数是一个字节,您可以使用适当的索引测试该字节后的任何位.实际的位bt测试是位位置索引mod 8和存储器偏移有效地址+ index/8.

Ray*_*oal 9

当书中写着"位置之一TestMe+8"时," 8"指的是地址偏移量,以字节为单位.8个字节有64位,因此第65位是过去8个字节的第1位TestMe.

  • 字节at TestMe位为7..0
  • 字节at TestMe+1位15..8
  • 字节TestMe+2位有23..16位
  • ...
  • 字节at TestMe+8位71..64

所以"65"指的是地址字节的"第1位"(第二次从右边开始计数)TestMe+8.