1.ZF
零标志位,执行指令后结果为0,ZF=1,否则ZF=0
2.PF
奇偶标识位,它记录相关指令执行后,其结果的所有二进制位中1的个数是否为偶数,如果是偶数,PF=1,否则PF=1。
3.SF
符号标识位,它记录相关指令执行后,其结果是否为负,如果是负数SF=1,否则,SF=0
SF是CPU对有符号数进行运算结果的一种记录,它记录数据的正负。在我们将数据当做有符号数来运算的时候,可以通过它得知结果的正负。如果我们将数据当做无符号数运算,SF的值则没有意思,虽然相关的指令影响了它的值。也就说,CPU执行add等指令事,是必然要影响到SF的,至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。比如:
mov al,10000001B
add al,1
执行后,结果为10000010B,SF=1,表示:如果指令进行有符号数运算,那么结果为负;
mov al,10000001B
add al,01111111B
执行后,结果为0,SF=0,表示:如果指令进行的是有符号书运算,那么结果非负。
4.CF
进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
比如两个8位数据,98H+98H,将产生进位。由于这个进位值在8位数中无法保存,我们在前面的课程中,就只简单地说这个进位丢失了。其实CPU在运算的时候,并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上。8086CPU就用了CF位来记录进位值。
mov al,98H
add al,al ;执行后(al)=30H,CF=1
add al,al ;执行后(al)=60H,CF=0
5.OF标志
在进行有符号运算时,结果超过机器所能表示的范围将溢出。OF=1,溢出,否则无溢出。
总结一下CF和OF的区别:
CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位,比如:
mov al,98
add al,99
add指令执行后,CF=0,OF=1。CPU在执行add等指令时,包含两种意义:无符号运算和有符号运算。对于无符号运算,CPU用CF记录是否进位;对于有符号运算,CPU用OF记录是否溢出,当然,还要用SF记录结果的符号。对于无符号运算,98+99没有进位,CF=0;对于有符号运算98+99发生溢出,OF=1。
mov al,0F0H
add al,088H
add指令执行后,CF=,OF=1。对于无符号数运算,0F0H+88H有进位,CF=1;对于有符号位运算,0F0H+88H发生溢出,OF=1。
我们可以看出,CF和OF所表示的进位和溢出,是分别对无符号数和有符号数而言,他们没有一点关系。