文档章节

学 Win32 汇编[23] - 位测试与位扫描指令: BT、BTC、BTR、BTS、BSF、BSR

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 479
阅读 24
收藏 0

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

本文转载自:http://www.cnblogs.com/del/archive/2010/04/15/1712467.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Linux 内核数据结构:位图(Bitmap)

本文由伯乐在线 -乔永琪 翻译,唐尤华 校稿。未经许可,禁止转载! 英文出处:0xAX。欢迎加入翻译组。 本系列: 《Linux 内核数据结构:Radix 树》 《Linux 内核数据结构:双向链表》 位图和...

伯乐在线
2016/12/10
0
0
Win32汇编开发环境介绍和RadAsm简明教程

Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编...

nothingfinal
2009/08/01
0
0
一种处理栈越界的方法

作者:吉林小伙 链接:http://zhuanlan.zhihu.com/p/20642841 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 在linux下,栈越界写坏返回地址会导致调用栈...

悬崖
2016/04/14
98
0
为什么16进制数要与OxFF与运算

以下是MD5加密算法示例,其中使用了 OxFF的与运算: @Test public void md5() throws Exception{ String pwd = "1234"; MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bts =......

千甲
2013/02/19
0
0
【汇编】区块链的TPS性能...

一,联盟链 二,公有链 2018-04-24 知乎 | 链圈码农 老污 | 现有区块链的TPS 最近在做一个区块链系统的底层设计,有一个绕不开的问题是,就是我的系统能提供多少个tps。为此,我收集了一些现...

大圣2017
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

高并发编程:解析HashMap

底层实现原理 在JDK1.8以前版本中,HashMap的实现是数组+链表,它的缺点是即使哈希函数选择的再好,也很难达到元素百分百均匀分布,而且当HashMap中有大量元素都存到同一个桶中时,这个桶会有...

小刀爱编程
36分钟前
0
0
程序员请不要假装很努力,因为结果不会陪你演戏

前言: 我一直相信这样一句话:真正的危机,来源于在正确的时间做不正确的事。没有在正确的时间,为下一步做出积累,这才是危机的根源。 比如,当你迈过了30岁这个坎,你的能力还局限于程序的...

Java干货分享
41分钟前
2
0
Fio随机读IOPS测试值可能偏大的原因分析

问题描述: 在使用fio进行虚拟机磁盘(Ceph的RBD,格式化为ext4文件系统)的IOPS测试时,发现randread比预估值高许多; 在使用相同参数进行randwrite测试之后,再进行randread时会出现此现象...

LastRitter
45分钟前
2
0
JavaScript引用类型Object常见用法实例分析

1、JavaScript数据类型 (1)基本类型 5种基本类型:Undefined、Null、Boolean、Number、String (2)引用类型 5种引用类型:Object、Array、Date、RepExp、Function (3)基本类型与引用类型的异同...

peakedness丶
52分钟前
1
0
教你理清SpringBoot与SpringMVC的关系

spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc。spring mvc 是只是spring 处理web层请求的一个模块。因此他们的关系大概就是这...

别打我会飞
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部