Win32ASM学习[12]:位测试指令位扫描指令

来源:互联网 发布:c4d r17 mac 编辑:程序博客网 时间:2024/05/09 08:47
 

-----------------------------------------------------------------------------------------------------------------------

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

----------------------------------------------------------------------------------------------------------------