Win32ASM学习[11]:逻辑运算
---------------------------------------------------------------------------------------------------------------------------
一.逻辑与运算指令 AND
格式: AND OPRD1,OPRD2其中目的操作数OPRD1为任一通用寄存器或存储器操作数.源操作数OPRD2为立即数、任一通用寄存器或存储器操作数.
功能: 对两个操作数实现按位逻辑与运算,结果送至目的操作数.本指令可以进行字节或字
的‘与’运算.OPRD1<--OPRD1 and OPRD2.
说明: 1. 例如: AND AL,0FH ; (AL)<--(AL) AND 0FH
AND AX,BX ; (AX)<--(AX) AND (BX)
AND DX,BUFFER[SI+BX]
AND BETA[BX],00FFH
2. 本指令影响标志位PF、SF、ZF,使CF=0、OF=0.
例如,在同一个通用寄存器自身相与时,操作数虽不变,但使CF置零.本指令主要用于修改操作数或置某些位为零.
3. 上例中的每一条指令,将使AL寄存器的高4位置成零保持AL低4位值不变.
4. 两数相与,有一个数假则值为假
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
and小写转换大写
.data
szText db 'Delphi', 0
.code
main proc
lea esi, szText
mov ecx, lengthof szText - 1
@@: and byte ptr [esi], 11011111b ;大写字母和小写字母只有第五位不同
inc esi
loop @B
PrintString szText ;DELPHI
ret
main endp
end main
-------------------------------------------------------------------------------------------------------------------------
逻辑或指令 OR
格式: OR OPRD1,OPRD2
功能: 其中OPRD1、OPRD2含义与AND指令相同, 对标志位的影响也与AND指令相同.唯一不同的地方是,OR指令完成对两个操作数按位的‘或’运算,结果送至目的操作数中, 本指令可以进行字节或字的‘或’运算.
OPRD1<--OPRD1 OR OPRD2.
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
OR r/m, r/m/i
说明: 两数相或,有一个数为真则值为真
or 转小写
.data
szText db'Delphi', 0
.code
main proc
lea esi, szText
movecx,lengthof szText - 1
@@: or byte ptr [esi], 00100000b ;大写字母和小写字母只有第五位不同
inc esi
loop @B
PrintString szText ;delphi
ret
main endp
end main
---------------------------------------------------------------------------------------------------------------------------
逻辑异或运算指令 XOR
格式: XOR OPRD1,OPRD2
功能: 其在OPRD1、OPRD2的含义与AND指令相同,对标志位的影响与与AND指令相同.本指令的功能是实现两个操作数按位‘异或’运算,结果送至目的操作数中.它可以进行字节或字的‘异或’运算.OPRD1<--OPRD1 XOR OPRD2
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
XOR r/m, r/m/i
两次和一个相同的数 XOR 恢复到原来的数
.data
szText db 'Hello World!', 0
.code
main proc
;加密
lea esi, szText
mov ecx, lengthof szText - 1
@@: xor byte ptr [esi], 123 ;使用 123 做密码
inc esi
loop @B
PrintString szText ;显示乱码
;解密
lea esi, szText
mov ecx, lengthof szText - 1
@@: xor byte ptr [esi], 123
inc esi
loop @B
PrintString szText ;Hello World!
ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------
not
;该指令不影响 EFlags
;指令格式:
NOT r/m
.data
szText db 'Hello World!', 0
.code
main proc
;加密
lea esi, szText
mov ecx, lengthof szText - 1
@@: not byte ptr [esi]
inc esi
loop @B
PrintString szText ;显示乱码
;解密
leaesi, szText
mov ecx, lengthof szText - 1
@@: notbyte ptr [esi]
inc esi
loop @B
PrintString szText ;Hello World!
ret
main endp
end main
-----------------------------------------------------------------------------------------------------------------
测试指令 TEST
格式: TEST OPRD1,OPRD2
功能: 其中OPRD1、OPRD2的含义同AND指令一样,也是对两个操作数进行按位的‘与’运算 ,唯一不同之处是不将‘与’的结果送目的操作数,即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位.
说明: TEST与AND指令的关系,有点类似于CMP与SUB指令之间的关系.
;判断字母 A 二进制(01000001)的其最后一位是否是 0, 如果是 0 那么 ZF=1
mov al, 'A'
test al, 00000001b
lahf
PrintHex ah ;02 - 00000010b (ZF=0)
;判断 ecx 是否为空
mov ecx, 1
test ecx,ecx
lahf
PrintHex ah ;06 - 00000010b (ZF=0, 不为空)
xor ecx,ecx
test ecx, ecx
lahf
PrintHex ah ;06 - 01000110b (ZF=1, 为空)
------------------------------------------------------------------------------
判断字符串中每个字符的二进制位的最后一位是 1 还是 0
------------------------------------------------------------------------------
.data
szText db 'Delphi', 0
.code
main proc
;清空两个寄存器用于计数
xor eax, eax
xor edx, edx
lea esi, szText ;字符串地址
mov ecx, lengthof szText - 1 ;字符串长度
L1: test byte ptr [esi], 00000001b ;循环测试每个字符的最后一位是 1 还是 0
jz L2 ;如果是 0 则跳到 L2 给 edx+1
inc eax ;反之给 eax+1
jmp L3
L2: inc edx
L3: inc esi
loop L1
PrintDec eax ;2 - 这是最后一位是 1 的字符的个数: e、i
PrintDec edx ;4 - 这是最后一位是 0 的字符的个数: D、l、p、h
ret
main endp
Win32ASM学习[11]:逻辑运算相关推荐
- 深度学习11个实用技巧
深度学习11个实用技巧 深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,本文增加了几个技巧,总结了11个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析 ...
- RxJava学习 - 11. Switching, Throttling, Windowing, and Buffering
RxJava学习 - 11. Switching, Throttling, Windowing, and Buffering Buffering Fixed-size buffering Time-b ...
- 深度学习-11:神经元、神经网络、人脑和卷积神网络
深度学习-11:神经元.神经网络.人脑和卷积神网络 深度学习原理与实践(开源图书)-总目录 在生物神经网络中,学习源自于大脑中无数神经元之间的连接.大脑接触到新的刺激后,这些神经元之间的连接改变了配置 ...
- 蓝桥杯单片机学习11——PCF8591A/DD/A转换芯片
上期我们学习了DS1302实时时钟的基本使用,现在我们来学习PCF8591A/D&D/A转换芯片的相关内容 蓝桥杯单片机学习11--PCF8591A/D&D/A转换芯片 PCF8591 ...
- STM32单片机学习(11) DS18B20温度传感器实验
STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口, ...
- 动手学深度学习 - 11.7. d2lzh 包索引
动手学深度学习 - 11.7. d2lzh 包索引 动手学深度学习 - Dive into Deep Learning Aston Zhang, Zachary C. Lipton, Mu Li, a ...
- Java学习-11 XML与JSON
Java学习-11 XML与JSON 1.XML 1.1.简介 可扩展标记语言(eXtensible Markup Language). 特性:1. xml具有平台无关性, 是一门独立的标记语言.2. ...
- python 命名实体识别_Python NLTK学习11(命名实体识别和关系抽取)
Python NLTK学习11(命名实体识别和关系抽取) 发表于: 2017年7月27日 阅读: 18262 除特别注明外,本站所有文章均为小杰Code原创 本系列博客为学习<用Python进 ...
- 微信小程序学习11:iconfont 网络字体图标使用(阿里巴巴)
微信小程序学习11:iconfont 网络字体图标使用(阿里巴巴) 使用方法 [1] 是直接下载图片,使用<image src="/static/images/v2.jpg" ...
最新文章
- css中对position的几种定位方式的最佳诠释
- 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)
- Ibatis 升级 Mybatis
- TypeScript里对数组元素的自定义属性排序的实现原理
- android 360自动更新,解决Android百度自动更新SDK和360自动更新SDK兼容
- m_map投影_M_Map说明书中文版.pdf
- HttpClient模拟客户端请求实例
- 【 Codeforces Round #547 (Div. 3) G】Privatization of Roads in Treeland【树上贪心问题】
- matlab2017b安装之后点桌面图标黑框闪退
- 虚函数表存储的位置(解析C++内存分配及其编译分段)
- 情境领导者-第四章、选择合适的领导风格
- 论文解读:Missing data imputation with adversarially-trained graph convolutional network
- 花菁染料Cy3.5 炔烃,Cy3.5 alkyne储存条件及光谱特性解析
- 阿拉伯数字转中文大写的方法
- 【C语言】冒泡排序学习笔记
- 对数据库视图view的理解
- 字符编码的常用种类介绍
- JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系
- 关于港澳通行证的办理和续签的问题总结
- 059 感情的维系在于什么?
热门文章
- 2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...
- 远程修改linux文件内容,用VS Code连接远程Linux服务器实时修改代码
- 怎样调用另一个html中的元素,html – 使用DIV作为另一个元素的背景
- 【CSS系列】CSS 实现必填项前/后添加红色星号
- 漫谈:Java和Python现在都挺火,我应该怎么选?Java和Python优缺点比较。
- php游客随机代码,php生成随机码的一段代码
- linux mysql 安装启动失败,Linux服务器一键安装包的mysql启动失败
- hive分区用2个字段有何限制_Hive分区表和桶表的使用
- mysql orderby多个_MySQL OrderBy
- php入口函数,php 常用的系统函数