标志寄存器
标志寄存器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中
计算分三步
- 先将低16位相加,完成后,CF记录本次进位值
- 再将中16位与CF相加,完成后,CF记录本次相加进位值
- 最后将高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
ax=bx,则ax-bx=0,zf=1
ax!=bx,则zf=0
ax<bx, 将产生借位,cf=1
ax>=bx, cf=0
ax>bx ,不产生借位结果又不为0,所以zf=0,cf=0
ax<=bx,可能产生借位结果也可能为0,所以zf=1或cf=1
这是无符号位的,还有有符号位的
同理
- ax=bx,则zf=1
- 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 |