一.逻辑与运算指令 AND
格式: AND OPRD1,OPRD2其中目的操作数OPRD1为任一通用寄存器或存储器操作数.源操作数OPRD2为立即数、任一通用寄存器或存储器操作数.
功能: 对两个操作数实现按位逻辑与运算,结果送至目的操作数.本指令可以进行字节或字
的‘与’运算.OPRD1<--OPRD1 and OPRD2.
说明: 1. 例如: AND AL,0FH ; (AL)<--(AL) AND 0FH
AND AX,BX ; (AX)<--(AX) AND (BX)
AND DX,BUFFER[SI+BX]
AND BETA[BX],00FFH
2. 本指令影响标志位PF、SF、ZF,使CF=0、OF=0.
例如,在同一个通用寄存器自身相与时,操作数虽不变,但使CF置零.本指令主要用于修改操作数或置某些位为零.
3. 上例中的每一条指令,将使AL寄存器的高4位置成零保持AL低4位值不变.
4. 两数相与,有一个数假则值为假
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
and小写转换大写
.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
格式: OR OPRD1,OPRD2
功能: 其中OPRD1、OPRD2含义与AND指令相同, 对标志位的影响也与AND指令相同.唯一不同的地方是,OR指令完成对两个操作数按位的‘或’运算,结果送至目的操作数中, 本指令可以进行字节或字的‘或’运算.
OPRD1<--OPRD1 OR OPRD2.
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
OR r/m, r/m/i
说明: 两数相或,有一个数为真则值为真
or 转小写
.data
szText db'Delphi', 0
.code
main proc
lea esi, szText
movecx,lengthof szText - 1
@@: or byte ptr [esi], 00100000b ;大写字母和小写字母只有第五位不同
inc esi
loop @B
PrintString szText ;delphi
ret
main endp
end main
---------------------------------------------------------------------------------------------------------------------------
逻辑异或运算指令 XOR
格式: XOR OPRD1,OPRD2
功能: 其在OPRD1、OPRD2的含义与AND指令相同,对标志位的影响与与AND指令相同.本指令的功能是实现两个操作数按位‘异或’运算,结果送至目的操作数中.它可以进行字节或字的‘异或’运算.OPRD1<--OPRD1 XOR OPRD2
;该指令会置 CF=OF=0; 其结果影响 SF、ZF、PF
;指令格式:
XOR r/m, r/m/i
两次和一个相同的数 XOR 恢复到原来的数
.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
.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 ;显示乱码
;解密
leaesi, szText
mov ecx, lengthof szText - 1
@@: notbyte ptr [esi]
inc esi
loop @B
PrintString szText ;Hello World!
ret
main endp
end main
-----------------------------------------------------------------------------------------------------------------
测试指令 TEST
格式: TEST OPRD1,OPRD2
功能: 其中OPRD1、OPRD2的含义同AND指令一样,也是对两个操作数进行按位的‘与’运算 ,唯一不同之处是不将‘与’的结果送目的操作数,即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位.
说明: TEST与AND指令的关系,有点类似于CMP与SUB指令之间的关系.
;判断字母 A 二进制(01000001)的其最后一位是否是 0, 如果是 0 那么 ZF=1
mov al, 'A'
test al, 00000001b
lahf
PrintHex ah ;02 - 00000010b (ZF=0)
;判断 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, 为空)
------------------------------------------------------------------------------
判断字符串中每个字符的二进制位的最后一位是 1 还是 0
------------------------------------------------------------------------------
.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