汇编语言通用数据处理指令——算术运算类指令

Posted BkbK-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言通用数据处理指令——算术运算类指令相关的知识,希望对你有一定的参考价值。

通用数据处理指令——算术运算类指令

文章目录

一、状态标志

状态标志是处理器最基本的标志
►一方面:作为加减运算和逻辑运算的辅助结果
►另一方面:构成各种条件,实现程序分支

1.进位标志CF(Carry Flag)

  • 当加减运算结果的最高有效位有进位(加法)或借位(减 法)时,进位标志置1,即CF=1;否则CF=0

  • 针对无符号整数,判断加减结果是否超出表达范围
    无符号整数的表达范围:

    N位8位16位32位
    0~ 2 N − 1 2^N-1 2N10~2550~65535 0 ~ 2 32 − 1 0~2^32-1 02321

2.溢出标志OF(Overflow Flag)

  • 有符号数加减结果有溢出,则OF=1;否则OF=0

  • 针对有符号整数,判断加减结果是否超出表达范围

    有符号整数(补码)的表达范围

    N位8位16位32位
    − 2 N − 1 -2^N-1 2N1 2 N − 1 − 1 2^N-1-1 2N11-128~127-32768~32767- 2 31 2^31 231 2 31 − 1 2^31-1 2311

进位和溢出的区别

  • 进位标志反映无符号整数运算结果是否超出范围
    ►有进位,加上进位或借位后运算结果仍然正确
  • 溢出标志反映有符号整数运算结果是否超出范围
    ►有溢出,运算结果已经不正确 处理器按照无符号整数求得结果
    ►设置进位标志CF
    ►设置溢出标志OF

3.零标志ZF(Zero Flag)

运算结果为0,则ZF=1,否则ZF=0

结果是0,ZF标志不是0 !)

  • 8位二进制数相加:结果不是0,ZF=0

    00111010+01111100=10110110
    
  • 8位二进制数相加:结果是0,ZF=1

    10000100+01111100=100000000
    

4.奇偶标志PF(Parity Flag)

当运算结果最低字节中“1”的个数为零或偶数时,PF=1;否则PF=0

仅最低8位“1”的个数

  • 8位二进制数相加: “1”的个数为5个,PF=0

    00111010+01111100=10110110
    
  • 8位二进制数相加: “1”的个数为0个,PF=1

    10000100+01111100=100000000
    

5.影响状态标志的指令

  • 需要关注对标志影响的主要指令:
    加减运算指令、逻辑运算指令、移位指令等
  • 只用于影响标志的特殊指令1:比较指令CMP
    ►进行减法运算
    ►用于判断两个数据大小、是否相等
  • 只用于影响标志的特殊指令2:测试指令TEST
    ►进行逻辑与运算
    ►用于判断某位为0或为1等

二、算术运算类指令

1.加法指令ADD指令

  • 加法指令 ADD
  • 带进位加法指令 ADC
  • 增量指令 INC

►除INC不影响进位标志CF外,其他指令按定义影响全部状态标志位 即,按照运算结果相应设置各个状态标志为0或为1

目的操作数加上源操作数,和送到目的操作数

ADD reg, imm/reg/mem

;reg←reg+imm/reg/mem

ADD mem, imm/reg

;mem←mem+imm/reg

  • 大写字母转换为小写可以用ADD:

    确认是大写字母, 加20H为小写字母

    add al,20h ;20H='a' - 'A'
    

    20H=’ '(空格字符)

2.减法指令SUB指令

  • 减法指令 SUB
  • 带借位减法指令 SBB
  • 减量指令 DEC
  • 求补指令 NEG

►除DEC不影响CF标志外
►其他按定义影响全部状态标志位

目的操作数减去源操作数,差送到目的操作数

SUB reg,imm/reg/mem

reg←reg-imm/reg/mem

SUB mem,imm/reg

mem←mem-imm/reg

  • 小写字母转换为大写可以用SUB

    确认是小写字母, 减20H为大写字母

    sub al,20h ;20H='a' - 'A'
    

    20H=’ '(空格字符)

3.ADC和SBB指令

