BT、BTS、BTR、BTC: 位測試指令

BT、BTS、BTR、BTC: 位測試指令windows

;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, i8debug

; Test23_1.asm
.386
.model flat, stdcallcode

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.libit

.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 mainasm


BSF、BSR: 位掃描指令model


;BSF(Bit Scan Forward): 位掃描, 低 -> 高
;BSR(Bit Scan Reverse): 位掃描, 高 -> 低bug

;它們的結果影響 ZFcall

;掃描的是參數二, 找到是 1 的位後, 把位置數給參數一併置 ZF=0
;找不到(也就是參數二是 0)時, 置 ZF=1co

;它們的指令格式相同:
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

相關文章
相關標籤/搜索