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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript消息框

1.警告框 function myTest(){alert("这里的内容会弹出");} 2.确认框 其返回的值是 true 或 false 。 function myTest(){confirm("这里的内容会弹出");} 3.提示框 prompt prompt(参数1&#xff0c;参数2)&#xff1a;其参数1 是显示提示要输入的信息&…

.Net 事务

在分布式应用程序中&#xff0c;不可避免地会经常使用到事务控制。事务有一个开头和一个结尾&#xff0c;它们指定了事务的边界&#xff0c;事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性&#xff0c;事务必须…

Win32ASM学习[12]:位测试指令位扫描指令

----------------------------------------------------------------------------------------------------------------------- 一.BT 指令 格式: BT OPD,OPS 功能: 目的操作数OPD中由源操作数OPS指定的位送CF标志 说明: 1. 在指令中,目的操作数OPD只能是16/32位通用寄存器…

Android WifiDisplay分析一:相关Service的启动

网址&#xff1a;http://www.2cto.com/kf/201404/290996.html 最近在学习Android 4.4上面的WifiDisplay(Miracast)相关的模块&#xff0c;这里先从WifiDisplay用到的各个Service讲起&#xff0c;然后再从WifiDisplaySettings里面讲解打开wfd的流程。首先看下面的主要几个Servic…

mvc controller跳转页面方法

1、直接Redirect后加 Controller/Action Response.Redirect("/User/Edit"); // return Redirect("/User/Edit"); return RedirectToAction("about","Home"); Response.Redirect("/User/Edit"); 2、直接r…

Win32ASM学习[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD

一. SHL、SHR、SAL、SAR: 移位指令 ---------------------------------------------------------------------------------------------------- ;SHL(Shift Left): 逻辑左移 ;SHR(Shift Right): 逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shift Ari…

angular中的表单验证

angular中的表单验证很强大&#xff0c; 一共有5中验证信息&#xff0c;$valid,$invalid,$pristine,$dirty,$error. $valid-----当验证通过的时候&#xff0c;为true,不通过的时候为false $invalid----当验证不通过的时候&#xff0c;为true&#xff0c;通过的时候为true $pris…

Cortex-A15 Memory Hierarchy

ARM 平台为实现速度和成本的平衡&#xff0c;使用多个层次的内存架构。对于多核 CPU 组成的 SOC&#xff0c;每个CPU 内部都有一组高速缓存&#xff0c;包含&#xff1a;ICache、DCache 和 TLB。多个 CPU 共享一个更大的 L2 缓存。L2缓存再和 CPU 外部的DDR3 内存交互。ICache …

Win32ASM学习[14]:符号扩展指令: CBW,CWDE,CDQ,CWD

----------------------------------------------------------------------------------------------------------------------------------------------------------------- ;CBW(Convert Byte to Word): 将 AL 扩展为 AX ;CWDE(Convert Word to Extended Double): 将 …

Win32ASM学习[15]:加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;INC(Increment): 加一 ;DEC(Decrement): 减一 ;NEG(Negate): 求补(求反) ;ADD(Add): 加 ;A…

UINavigationController的简单使用

UINavigationController的使用步骤初始化UINavigationController设置UIWindow的rootViewController为UINavigationController根据具体情况&#xff0c;通过push方法添加对应个数的子控制器UINavigationController的子控制器UINavigationController以栈的形式保存子控制器proper…

Android 图片的缩略图

<1>简介 之前往往是通过Bitmap、Drawable和Canvas配合完成&#xff0c;需要写一系列繁杂的逻辑去缩小原有图片&#xff0c;从而得到缩略图。 现在我给大家介绍一种比较简单的方法&#xff1a;&#xff08;网上有&#xff09; 在Android 2.2版本中&#xff0c;新增了一个T…

Win32ASM学习[16] :乘除指令: MUL、IMUL、DIV、IDIV

---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 一. 无符号数乘法指令 MUL(MULtiply) 格式: MUL OPRD 功能: 乘法操作. 说明: 1. OPRD为通用…

Linux命令之man

一、引言 一直听别人说linux下有个男人很厉害&#xff0c;遇到不会的不懂的都可以问他&#xff0c;自己也会几个man命令&#xff0c;但是一直不知道到底man命令是怎么用的&#xff0c;比如查询不同类的帮助该在man后跟数字几&#xff0c;man后的数字有什么具体的意思&#xff0…

《JavaScript权威指南》学习笔记 第二天 下好一盘大棋

前段学习js的时候总是零零散散的&#xff0c;以至于很多东西都模棱两可。时间稍微一久&#xff0c;就容易忘记。最主要的原因是这些东西&#xff0c;原来学的时候就不是太懂&#xff0c;以至于和其他知识无法形成记忆链&#xff0c;所以孤零零的知识特别容易忘记。重温犀牛书&a…

Win32ASM学习[17]:条件跳转

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 一.跳转相关的标志位: 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF Z…

SUID或SGID程序中能不能用system函数

system()函数的声明和说明如下&#xff1a; 注意它的描述那里&#xff0c;system()执行一个由command参数定义的命令&#xff0c;通过调用/bin/sh -c命令来实现这个功能。也就是说它的逻辑是这样的&#xff01; 进程调用system函数&#xff0c;system函数调用fork创建一个子进程…

史上最全的maven pom.xml文件教程详解

<project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd >; <!-- 父项目的坐标。如果项目中没有规定某个元素的值&am…

Win32ASM学习[18]:串指令-MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE

-------------------------------------------------------------------------------------------------------------------------------------------------------- 一.字符串传送指令 MOVSB/MOVSW/MOVSD 格式: MOVS OPD,OPS 功能: OPD<--OPS. 说明: 1. 其中OPS为源串符…

Xamarin iOS编写第一个应用程序创建工程

Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后&#xff0c;就可以在Xamarin Studio中编写程序了。本节将主要讲解在Xamarin Studio中如何进行工程的创建以及编写代码等内容XamariniOS编写第一个应用程序创建工程本文选自Xamarin iOS开发实战大学霸。 1.3.…