汇编笔记8

第十一章 标志寄存器

标志寄存器(flag寄存器)在8086中结构如图
1

影响标志寄存器的大都是运算指令(逻辑和算数运算)

而传送指令(如mov push pop等)都不会影响标志寄存器

ps:inc 和dec 也不会影响标志寄存器

ZF(zero)零标志

  • 结果为0时:zf=1
  • 结果为非0时:zf=0

PF(parity)偶数标志

  • 结果的二进制有偶数个1时:pf=1
  • 奇数时:pf=0

SF(sign)负数标志

  • 结果为负时:sf=1
  • 结果为非负时:sf=0

CF(carry)进位(借位)标志

无符号运算

  • 结果存在向最高位的更高位进位(借位):cf=1
  • 没有进位(借位):cf=0

OF(overflow)溢出标志

有符号运算

  • 运算结果超过结果载体表示范围:of=1
  • ~ 没超过:of=0

DF(direction)方向标志与串传送指令

DF标志在串处理指令中,控制每次操作后si、di的增减

df=0:每次操作后si、di递增
指令cld 设置df=0

df=1:每次操作后si、di递减
指令std 设置df=1

  • movsb(字节串传送)
    实现的东西就相当于
    mov es:[di],ds[si] ;8086并不支持这样的指令
    inc si ;df=0
    inc di ;df=0

  • movsw(字型数据串传送) 类上

以上只是串传送的一个步骤,通常还要配合rep指令

如:rep movsb就相当于

1
2
s:movsb
loop s

它的循环次数也由cx决定

adc指令

操作格式:adc 对象1,对象2

功能: 对象1=对象1+对象2+cf

用来实现大数相加(可以处理进位)

sub指令

操作格式:sbb 对象1,对象2

功能: 对象1=对象1-对象2-cf

用来实现大数相减(可以处理借位)和adc的作用意义类似

cmp 指令与j类跳转指令

指令格式:cmp 对象1,对象2

实质上就是计算对象1-对象2,只不过不保留运算结果,通常用来与j类跳转指令配合使用

j类指令如下:

2

pushf 和 popf

  • pushf:将flag寄存器的值压栈
  • popf:将栈中的数据弹入到flag寄存器

Comments