汇编语言——标志寄存器(基于8086CPU)

标志寄存器

在这里插入图片描述
debug查看标志寄存器位置:


右下角: NV UP EI PL NZ NA PO NC

溢出标志OF(Over flow flag) OV(1) NV(0)
方向标志DF(Direction flag) DN(1) UP(0)
中断标志IF(Interrupt flag) EI(1) DI(0)
陷阱标志位 TF: (是否单步调试 , 1表示是)
符号标志SF(Sign flag) NG(1,负号) PL(0,正号)
零标志ZF(Zero flag) ZR(1) NZ(0)
辅助标志AF(Auxiliary carry flag) AC(1) NA(0)
奇偶标志PF(Parity flag) PE(1) PO(0)
进位标志CF(Carry flag) CY(1) NC(0)

adc指令

  • 指令格式:adc 操作对象1, 操作对象2
  • 功能:操作对象1=操作对象1+操作对象2+CF
  • adc和add相配合就可以对更大的数据进行加法运算

对于有进位的操作,虽然两个inc si和add si 2 对si的结果一样,但是add会影响进位。如下,如果把两个inc si替换掉,就会因为进位标识符被重置导致结果不正确。

在这里插入图片描述

sbb指令

  • 指令格式:sbb 操作对象1, 操作对象2
  • 功能:操作对象1=操作对象1-操作对象2-CF
  • sbb 和sub相配合就可以对更大的数据进行减法运算
  • 例如在这里插入图片描述
  • 1000H-2000H = F000H 相当于跟上一位借了1,此时进制位也会置CY

cmp指令

  • 指令格式:cmp 操作对象1,操作对象2

  • 功能:计算,操作对象1 - 操作对象2,但是不保存结果,只根据计算结果对标志寄存器进行设置

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 用于比较运算

在这里插入图片描述

  • cmp设计思路:通过减法运算,影响标志寄存器。标志寄存器相关位记录了比较的结果

  • 对于有符号数,ah = FFH,代表ah = -1,因为超过127的都认为是负数,是补码

  • 对于有符号数的cmp比较,处理比较符号位,还需要比较溢出位

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 总结,溢出导致结果相反

检测比较结果的条件转移指令,利用cmp指令的结果,进行工作的指令

  • 根据无符号数比较结果进行转移的条件转移指令,检测ZF(0标志位)和CF(进位标志位)。
  • 根据有符号数比较结果进行转移的条件转移指令,检测ZF,CF和OF(溢出标志位)的值。
  • je等这些指令不关心前边是什么指令,只关心相应的标志位

je、jne、jb、jnb、ja、jna

在这里插入图片描述
各个字母的含义,j表示jump
在这里插入图片描述

DF标识和串传送指令

  • DF = 0 :每次操作后si,di递增
  • DF = 1 :每次操作后si,di递减

movsb和movsw:将ds:si指向的内存单元中的字节(movsb)或字(movsw)送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减。

  • movsb递增1
  • movsw递增2

rep指令。movsb经常和rep指令配合,rep的作用是根据cx的值重复执行后边的串传送指令。

  • 所以rep movsb可以实现循环传送cx个字符

改变DF的值

  • cld指令,将标志寄存器的DF置0
  • std指令:将标志寄存器的DF置1

pushf和popf,将标志寄存器的值压栈和出栈

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值