标志寄存器16位中只有9位有特殊作用

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CF 0 PF 0 AF 0 ZF SF TF IF DF OF 0 0 0 0

ZF

ZF含义是执行完指令后结果是否为0,为0,ZF=1,不为0,ZF=0

例如

mov ax,1 ;ZF=0
sub ax,1 ;ZF=1

PF

奇偶标志位,它记录相关指令执行后,其结果的所有bit为中1的个数是否为偶数,如果1的个数为偶数,pf=1,反之则为0

SF

符号标志位,看结果是否为负,如果为负,则SF=1

CF

进位标志位,一般情况下,对无符号数运算时,它记录了超过最高位的值

例如 ,add 255,255 这时已经超过最高位了,我们已经知道,超过最高位的数据都会被丢失,实际上它被保存在CF中,但只会保存一位

做减法时,还有可能发生错位,例如,两个8位数据,-4+5,将产生错位。错位后,相当于计算 252+5,超过255,因此会记录,因为无符号数中负数就是255-该值。小的减大的时会产生借位

OF

溢出标志位,在有符号数运算时,可能会产生溢出,即小于最小值或大于最大值,如果超出,就会让OF=1

adc指令

adc是带进位加法指令,它利用了CF位上记录的进位值

格式 adc 对象1,对象2

功能 对象1=对象1+对象2+CF


mov ax,2
mov bx,1
sub bx,ax
adc ax,1

执行后ax=4,adc执行时,相当于计算 ax+1+CF=2+1+1=4

这个指令有什么意义呢?实际上加法都可以分为两步操作,第一步是低位相加,第二步是高位相加再加上低位的进位,用汇编语言可以表示为

add al,bl
adc ah,bh

这样我们就可以对更大的数据进行运算

例:计算1EF0001000H+2010001EF0H,结果放在ax(最高16位),bx,cx中
计算分三步

  1. 先将低16位相加,完成后,CF记录本次进位值
  2. 再将中16位与CF相加,完成后,CF记录本次相加进位值
  3. 最后将高16位与CF相加
    mov ax,001eh
    mov bx,0f000h
    mov cx,1000h
    add cx,1ef0h
    add bx,1000h
    adc ax,0020h

sbb指令

带借位减法指令

格式 sbb 对象1,对象2

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

cmp指令

比较指令,相当于减法指令,但是不保存结果,只对标志寄存器产生影响

格式: cmp 对象1,对象2

功能: 对象1-对象2,但并不保存结果,对寄存器产生影响

例:

cmp ax,bx

  1. ax=bx,则ax-bx=0,zf=1

  2. ax!=bx,则zf=0

  3. ax<bx, 将产生借位,cf=1

  4. ax>=bx, cf=0

  5. ax>bx ,不产生借位结果又不为0,所以zf=0,cf=0

  6. ax<=bx,可能产生借位结果也可能为0,所以zf=1或cf=1

这是无符号位的,还有有符号位的

同理

  1. ax=bx,则zf=1
  2. ax!=bx,zf=0

但是这时就不能简单的用sf来判断了,因为sf只是符号标志位,它记录了计算结果的正负,但它并不能判断溢出。所以我们同时还要运用寄存器of来判断溢出

例: sf=1,of=0. of=0,说明没有溢出,直接用sf判断即可,sf=1说明ax<bx

sf=1,of=1.这样就说明有溢出,因此说明是由于溢出导致结果为负,所以真正的结果必然为正,所以ax>bx

sf=0,,of=1. 有溢出,ah<bh

标志寄存器在debug中的表示

标志 值为1的标记 值为0的标记
of ov nv
sf ng pl
zf zr nz
pf pe po
cf cy nc
df dn up