学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
2021/4/30 12:25:15
本文主要是介绍学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
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
posted on 2010-04-14 15:30 万一 阅读(17931) 评论(0) 编辑 收藏
这篇关于学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略