文档章节

学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST

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

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>


AND: 逻辑与
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
AND r/m, r/m/i

 
 
 
 
 

 

 

  
; Test22_1.asm - 使用 AND 运算将一个数的第二、四位清零 .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 al, 00001111b and al, 11110101b PrintHex al ;05 - 00000101b ret main endp end main
; Test22_2.asm - 使用 AND 运算将字母转大写 .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 .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: 逻辑或
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
OR r/m, r/m/i

 
 
 
 
 

 

 

  
; Test22_3.asm - 使用 OR 运算确保一个数的第二、四位是 1 .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 al, 11110001b or al, 00001010b PrintHex al ;FB - 11111011b ret main endp end main
; Test22_4.asm - 使用 OR 运算将字母转小写 .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 .data szText db 'Delphi', 0 .code main proc lea esi, szText mov ecx, lengthof szText - 1 @@: or byte ptr [esi], 00100000b ;大写字母和小写字母只有第五位不同 inc esi loop @B PrintString szText ;delphi ret main endp end main

XOR: 逻辑异或
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
XOR r/m, r/m/i

 
 
 
 
 

 

 

  
; Test22_5.asm - 两次和一个相同的数 XOR 恢复到原来的数 .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 eax, 12345 xor eax, 88888888 PrintDec eax ;88892929 xor eax, 88888888 PrintDec eax ;12345 ret main endp end main
; Test22_6.asm - 使用 XOR 加密与解密字符串 .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 .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

 
 
 
 
 

 

 

  
; Test22_7.asm - 使用 NOT 加密与解密字符串 .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 .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 ;显示乱码 ;解密 lea esi, szText mov ecx, lengthof szText - 1 @@: not byte ptr [esi] inc esi loop @B PrintString szText ;Hello World! ret main endp end main

TEST: 测试逻辑与
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
TEST r/m, r/m/i

;TEST 同 AND, 但它不修改运算数, 只改变标志寄存器; 也就是尝试 AND 的结果
;常用到它对 ZF 的影响(结果为0时ZF=1)
;TEST 之后常常跟着条件跳转指令 JZ、JNZ

 
 
 
 
 

 

 

  
; Test22_8.asm - 观察 TEST 之后的零标志位(ZF) .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 ;判断字母 A 二进制(01000001)的其最后一位是否是 0, 如果是 0 那么 ZF=1 mov al, 'A' test al, 00000001b lahf PrintHex ah ;02 - 00000010b (ZF=0) ;判断字母 B 二进制(01000010)的其最后一位是否是 0, 如果是 0 那么 ZF=1 mov al, 'B' test al, 00000001b lahf PrintHex ah ;46 - 01000110b (ZF=1) ;判断 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, 为空) ret main endp end main
; Test22_9.asm - 判断字符串中每个字符的二进制位的最后一位是 1 还是 0 .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 .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 end main

涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中
请先登录后再评论。
[汇编]逻辑运算 => AND,OR,XOR,NOT

《The Art of Assembly Language》 Logical Operations on Bits 原文下载地址:http://kuai.xunlei.com/d/V6-BASHO7eB0UQQAa50 2013-04-22上传 20天有效 不续期 我是从下面的这个地址下载的,...

陈冠羽
2013/04/22
1.6K
0
汇编指令英文全称

一、数据传送指令 比如,mov(move)、push、pop、pushf(push flags)、popf(pop flags)、xchg(exchange)等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据...

_火狼_
2014/03/07
103
0
不学汇编是学不会操作系统的

  前些日子买了本《深入理解Linux内核》回来读,读了前面两三章,感觉我现在的水平不适合读这本书,里面有很多源代码片段,我应该了解内核的整个架构,再来看细节才对。于是重新找了一本《...

osc_9fryb40x
2018/07/27
2
0
博客总目录(2007.11.12 - 2010.4.25)

如果我的学习记录和历程能对你有所帮助, 我非常高兴; 但是 -- "万一" 不是高手、更不是大师, 只是利用工作之余学点东西, 并感觉学得挺吃力. 内容都是写时才会, 难免稚嫩, 所以 "仅供参考" 可...

涂孟超
2014/09/26
49
0
汇编指令介绍

8086汇编指令主要有以下几种: 1、数据传输指令 2、算术运算指令 3、逻辑运算指令 4、串指令 5、程序转移指令 6、伪指令 ----------------------------------------------------------------...

osc_13a0punx
2019/05/22
1
0

没有更多内容

加载失败,请刷新页面

加载更多

漫画 | 韭菜的自我修养!

osc_0vfknl5u
39分钟前
17
0
[Java] 使用ZipInputStream解析zip类文件(jar、docx)的范例

作者: zyl910 一、缘由 现在zip类的文件越来越多了,例如jar、docx。 有时我们需批量处理这些文件中的数据,若都是手工操作的话就太麻烦了。于是考虑编程自动处理。 Java提供了ZipInputStr...

osc_7dn4hojn
40分钟前
18
0
Java常用类-String类

字符串相关的类:String String类:代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作 为此类的实例实现。 String是一个final类,代表不可变的字符序列 当字符串重新赋值时,需要...

osc_mgvk29y5
41分钟前
5
0
Python处理json模块的详细介绍

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 首先,了解下什么是JSON? JSON:JavaScript Object Notatio...

osc_7bkuddw5
42分钟前
11
0
Go的100天之旅-04基础数据类型

基础数据类型 在变量的定义中,我们讲了每个变量是有类型的,类型在计算机中是用来约束数据的解释。Go语言和其它计算机语言一样,提供丰富了丰富的数据类型,我们就来看看到底有哪些类型,同...

osc_aazzok95
44分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部