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

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

在这里插入图片描述

一、状态标志

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

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)
    对于有符号数,进行符号扩展
    ►前面加符号位(最高位)实现位数扩展
    在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,下面是汇编语言算术运算指令实验报告: 实验目的: 1. 理解汇编语言算术运算指令的含义和作用; 2. 掌握汇编语言算术运算指令的使用方法; 3. 学会设计和编写汇编程序。 实验内容: 本次实验主要涉及到以下算术运算指令: 1. ADD:加法指令,用于将源操作数加到目的操作数中,并将结果存储在目的操作数中。 2. SUB:减法指令,用于将源操作数从目的操作数中减去,并将结果存储在目的操作数中。 3. MUL:乘法指令,用于将源操作数与目的操作数相乘,并将结果存储在目的操作数中。 4. DIV:除法指令,用于将目的操作数除以源操作数,并将商存储在目的操作数中,余数存储在另一个寄存器中。 实验步骤: 1. 设计程序,包括变量的定义、常量的定义、算术运算的处理等。 2. 编写程序,按照步骤实现算术运算。 3. 调试程序,确保程序能够正确地实现算术运算。 4. 运行程序,观察结果是否正确。 实验结果: 下面是一个简单的加法程序: ``` ;定义变量和常量 .DATA X DW 10 Y DW 20 Z DW ? CONST DW 5 .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ;进行加法运算 MOV AX, X ADD AX, Y ADD AX, CONST MOV Z, AX MOV AH, 4CH INT 21H MAIN ENDP END MAIN ``` 运行结果为: Z = X + Y + CONST = 10 + 20 + 5 = 35 实验结论: 本次实验通过设计和编写汇编程序,实现了算术运算指令的处理,并且调试程序确保了程序能够正确地实现算术运算。通过实验,我深入理解了汇编语言算术运算指令的含义和作用,并且掌握了汇编语言算术运算指令的使用方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BkbK-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值