标志寄存器是什么

在8086CPU中标志寄存器是一个特殊的寄存器,具有以下3中功能:

1.用来存储相关指令的某些执行结果
2.用来为CPU执行相关指令提供行为依据
3.用来控制CPU的相关工作方式

标志寄存器有16位,每一位都有专门的含义,记录特定的信息。

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

ZF标志

ZF是第六位,它记录了相关指令执行后,其结果是否为0,如果为0,那么ZF=1;否则ZF=0

1
2
mov ax,1
sub ax,1 ;此时ZF=1

注意:mov,push等传送指令对标志寄存器没有影响!!!。对后面的寄存器也用

PF标志

PF是第二位,它记录了相关指令执行后,其结果的所有bit位中的1的奇偶个数。当1的个数为偶数>时,PF=1;否则PF=0

SF标志

SF是第七位,它记录相关指令执行后,其结果是否为负数。如果为负数,SF=1;否则SF=0

CF标志

进位标志符CF是第零位,它记录相关指令执行后,是否使用到更高位。一般用于无符号数的运算

我们在执行0001减去1111时,会发现不够减,于是向高位借一位,变成10001减去1111,此时CF=1.
同样加法也是,当我们相加结果大于位数时,就会进一位,此时也有CF=1。

OF标志

OF是第十一位,它记录了相关指令执行后,是否溢出。与CF相对,一般使用与有符号数的运算

adc指令

adc是带进位加法
指令:adc 操作数1,操作数2
功能:(ax)=(操作数1)+(操作数2)+CF

作用:计算较大的数时进位。

1
2
3
add al,bl
adc ah,bh
;低位相加,如果产生溢出是无法表达的,同时高位也相加,将溢出的值加上溢出的1(CF)就是正确结果了.

当数据较大时,我们可以使用多个寄存器来进行加法,先算低位,产生溢出CF就为1,然后算高位时就可以得到正确结果了。

sbb指令

sbb是带借位减法指令
用法与adc相同
功能:(ax)=(ax)-(bx)-CF

cmp指令

cmp指令是比较指令。
功能相当于减法指令,只是不保存结果,如果两个对象相等,ZF=1,PF=1,SF=0,CF=0,OF=0

有条件的转移指令

指令 含义 检测的相关标志位
je 等于则转移 ZF=1
jne 不等于则转移 ZF=-
jb 低于则转移 CF=1
jnb 不低于则转移 CF=0
ja 高于则转移 CF=0且ZF-0
jna 不高于则转移 CF=1或ZF=1

DF标志和串传送指令

方向标志符DF是第十位。决定si,di寄存器的值改变方向。当DF=0,每次操作后si,di递增;当DF=1,si,di递减。

movsb:根据DF传输串,每传输完一个字节,si,di自增1(或者自减1)
movsw:功能与movsb相同,传输字。si,di递增2(或者递减)

在传送的时候我们肯定还会遇到一个问题,要传送多少次,这个时候就要结合rep指令

rep movsb
功能:相当与loop指令,根据cx的值来判断执行多少次。

修改DF的值

cld:DF=0
std:DF=1

pushf和popf

pushf:将标志寄存器的值压入栈
popf:从栈中弹出数据