BT、BTS、BTR、BTC: 位测试指令
;BT(Bit Test): 位测试
;BTS(Bit Test and Set): 位测试并置位
;BTR(Bit Test and Reset): 位测试并复位
;BTC(Bit Test and Complement): 位测试并取反
;它们的结果影响 CF
;它们的指令格式相同:
BT r16/r32/m16/m32, r16/r32/m16/m32
BT r16/r32/m16/m32, i8
; Test23_1.asm
.386
.model flat, stdcall
include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.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、BSR: 位扫描指令
;BSF(Bit Scan Forward): 位扫描, 低 -> 高
;BSR(Bit Scan Reverse): 位扫描, 高 -> 低
;它们的结果影响 ZF
;扫描的是参数二, 找到是 1 的位后, 把位置数给参数一并置 ZF=0
;找不到(也就是参数二是 0)时, 置 ZF=1
;它们的指令格式相同:
BSF r16/r32, r16/r32/m16/m32
; Test23_2.asm
.386
.model flat, stdcall
include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.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