-----------------------------------------------------------------------------------------------------------------------
一.BT 指令
格式: BT OPD,OPS
功能: 目的操作数OPD中由源操作数OPS指定的位送CF标志
说明: 1. 在指令中,目的操作数OPD只能是16/32位通用寄存器或存储单元,用于指定要测试的数据;源操作数OPS必须是8位立即数或者是与目的操作数等长的16/32位通用寄存器,用于指定要测试的位. 如果目的操作数是寄存器,则源操作数除以16/32的余数就是要测试的位,它在0-15/31之间.
2. 举例: MOV EAX 12345678H ;EAX=12345678H
BT EAX,5 ;EAX的D5位=1-->CF,EAX=12345678H
注意: 如果目的操作数是存储单元, 则该单元的最低位为0.从这个最低位向地址高端每位依次增量,向地址代低端每位依次减量,这部分存储器数据作为一个2G-1~-2G长的位串.此时,有符号源操作数就指示要测试的位.
二.BTS指令
格式: BTS OPD,OPS
功能: 报目的操作数OPD中由源操作数OPS指定的位送CF标志,然后对那一位置位.
说明: 1. 在指令中,目的操作数OPD只能是16/32位通用寄存器或存储单元,用于指定要测试的数据;源操作数OPS必须是8位立即数或者是与目的操作数等长的16/32位通用寄存器,用于指定要测试的位.如果目的操作数是寄存器,则源操作数除以16/32的余数就是要测试的位,它在0-15/31之间.
2. 举例: MOV EAX 12345678H ;EAX=12345678H
BTS EAX,34 ;EAX的D2位=0-->CF,EAX=1224527CH
注意: 如果目的操作数是存储单元,则该单元的最低位为0.从这个最低位向地址高端每位依次增量,向地址代低端每位依次减量,这部分存储器数据作为一个2G-1~-2G长的位串.此时,有符号源操作数就指示要测试的位
三.BTC 指令
格式: BTC OPD,OPS
功能: 报目的操作数OPD中由源操作数OPS指定的位送CF标志,然后对那一位求反.
说明: 1. 在指令中, 目的操作数OPD只能是16/32位通用寄存器或存储单元,用于指定要测试的数据;源操作数OPS必须是8位立即数或者是与目的操作数等长的16/32位通用寄存器,用于指定要测试的位.如果目的操作数是寄存器,则源操作数除以16/32的余数就是要测试的位,它在0-15/31之间.
2. 举例: MOV EAX 12345678H ;EAX=12345678H
BTC EAX,10 ;EAX的D10位=1-->CF,EAX=12345278H
注意: 如果目的操作数是存储单元,则该单元的最低位为0.从这个最低位向地址高端每位依次增量,向地址代低端每位依次减量,这部分存储器数据作为一个2G-1~-2G长的位串.此时,有符号源操作数就指示要测试的位.
四.BTR 指令
格式: BTR OPD,OPS
功能: 报目的操作数OPD中由源操作数OPS指定的位送CF标志,然后对那一位复位.
说明: 1. 在指令中,目的操作数OPD只能是16/32位通用寄存器或存储单元,用于指定要测试的数据;源操作数OPS必须是8位立即数或者是与目的操作数等长的16/32位通用寄存器,用于指定要测试的位.如果目的操作数是寄存器,则源操作数除以16/32的余数就是要测试的位,它在0-15/31之间.
2. 举例: MOV EAX 12345678H ;EAX=12345678H
BTR EAX,20 ;EAX的D20位=1-->CF,EAX=12245278H
注意: 如果目的操作数是存储单元,则该单元的最低位为0.从这个最低位向地址高端每位依次增量,向地址代低端每位依次减量,这部分存储器数据作为一个2G-1~-2G长的位串.此时,有符号源操作数就指示要测试的位.
---------------------------------------------------------------------------------------------------------------------------------
.code
main proc
;BT 把 10000001b 的第七位复制到 CF, 得知是 1
mov dx, 10000001b
bt dx, 7
lahf
PrintHex ah ;47 - 01000111b (CF=1)
;BT 把 10000001b 的第六位复制到 CF, 得知是 0
bt dx, 6
lahf
PrintHex ah ;86 - 10000110b (CF=0)
;BTS 在执行 BT 命令的同时, 把操作数的指定位置为 1
mov dx, 10000001b
bts dx, 6
PrintHex dl ;C1 - 11000001b
;BTR 在执行 BT 命令的同时, 把操作数的指定位置为 0
mov dx, 10000001b
btr dx, 7
PrintHex dl ;01 - 00000001b
;BTC 在执行 BT 命令的同时, 把操作数的指定位取反
mov dx, 10000001b
btc dx, 0
PrintHex dl ;80 - 10000000b
btc dx, 0
PrintHex dl ;81 - 10000001b
ret
main endp
end main
------------------------------------------------------------------------------------------------------------------
五.BSF 指令
格式: BSF OPD,OPS
功能: 向前位扫描指令.本指令从最低位(第0位)开始测试OPS中的各位,当遇到有1的位时,ZF=0,且将该位的序号存入OPD中,如OPS的所有位都是0,则ZF=1且OPD中的值无意义.(执行逻辑移位前,决定应移位的次数)
说明: 1. OPD和OPS应为同类型的16或32位的寄存器或存储器操作数,OPD必须为寄存器操作数.
2. 举例: 假定EBX中的数是12F234E0H,指令BSF EAX,EBX执行后,EAX=5,ZF=0
六.BSR 指令
格式: BSR OPD,OPS
功能: 向后位扫描指令.本指令从最高位(第15位或31位)开始测试OPS中的各位,当遇到有1的位时,ZF=0,且将该位的序号存入OPD中,如OPS的所有位都是0,则ZF=1且OPD中的值无意义.(执行逻辑移位前,决定应移位的次数)
说明: 1. OPD和OPS应为同类型的16或32位的寄存器或存储器操作数,OPD必须为寄存器操作数.
2. 举例: 假定EBX中的数是12F234E0H,指令BSR EAX,EBX执行后,EAX=28,ZF=0
-------------------------------------------------------------------------------------------------------------------
.code
main proc
;扫描到时
mov dx, 0000111100001100b
bsf cx, dx
PrintDec cx ;2 - 也就是左数第 3 位
bsr cx, dx
PrintDec cx ;11 - 也就是左数第 12 位
;扫描不到时
mov cx, 0FFFFh
mov dx, 0
bsf cx, dx
lahf
PrintHex ah ;C6 - 11000110 (ZF=1)
PrintHex cx ;FFFF - 找不到时不会影响到目的值
ret
main endp
end main
----------------------------------------------------------------------------------------------------------------