博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
阅读量:5338 次
发布时间:2019-06-15

本文共 4829 字,大约阅读时间需要 16 分钟。

AND: 逻辑与


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

; Test22_1.asm - 使用 AND 运算将一个数的第二、四位清零.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc    mov al, 00001111b    and al, 11110101b     PrintHex al ;05 - 00000101b    retmain endpend main

; Test22_2.asm - 使用 AND 运算将字母转大写.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Delphi', 0.codemain proc    lea esi, szText    mov ecx, lengthof szText - 1@@: and byte ptr [esi], 11011111b ;大写字母和小写字母只有第五位不同    inc esi    loop @B    PrintString szText ;DELPHI    retmain endpend main

OR: 逻辑或


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

; Test22_3.asm - 使用 OR 运算确保一个数的第二、四位是 1.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc    mov al, 11110001b    or  al, 00001010b     PrintHex al ;FB - 11111011b    retmain endpend main

; Test22_4.asm - 使用 OR 运算将字母转小写.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Delphi', 0.codemain proc    lea esi, szText    mov ecx, lengthof szText - 1@@: or byte ptr [esi], 00100000b ;大写字母和小写字母只有第五位不同    inc esi    loop @B    PrintString szText ;delphi    retmain endpend main

XOR: 逻辑异或


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

; Test22_5.asm - 两次和一个相同的数 XOR 恢复到原来的数.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc    mov eax, 12345    xor eax, 88888888    PrintDec eax      ;88892929    xor eax, 88888888    PrintDec eax      ;12345    retmain endpend main

; Test22_6.asm - 使用 XOR 加密与解密字符串.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0.codemain 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!    retmain endpend main

NOT: 逻辑取反


;该指令不影响 EFlags;指令格式:NOT r/m

; Test22_7.asm - 使用 NOT 加密与解密字符串.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0.codemain 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!    retmain endpend 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, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain 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, 为空)    retmain endpend main

; Test22_9.asm - 判断字符串中每个字符的二进制位的最后一位是 1 还是 0.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Delphi', 0.codemain 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 L3L2: inc edxL3: inc esi    loop L1        PrintDec eax ;2 - 这是最后一位是 1 的字符的个数: e、i    PrintDec edx ;4 - 这是最后一位是 0 的字符的个数: D、l、p、h    retmain endpend main

转载于:https://www.cnblogs.com/dsli/p/7221499.html

你可能感兴趣的文章
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>