AND: 逻辑与


;该指令会置 CF=OF=; 其结果影响 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',
.code
main proc
  lea esi, szText
  mov ecx, lengthof szText -
@@: and byte ptr [esi], 11011111b ;大写字母和小写字母只有第五位不同
  inc esi
  loop @B
  PrintString szText ;DELPHI
  ret
main endp
end main

OR: 逻辑或


;该指令会置 CF=OF=; 其结果影响 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',
.code
main proc
  lea esi, szText
  mov ecx, lengthof szText -
@@: or byte ptr [esi], 00100000b ;大写字母和小写字母只有第五位不同
  inc esi
  loop @B
  PrintString szText ;delphi
  ret
main endp
end main

XOR: 逻辑异或


;该指令会置 CF=OF=; 其结果影响 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,
  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!',
.code
main proc
;加密
  lea esi, szText
  mov ecx, lengthof szText -
@@: xor byte ptr [esi], ;使用 123 做密码
  inc esi
  loop @B
  PrintString szText  ;显示乱码
 
;解密
  lea esi, szText
  mov ecx, lengthof szText -
@@: xor byte ptr [esi],
  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!',
.code
main proc
;加密
  lea esi, szText
  mov ecx, lengthof szText -
@@: not byte ptr [esi]
  inc esi
  loop @B
  PrintString szText ;显示乱码
 
;解密
  lea esi, szText
  mov ecx, lengthof szText -
@@: not byte ptr [esi]
  inc esi
  loop @B
  PrintString szText ;Hello World!
  ret
main endp
end main

TEST: 测试逻辑与


;该指令会置 CF=OF=; 其结果影响 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,
  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',
.code
main proc
;清空两个寄存器用于计数
  xor eax, eax
  xor edx, edx
 
  lea esi, szText        ;字符串地址
  mov ecx, lengthof szText - ;字符串长度
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

学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST的更多相关文章

  1. 学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程

    我觉得所谓的模块化有两种: "假模块化" 和 "真模块化". 所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.as ...

  2. 学 Win32 汇编[34] - 宏汇编(1)

    从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解. 宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ.textequ 或 = 来代替, ...

  3. 学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX

    汇编指令的一般性要求: 1.两个操作数的尺寸必须一致; 2.操作数不能同为内存. MOV(Move): 最常用的数据传送指令 ;该指令不影响 EFlags ;指令格式: (其中的 r.m.i 分别表示 ...

  4. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    http://www.cnblogs.com/del/archive/2010/04/16/1713886.html 跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: ...

  5. 学 Win32 汇编[20]: 洞察标志寄存器

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向 ...

  6. Win32汇编环境配置

    放假了,发现自己知识面窄,趁有时间就打算折腾下Win32汇编.其实在学校也上过汇编课,是基于dos的.那时老师不务正业,老跟我们讲政治经济文化,唯独不怎么讲课;再加上自己的问题,导致了dos汇编学得好 ...

  7. Cortex-A7处理器算数运算指令和逻辑运算指令

      汇编中也可以进行算术运算, 比如加减乘除,常用的运算指令用法如表所示: 常用运算指令 在嵌入式开发中最常会用的就是加减指令,乘除基本用不到. 我们用 C 语言进行CPU 寄存器配置的时候常常需要用 ...

  8. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  9. Win32汇编开始 Hello Asm

    今天开始学习Win32汇编 因为自己很多都是Windows方面 所以 接触一下Win32汇编 . ;.386指令集 .model flat,stdcall ;工作模式 option casemap:n ...

随机推荐

  1. java中常用的转义字符(转)

    Java编程中往往需要一些特殊操作,例如空格,换行.或者一些你使用特殊符号的意愿与程序中特殊符号意思冲突的时候,我们不能直接写就需要把这些符号转义,表达你的本意,并与程序中特殊符号做区分,这些都需要转 ...

  2. CentOS 安装MySQL5.7 源码方式安装

    MySQL rpm方式安装:https://www.cnblogs.com/deverz/p/9560403.html 1.卸载已经安装的MySQL yum list installed mysqlr ...

  3. Mybatis笔记 - SQL标签方法

    Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...

  4. Android 发布自动版本号方案

    以前看到一些自动化版本号打包的文章.如果您的项目是用 Git 管理的,并且恰巧又是使用 Gradle 编译(应该绝大部分都是这样的了吧?),本文试图找到一种更加优雅的自动版本管理方法. 背景 我们都知 ...

  5. how to convert from hex to disasm

    cat ascii.hex | ascii2binary -b h -t us > ascii.bin x86dis -e 0 -s att -f ascii.bin echo "d8 ...

  6. Rsync 实现服务器文件的同步——服务端的安装配置

    一.安装rsync 直接使用yum命令进行安装即可. yum -y install rsync 二.配置文件 网上大多教程都说安装是默认没有配置文件的,但是经过我的尝试,yum安装下默认是有配置文件的 ...

  7. spring data jpa 使用JPQL的方式查询

    用Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件,这时就可以使用@Query注解,结合JPQL的语句方式完成查询 @Que ...

  8. 调用WPF程序时传入参数

    http://blog.csdn.net/martin_cheng/article/details/41351013 http://blog.csdn.net/libby1984/article/de ...

  9. python-函数-动态传参,作用域的问题,函数嵌套,global nonlocal

    ⼀. 函数参数--动态传参 之前我们说过了传参, 如果我们需要给⼀个函数传参, ⽽参数⼜是不确定的. 或者我给⼀个 函数传很多参数, 我的形参就要写很多, 很⿇烦, 怎么办呢. 我们可以考虑使⽤动态参 ...

  10. SQL中的DDL、DML、DCL、TCL

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...