zoukankan      html  css  js  c++  java
  • 汇编基础教程(二)——常用汇编指令之运算指令

    原文地址:http://www.tinpont.com/knowledge/assembly_instruction_operator.html

    -------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------

    在上一篇我们学会了赋值部分的常用汇编指令,这次我们来学习一下运算指令。

    运算指令包括加减乘除、位操作指令等可以进行运算的指令,下面我们来了解一下。


    ADD加法指令(add)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    ADD dst,src

    伪C代码为dst += src,dst可以是寄存器、地址,不可以是立即数;src可以是寄存器、地址和立即数,dst和src不能同时为地址。例如:
    1
    2
    3
    4
    ADD EAX,1    // 寄存器EAX的值加1
    ADD EAX,EBX    // 寄存器EAX等于寄存器EAX加上寄存器EBX的值
    ADD EAX,[20401000]    // 寄存器EAX等于寄存器EAX加上地址为20401000处的值
    ADD [02401000],EAX    // 地址02401000处的值为其原值加上寄存器EAX的值



    INC加一指令(increase)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    INC dst

    伪C代码为dst ++,dst可以是寄存器和地址,不可以是立即数。例如:
    1
    2
    INC EAX    // 寄存器EAX等于寄存器EAX加1
    INC BYTE PTR [02401000]    // 地址02401000处的值为其1byte大小的原值加1



    SUB减法指令(subtract)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    SUB dst,src

    此指令与ADD类似,伪C代码为dst -= src,示例如下:
    1
    2
    3
    4
    SUB EAX,1    // 寄存器EAX的值减去1
    SUB EAX,EBX    // 寄存器EAX等于寄存器EAX减去寄存器EBX的值
    SUB EAX,[20401000]    // 寄存器EAX等于寄存器EAX减去地址为20401000处的值
    SUB [02401000],EAX    // 地址02401000处的值为其原值减去寄存器EAX的值



    DEC减一指令(decrease)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    DEC dst

    此指令与INC指令类似,伪C代码为dst --,例如:
    1
    2
    DEC EAX    // 寄存器EAX等于寄存器EAX减1
    DEC BYTE PTR [02401000]    // 地址02401000处的值为其1byte大小的原值减1



    MUL/IMUL乘法指令(multiplie)


    此指令会设置相关Eflags寄存器,MUL是无符号乘法指令,IMUL是带符号乘法指令,格式如下:
    1
    MUL/IMUL dst

    此指令有点特殊,需要区别记忆。
    在32位下,规定寄存器EAX为乘数,dst为被乘数,其结果最大为64位,所以把EDX作为结果的高位,EAX作为结果的低位,即EDX:EAX。
    在16位下,规定寄存器AX为乘数,dst为被乘数,其结果最大为32位,DX作为结果的高位,AX作为结果的低位,即DX:AX。
    在8位下,规定寄存器AL为乘数,dst为被乘数,其结果最大为16位,存放于AX。
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    MOV EDX,6    // 寄存器EDX赋值6
    MOV EAX,2    // 寄存器EAX赋值2
    MOV EBX,3    // 寄存器EBX赋值3
    MUL EBX    // 执行后,EBX * EAX = 2 * 3 = 6,寄存器EDX为0,寄存器EAX为6
    MOV EDX,6    // 寄存器EDX赋值6
    MOV EAX,2    // 寄存器EAX赋值2
    MOV EBX,3    // 寄存器EBX赋值3
    MUL BL    // 执行后,BL * AL = 2 * 3 = 6,寄存器EDX不受影响,值为6,寄存器AX为6



    DIV/IDIV除法指令(divide)


    此指令会设置相关Eflags寄存器,DIV是无符号乘法指令,IDIV是带符号乘法指令,格式如下:
    1
    DIV/IDIV dst

    此指令有点特殊,需要区别记忆。
    在32位下,规定EDX:EAX为被除数,dst为除数,其商放于寄存器EAX,余数放于寄存器EDX;
    在16位下,规定DX:AX为被除数,dst为除数,其商放于寄存器AX,余数放于寄存器DX;
    在8位下,规定AX为被除数,dst为除数,其商放于寄存器AL,余数放于寄存器AH。例如:
    1
    2
    3
    4
    5
    6
    7
    8
    MOV EDX,0    // 寄存器EDX赋值0
    MOV EAX,7    // 寄存器EAX赋值7
    MOV EBX,2    // 寄存器EBX赋值2
    DIV EBX    // 执行后,EDX:EAX / EBX = 7 / 2 = 3 % 1,EAX值为3,EDX值为1
    MOV EDX,6    // 寄存器EDX赋值6
    MOV EAX,7    // 寄存器EAX赋值7
    MOV EBX,2    // 寄存器EBX赋值2
    DIV BL    // 执行后,AX / BL = 7 / 2 = 3 % 1,AL值为3,AH值为1,AX的值为0x103



    AND逻辑与指令(and)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    AND dst,src

    把dst与src进行逻辑与操作,位同时为1则设为1,其他情况设为0,伪C代码dst &= src,例如:
    1
    2
    3
    MOV AL,30    // 寄存器AL赋值00110000(0x30)
    MOV BL,25    // 寄存器BL赋值00100101(0x25)
    AND AL,BL    // AL = AL & BL = 100000(0x20)



    OR逻辑或指令(or)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    OR dst,src

    把dst与src进行逻辑或操作,位同时为0则设为0,其他情况设为1,伪C代码dst |= src,例如:
    1
    2
    3
    MOV AL,30    // 寄存器AL赋值00110000(0x30)
    MOV BL,25    // 寄存器BL赋值00100101(0x25)
    OR AL,BL    // AL = AL | BL = 00110101(0x35)



    XOR逻辑异或指令(xor)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    XOR dst,src

    把dst与src进行逻辑异或操作,位相同时设为0,相反时设为1,伪C代码dst ^= src,例如:
    1
    2
    3
    4
    5
    MOV AL,30    // 寄存器AL赋值00110000(0x30)
    MOV BL,25    // 寄存器BL赋值00100101(0x25)
    XOR AL,BL    // AL = AL ^ BL = 0010101(0x15)
    XOR AL,BL    // AL = AL ^ BL = 00110000(0x30),执行两次之后会还原原值,多用于可解密加密
    XOR AL,AL    // AL = AL ^ AL = 0,多用于清0寄存器



    NOT逻辑非指令(not)


    此指令会设置相关Eflags寄存器,格式如下:
    1
    NOT src

    把src进行逻辑非操作,所有位设为相反,伪C代码src ~= src,例如:
    1
    2
    MOV AL,30    // 寄存器AL赋值00110000(0x30)
    NOT AL    // AL = ~AL = 11001111(0xCF)
  • 相关阅读:
    使用事件模式(Event API)读取Excel2007(.xlsx)文件
    rocketMq消息的发送和消息消费
    Java 七牛云存储与下载
    Spring boot + Jpa + Maven + Mysql 初级整合
    Spring+SpringMvc+Hibernate整合记录
    Mybatis-Generator自动生成代码
    idea spring+springmvc+mybatis环境配置整合详解
    Linux下安装redis
    SpringMvc的基础配置<一>
    JAVA从本机获取IP地址
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314759.html
Copyright © 2011-2022 走看看