一、基本介绍:在CPU内部寄存器中,有特殊类型的寄存器()根据处理器的不同,其个数和结构可能不同); 具有以下三个作用!

此特殊寄存器为8086CPU,称为标志寄存器flag。 8086CPU的标志寄存器为16位,其中存储的信息通常也称为http://www.Sina.com/(3358 www.Sina.com/)。

flag与其他寄存器不同,其他寄存器用于存储数据,所有一个寄存器总体上有一个意义。 但是,flag寄存器对所有位都有特殊的意义,记录了特定的信息!

程序状态字flag寄存器在上图中显示空白位,未在8086CPU中使用,因此没有任何意义; 其他标记的位有特殊的意义。

二、各标志位的介绍: OF标志:溢出标志(有符号数) ) ) ) ) ) )。

flag的第11位是OF,溢出标志位; 一般而言,OF记录的是PSW的结果是否溢出; 如果flag寄存器各位示意图

有符号数运算CF是针对无符号整数的运算,而OF位是针对有符号整数的运算。

发生了溢出,则OF=1;如果没有,则OF=0。

在执行了mov al,0F0Hadd al,88H指令之后,CF=1,OF=1。 如果将该运算视为无符号数运算,则在0F0H 88H发生进位,因此CF=1; 如果将该运算视为带符号数运算,则在0F0H 88H时发生溢出,OF=1。

在执行了mov al,0F0Hadd al,78H指令之后,CF=1,OF=0。 如果将该运算视为无符号数运算,则在0F0H 78H发生进位,因此CF=1; 如果将该运算视为带符号整数运算,则在0F0H 78H时不发生溢出,OF=0。

因此,用CF和OF表示的进位和溢出分别用于无符号数和有符号数的运算,CF和OF之间的区别:

DF标志:方向标志位flag第10位为DF,方向标志位;代码举例:控制着彼此之间没有任何的关系。

DF=0; 每次操作都从地址仅仅用于串处理指令中,即从低到高处理数据串。

DF=1,每次操作处理地址地址的变化方向,即从高位地址到低位地址的数据串。

flag寄存器中的DF位决定了串行传输指令被执行之后的SI、DI的方向; 因此,8086CPU还提供了相应的命令来设置DF位。

递增标志寄存器的DF位设置为0

递减标志寄存器的DF位设置为1

IF标志:允许中断标志位flag的第九位为IF,IF设置为0,禁止其他可屏蔽中断; 如果允许屏蔽中断的处理,则将IF设置为1。

CLD指令:

将3358www.Sina.com/if设置为1,以便可以中断。

将3358www.Sina.com/if设置为0,禁止可屏蔽中断。

TF标志:跟踪标志位flag的第8位是TF,跟踪标志位用于识别CPU是否允许单步中断进行程序调试。 TF=0时,8086CPU处于正常状态; TF=1时,8086CPU处于单步状态,每次执行命令时自动产生单步中断。

8086的调试功能依赖于8086CPU的单步调试功能。

SF位:符号标记位(有符号数) flag的第七位是SF,是符号标记位。 执行相关命令后,记录其结果是否为负。 结果为负时,SF=1; 如果结果不是负的,则SF=0。

在计算机中,补码通常用于表示有符号数据。 计算机的一个数据可以被认为是有符号的数和无符号的数。 例如:

0000 0001B可以看作无符号整数1,也可以看作有符号整数1。

1000 0001B可以视为无符号整数129,也可以视为有符号整数-127。

这表示计算机在计算相关数据时,即可以视为有码数的运算,还是可以视为无码数的运算,重要的是使用者需要哪一个,例如:

mov al,1000 0001Badd al,1计算结果为al=1000 0010B

关于该运算,如果考虑为无符号数运算,则1291=130(10000010b ); 也可以将其视为有符号数的运算,为-1271=-126(10000010b )。

STD指令:是针对带符号运算结果的8086CPU的记录,记录了运算结果的正负。 无论将运算视为有符号运算还是无符号运算,SF的值都不变。 不同的是,当兴奋的蜻蜓被视为有符号运算时,它是有意义的。 很兴奋

蜻蜓看作无符号运算时它是无意义的!

mov al,1000 0001Badd al,1

运算结果为1000 0010B,SF=1;如果你把这个运算看作有符号数运算,那么结果为负。

mov al,1000 0001Badd al,0111 1111B

运算结果是0,SF=1;如果你把这个运算看作有符号数运算,那么结果为正。

ZF位:零标志位

flag寄存器的第6位是ZF,零标志位;它记录着相关指令执行之后,其结果是否为零;如果结果为零,那么ZF=1,如果结果不为零,那么ZF=0。

例如:

mov ax,1sub ax,1

执行之后,结果为零,则ZF=1。

mov ax,2sub ax,1

执行之后,结果为1,则ZF=0。

AF位:调整标志位

flag的第4位是AF,调整标志位;反映加减运算时最低半字节有无进位或者借位。最低半字节有进位或借位时,AF=1,否则AF=0。

这个标志位主要由处理器内部使用,用于十进制算术运算的调整指令,用户一般不必关心。

例如:8位二进制数运算0011 1010+0111 1100 = 1011 0110,低四位有进位,所以此时的AF=1。

PF位:奇偶标志位

flag寄存器的第2位是PF,奇偶标志位;它记录着相关指令执行之后,其结果的所有bit位中1的个数是否为偶数;如果1的个数为偶数,则PF=1,如果1的个数为奇数,则PF=0。

例如:

mov al,1add al,10

执行之后,结果是0000 1011B;其中有3个1;因此PF=0。

mov al,2or al,2

执行之后,结果是0000 0010B;其中有1个1;因此PF=0。

sub al,al

执行之后,结果为0000 0000B;其中有0(偶数)个1;因此PF=1。

CF标志:进位标志位(无符号数)

flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或者从最高位的借位值

以8位为例:

——进位举例:

mov al,98H

add al,al;执行之后,al的值变为30H,CF=1;此时CF记录了最高有效位向更高位的进位值。

add al,al;执行之后,al的值变为60H,CF=0;此时CF记录了最高有效位向更高位的进位值。

——借位举例:

mov al,97H

sub al,98H;执行之后,al的值变为FFH,CF=1;此时CF记录了向更高位的借位值。

sub al,al;执行之后,al的值变为0,CF=0;此时CF记录了向更高位的借位值。

——相关操作指令:

CLC指令:将CF置为0。

STC指令:将CF置为1。

CMC指令:原来是0变为1,原来是1变为0。

Ending… …