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

本文详细介绍了BT、BTS、BTC、BTR和BSF、BSR等位操作指令的功能及用法。通过具体实例展示了如何使用这些指令进行位测试、设置、反转、清除以及位扫描等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值