CPU内部的寄存器中,有一种特殊的寄存器 具有以下3种作用:
- 用来存储相关指令的某些执行结果。
- 用来为CPU执行相关指令提供行为依据。
- 用来控制CPU的相关工作方式。
这种特殊的寄存器在8086CPU中,被称为标志寄存器(FR)
FR与其它寄存器不一样,其它寄存器是用来存放数据的,都是整个寄存器具有一个含义,而FR寄存器是按位起作用的,也就是说它的每一位都有专门的含义,记录特定的信息。
下面是8086CPU的FR寄存器的结构:
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 |
可以发现第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=1,CF记录了向更高位的借位值。
两数相减,如果产生借位,则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)方向 |
1 | CPU处于单步执行指令的工作方式 | CPU可以响应CPU外部的可屏蔽中断发出的中断请求 | 每次操作后SI、DI递增 |
0 | CPU处于连续工作模式 | CPU不响应CPU外部的可屏蔽中断发出的中断请求 | 每次操作后SI、DI递减 |
指令 | 标志的影响 |
MOV, XCHG | 状态标志不受影响(不变) |
ADD, SUB | 根据运算结果,所有标志都将受到影响 |
INC, DEC | 除CF外的所有标志均受到影响。 |
NEG | 所有标志都受到影响 - 如果结果不是0, CF=1 - 如果给定操作数为8000H或80H, OF=1 |
2 条评论
[…] 汇编(12)标志寄存器(FR)/CF/PF/AF/ZF/SF/TF/IF/DF/OF […]
[…] 关于标志寄存器的详细介绍:http://www.yuofyou.cn/20200412/361.html […]