Win32ASM学习[11]:逻辑运算

  --------------------------------------------------------------------------------------------------------------------------- 

一.逻辑与运算指令 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值