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

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

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

Win32ASM学习[12]:位测试指令位扫描指令相关推荐

  1. 测试学习12(测试分类及测试方法)

    按是否查看源代码 黑盒测试的分类 按是否运行 随机测试 针对重要功能,新增加的功能,特殊情况,以前发现过重大bug的模块进行二次测试,也叫探索测试,他可以结合回归测试来使用. 按是否自动化:人工测试, ...

  2. 测试指令和位测试指令的用法-TEST

     TEST指令的执行AND操作,区别是AND指令改变目的操作数,而TEST指令不改变目的操作数,只影响标志寄存器的状态,指示测试的结果. TEST指令和CMP指令相识.不同的是TEST指令通常测试单个 ...

  3. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  4. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  5. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(4) - 比特位设置指令/字节设置指令

    Bit and Byte Instructions 比特指令测试并修改操作数的某些比特位:字节指令设置字节操作数的值,用来指示EFLAGS标志寄存器的状态. 指令 描述 BT 测试比特位(将要测试的比 ...

  6. 汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

    文章目录 1 nop 指令 2 现场保护指令 2.1 push 与 pop 2.2 pushad 与 popad 2.3 pushfd 与 popfd 3 内存操作 3.1 mov指令 3.2 mov ...

  7. 计算机AL教程笔记,计算机系统基础学习笔记(2)-数据的位运算操作

    C语言的位运算操作包括两类,逻辑运算操作和逻辑移位操作. 逻辑运算操作 C语言提供了四种按位逻辑操作符,分别是按位取反,按位与,按位或,按位异或.在编译时,编译器会根据操作数的宽度分别转换为不同的指令 ...

  8. 这个偏僻的小山村竟出了12位博士28位硕士,高产“学霸”背后原因曝光......

    全世界只有3.14 % 的人关注了 爆炸吧知识 考上大学 留名祖宗祠堂 今早,超模君刷微博的时候,有一则新闻吓得我虎躯一震-- 一个总共才2000多人小山村,竟然出了12位博士28位硕士.而且考上大学 ...

  9. 用于商用微处理器的快速位收集、位分散和位置换指令(一)

    文章目录 Fast Bit Gather, Bit Scatter and Bit Permutation Instructions for Commodity Microprocessors Y e ...

最新文章

  1. Spring 中的bean 是线程安全的吗?
  2. 机器学习中的数学-线性判别分析(LDA), 主成分分析(PCA)
  3. 论面向组合子程序设计方法 之 南无阿弥陀佛
  4. 5种流行的Linux发行版:你更喜欢哪一个呢?
  5. JavaScript中DOM的层次节点(一)
  6. java正则 链接_Java使用正则表达式匹配获取链接地址的方法示例
  7. 注意!恶意NPM包正在安装勒索软件和密码窃取木马
  8. Picasso源码的简单解析(一)
  9. 第八周项目4-个人所得税计算器
  10. VR是什么,去哪里学习?
  11. 安装sql server出现配置系统未能初始化
  12. xsmax进入dfu模式_没有home键的iPhone XS怎么进入恢复模式?我教你
  13. 生命在于学习——业务逻辑漏洞
  14. SIM900A(GSM模块)学习
  15. [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Reduxreact-redux状态管理详解...
  16. PyQtGraph库的部分踩坑记录
  17. CF711C三维DP
  18. 链家网页爬虫_分享最近做的一个链家二手房爬虫和对爬到的数据进行可视化分析的案例...
  19. 女博士年薪156万入职华为:给员工吃饱了,他们才会为你拼命
  20. 使用xshell实现内网穿透与socket代理

热门文章

  1. 删除 终端服务器,终端服务器命令更改 - Windows Server | Microsoft Docs
  2. java gif_使用Java来处理GIF图片
  3. springboot中得注解_Spring以及SpringBoot中的常用的注解小结
  4. Extjs弹窗-简单文本编辑框-Ext.Msg.show
  5. hql中获取前一天的数据_PostgreSql 怎么获取数据库中关键系统信息(一)
  6. php h2,微信连接失败:一直返回h2Moved/h2 (终于搞定了)
  7. Html和websocket初识
  8. 关于图片预加载的思考
  9. java读取文件方法
  10. Liunx常用的100条命令汇存