CPU内部的寄存器中,有一种特殊的寄存器,具有以下3种作用。
(1)用来存储相关指令的某些执行结果
(2)用来为CPU执行相关指令提供行为依据
(3)用来控制CPU的相关工作方式
这种寄存器在8086CPU中被称为标志寄存器。8086CPU的标志寄存器有16位,其中储存的信息常常被称为程序状态字(PSW),标志寄存器简称为flag
flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。其中1,3,5,12,13,14,15位在8086CPU中没有使用,不具有任何意义。
1.ZF标志
flag的6位是ZF,零标志位。它记录相关指令执行后,其结果是否为0。如果结果为0,那么ZF=1;如果结果不为0,那么ZF=0;
2.PF标志
flag的第2位是PF,奇偶标志位,它记录相关指令执行后,其结果的所有bit位中1的个数是为为偶数。如果1的个数为偶数,pf=1,如果为奇数,pf=0;
3.SF标志
flag的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负。如果为负,sf=1,如果非负,sf=0;
4.CF标志
flag的第0位是CF,进位标志位。一般情况,在进行无符号运算的时候,它记录了运算结果的最高有效位向更高进位的值,或从更高位的借位值。
5.OF标志
flag的第11位是OF,溢出标志位,一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1,如果没有,OF=0。
6.adc指令
adc是带进位加法指令,它利用了CF标志位上记录的进位值。
指令格式:adc 操作对象1 , 操作对象2
功能:操作对象1 = 操作对象1 + 操作对象2 + CF
比如指令 adc ax , bx实现的功能是:(ax) = (ax) + (bx) + CF
例:
mov ax , 2
mov bx , 1
sub bx , ax
adc ax , 1
执行后(ax)= 4,相当于计算:(ax) + 1 + CF = 2 + 1 + 1 = 4
mov al , 1
add ax , ax
adc ax , 3
执行后,(ax) = 5,相当于计算:(ax)+ 3 + CF = 2 + 3 + 0 = 5
7.sbb指令
sbb指令时带借位减法指令,它利用CF位上记录的借位器
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1 = 操作对象1 - 操作对象2 - CF
比如指令:sbb ax , bx实现的功能是:(ax)= (ax)- (bx) - CF
8.cmp指令
cmp指令是比较指令,cmp的功能相当于减法指令,只是不保存结果。
cmp指令格式:cmp 操作对象1 , 操作对象2
功能:计算操作对象1 - 操作对象2,但并不保存结果,仅仅根据计算结果对标志寄存器产生影响。
9.pushf和popf
pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。