文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 1125
阅读 4
收藏 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

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

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
关于汇编语言寄存器和指令操作的整理

最近汇编学到后面的内容, 越来越觉得前面的基础没有掌握好, 弄得最后编写汇编程序的时候, 寄存器瞎用, 没有一点的规矩, 中断操作也不知道是对哪个寄存器里的数进行操作, 每次做一个小程序, 都...

如风达
2016/09/04
25
0
聊聊从逻辑门到操作系统的计算机

前言 现代计算机已经发展的非常复杂,要理解计算机的运行原理都已经变得异常艰难,虽说我们无法亲自去制造他,但我们可以了解下计算机系统是怎么从0发展而来的。 逻辑门 逻辑门是计算机的基础...

超人汪小建
2018/07/02
0
0
SHA512编程实现与优化之一:maj函数

SHA512算法中的maj函数可以C函数简单方便地实现: 从字面上看,逻辑乘"&"有3次,异或"^"有2次,事实真的如此吗? 将此函数编译成汇编语言得到如下结果:(注释是我后加上的) 阅读汇编代码可知...

safedead
2016/05/20
49
0
汇编语言指令英文全称

1.通用数据传送指令 MOV----> move MOV dest,src;dest←src MOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。 MOVSX---->extended move with sign data MOVZX---->extended mo......

伽罗kapple
2015/10/24
155
0
ASM - 条件判断

技术交流,DH讲解. 正式之前,我们看看寄存器和CPU的标志位: OD中的截图,下方的CPAZSTDO就是标志位. Delphi的FPU窗口,右边一列就是标志位. 为什么要给大家看标志位呢?因为ASM中的跳转语句都是由...

伽罗kapple
2015/12/11
54
0

没有更多内容

加载失败,请刷新页面

加载更多

嵌入式应用选择合适的微控制器

准备所需硬件接口列表 使用微控制器的基本硬件框图,准备一份微控制器需要支持的所有外设接口的列表。微控制器中有两种常见的接口类型需要列出。第一种是通信接口,这些是外围设备,如USB,S...

linuxCool
10分钟前
1
0
Group by使用

概述 GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类似Excel里面的透视表。 GROUP BY必须得配合...

小橙子的曼曼
21分钟前
1
0
机械臂写中文

Make Me a Hanzi https://www.skishore.me/makemeahanzi/ 使用uArm Swift Pro机械臂写中文-毛笔字 https://github.com/makelove/Robot_Arm_Write_Chinese...

itfanr
33分钟前
0
0
OSChina 周三乱弹 —— 孤独到都和病毒发生了感情了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 逃跑计划《一万次悲伤 (Live)》 《一万次悲伤 (Live)》- 逃跑计划 手机党少年们想听歌,请使劲儿戳(这里) 现在...

小小编辑
今天
979
13
test

//// main.c// Test//// Created by 吕颖 on 2019/1/16.// Copyright © 2019年 carmen. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <t......

carmen-ly
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部