标志寄存器是什么
在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 | mov ax,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 | add al,bl |
当数据较大时,我们可以使用多个寄存器来进行加法,先算低位,产生溢出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:从栈中弹出数据