一、基本介绍:在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… …