ADC和SBB指令是带进(借)位的加法、减法指令,支持8、16和32位加法、减法运算。并按照8、16和32位相应影响状态标志,但PF标志只利用低8位结果。

  • dest←dest + src +CF

    ADC dest, src
    
  • dest←dest – src – CF

    SBB dest, src
    

ADC和ADD、SBB和SUB相结合实现高精度数的加减法:

►先用ADD/SUB指令将两个操作数的低32位相加减
►再用ADC/SBB指令加减高位部分
►并将进位加到高位、或高位减去借位

4.INC、DEC和NEG指令

(1)增量指令INC(increment)

  • 只有一个操作数:寄存器或存储单元

  • 对操作数加1(增量)再将结果返回原处

    INC reg/mem ;加1:reg/mem←reg/mem+1 
    
  • 用于计数器和地址指针的调整
    ►不影响进位CF标志,影响其他状态标志位

inc ecx
inc dword ptr [ebx]
inc wvar
inc bl
inc word ptr [esi] 
inc wvar[edi]

(2)减量指令DEC(decrement)

  • 只有一个操作数:寄存器或存储单元

  • 对操作数减1(减量)再将结果返回原处

    DEC reg/mem ;减1:reg/mem←reg/mem-1 
    
  • 用于计数器和地址指针的调整
    ►不影响进位CF标志,影响其他状态标志位

dec cx
dec byte ptr [ebx]
dec wvar
dec bl
dec word ptr [esi] 
dec wvar[edi]

(3)求补指令NEG(negative)

  • 对操作数执行求补运算,即用零减去操作数

    NEG reg/mem ;reg/mem←0-reg/mem
    
  • 对标志的影响与用零作减法的SUB指令一样

  • 可用于对负数求补码或由补码求其绝对值

neg al
neg byte ptr [ebx]
neg wvar[esi]
neg ax
neg word ptr [ebx] 
neg wvar[edi]

5.乘法指令

  • 基本的乘法指令MUL(multiplication)

    两数相乘、乘积倍长

    无符号数乘法指令

    MUL reg/mem
    

    有符号数乘法指令

    IMUL reg/mem
    

    ;8位乘法(r8/m8)

    AX=AL×r8/m8
    

    ;16位乘法(r16/m16)

    DX.AX=AX×r16/m16
    

    ;32位乘法(r32/m32)

    EDX.EAX=EAX×r32/m32
    
  • 乘积不倍长的乘法指令

    乘积不倍长,注意溢出 CF=OF=1,表示溢出

    双操作数乘法指令

    IMUL reg, reg/mem/imm
    

    3操作数乘法指令

    IMUL reg, reg/mem, imm
    

    16位乘法

    r16=r16×r16/m16/i16/i8
    
    r16=r16/m16×i16/i8
    

    32位乘法(r32/m32)

    r32=r32×r32/m32/i32/i8
    
    r32=r32/m32×i32/i8
    

6.除法指令

无符号数除法指令

DIV reg/mem

有符号数除法指令

IDIV reg/mem

8位除法(r8/m8)

AX÷r8/m8,
AL=商、AH=余数

16位除法(r16/m16)

DX.AX÷r16/m16,
AX=商、DX=余数

32位除法(r32/m32)

EDX.EAX÷r32/m32,
EAX=商、EDX=余数

除数为0,或者商超出表达范围,则发生除法溢出 发生除法溢出错误,将产生编号为0的内部中断(异常)

7.零位扩展和符号扩展

  • 零位扩展(Zero Extension)
    对于无符号数,进行零位扩展
    ►前面加0实现位数扩展

  • 符号扩展(Sign Extension)
    对于有符号数,进行符号扩展
    ►前面加符号位(最高位)实现位数扩展

以上是关于汇编语言通用数据处理指令——算术运算类指令的主要内容,如果未能解决你的问题,请参考以下文章

汇编--算术运算类指令

汇编语言通用数据处理指令——位操作类指令

汇编语言通用数据处理指令——位操作类指令

8086算术运算类指令

Intel 8080 指令(考试版)

x86汇编指令详解