CPU内部的寄存器中,有一种特殊的寄存器 具有以下3种作用:

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

这种特殊的寄存器在8086CPU中,被称为标志寄存器(FR)

FR与其它寄存器不一样,其它寄存器是用来存放数据的,都是整个寄存器具有一个含义,而FR寄存器是按位起作用的,也就是说它的每一位都有专门的含义,记录特定的信息。

下面是8086CPU的FR寄存器的结构:

1514131211109876543210
OFDFIFTFSFZFAFPFCF

可以发现第1、3、5、12、13、14、15位是空白位,这是没有使用,不具有任何意义的空白位

名字符号




0
2
4
6
7
11
进位标志/Carry Flag 
奇偶标志/Parity Flag 
辅助进位标志/Auxiliary Carry Flag
零标志/Zero Flag
符号标志/Sign Flag
溢出标志/Overflow Flag
CF
PF
AF
ZF
SF
OF



8
9
10
跟踪标志/Trace Flag
中断标志/Interrupt Flag
方向标志/Direction Flag
TF
IF
DF

一、状态标志

表示由于执行指令而导致的处理器的状态

1.进位标志(CF):主要用来反映运算是否产生进位借位。在进行无符号数运算的时候,如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。  

比如,两个8位数据:98H+98H,将产生进位,这个进位值就用CF标志位来保存。

比如,下面的指令:

MOV AL,98H	;AL的值为98H
ADD AL,AL	;AL=AL+AL

执行后,计算结果为130H,AL=30H,CF=1,这个时候 CF记录了从最高有效位向更高位的进位值

两数相加,如果产生了进位,则CF=1如果没有产生进位,则CF=0

==

当两个数据做减法的时候,有可能向更高位借位,比如,两个8位数据:97H-98H,将产生借位,借位后相当于计算197H-98H,而标志寄存器(FR)的CF标志位也可以用来记录这个借位值

比如,下面的指令:

MOV AL,97H	;AL的值为97H
SUB AL,98H	;AL=AL-98H

执行后,计算结果为197H-98H=ffH,al=ffH,CF=1CF记录了向更高位的借位值

两数相减,如果产生借位,则CF=1如果没有产生借位,则CF=0




2.奇偶标志(PF):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0

比如,某些指令执行后,其结果二进制值为01001011
有4(偶数)个1,则PF=1

某些指令执行后,其结果二进制值为00001011
有3(奇数)个1,则PF=0




3.辅助进位标志(AF)

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:  

(1)、在字操作时,发生低字节向高字节进位或借位时; 

(2)、在字节操作时,发生低4位向高4位进位或借位时。  

4.零标志(ZF):用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。  

下面的指令:

MOV AX,5	;AX的值为5
SUB AX,AX	;AX=AX-AX

执行后,结果为0,表示真,则ZF=1

MOV AX,5	;AX的值为5
SUB AX,1	;AX=AX-1

执行后,结果不为0,表示假,则ZF=0




5.符号标志(SF):用来反映运算结果的符号位,它与运算结果的最高位相同(最高位表示符号)。
在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。当运算结果的最高位为1时SF=1否则SF=0
*二进制的最高位为0 表示这是正数
*二进制的最高位为1表示 这是负数




6.溢出标志(OF) :用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。 

什么是溢出在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。

那么,机器所能表示的范围是多少呢?

对于8位的符号数据0~255(00H~FFH)
对于16位的符号数据0~65535(0000H~FFFFH)
对于8位的符号数据,机器所能表示的范围就是﹣128~127(80H~7FH);
对于16位的符号数据,机器所能表示的范围就是﹣32768~32767(8000H~7FFFH)
如果运算结果超出了机器所能表达的范围,将产生溢出。

比如,指令:

MOV AL,98	;AL的值为98
ADD AL,99	;给AL的值加99,AL=AL+99

执行后,al=98+99=197
197超出了机器所能表示的8位有符号数的范围:﹣128~127
所以产生了溢出。此时OF=1

有符号数的溢出条件
同一符号的加法或其他符号的减法可能导致溢出。
不同符号的加法或相同符号的减法不会溢出

运算相同符号不同符号
加法 (A+B)OF正常
减法 (A-B)正常OF




  • 最新的处理器仅提供CF、ZF、SF和OF作为状态标志。
  • 每次执行命令时,状态标志都会根据运算结果而改变。
  • 数据传输命令(如MOV和XCHG)不影响状态标志




标志(0)进位
CF
(2)奇偶
PF
(4)辅助进位
AF
(6)零
ZF
(7)符号
SF
(11)溢出
OF
1运算结果 的最高位产生一个进位或错位如果运算结果中1的个数是偶数字节操作时,低字节向高字节进位或借位/低4位向高4位进位或借位运算结果为0如果为负数(最高位为1)超过当前运算位数所能表示的范围
0如果没有进位或错位如果运算结果中1的个数是奇数其它情况运算结果不为0如果为正数(最高位为0)没有超过范围

二、控制标志

状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。  

1.追踪标志(TF)

追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求,显示CPU各个寄存器的当前值及CPU将要执行的下一条指令。
这种方式主要用于程序的调试。  

指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

如果TF=1,则CPU处于单步执行指令的工作方式;
如果TF=0,则处于连续工作模式

2.中断允许标志(IF)

是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:  

(1)当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;  

(2)当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。  

CPU的指令系统中也有专门的指令来改变标志位IF的值。  

3.方向标志(DF)

用来决定在串操作指令执行时有关指针寄存器发生调整的方向

在串处理指令中,控制每次操作后SI、DI的增减。

DF=0,每次操作后SI、DI递增
DF=1,每次操作后SI、DI递减

标志(8)追踪(9)中断允许(10)方向
1CPU处于单步执行指令的工作方式CPU可以响应CPU外部的可屏蔽中断发出的中断请求每次操作后SI、DI递增
0CPU处于连续工作模式CPU不响应CPU外部的可屏蔽中断发出的中断请求每次操作后SI、DI递减




指令标志的影响
MOV, XCHG状态标志不受影响(不变)
ADD, SUB根据运算结果,所有标志都将受到影响
INC, DEC除CF外的所有标志均受到影响。
NEG所有标志都受到影响
 - 如果结果不是0, CF=1 

 - 如果给定操作数为8000H或80H, OF=1

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