失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 8086汇编语言:标志寄存器的各个标志位的详细介绍

8086汇编语言:标志寄存器的各个标志位的详细介绍

时间:2021-08-09 18:23:17

相关推荐

8086汇编语言:标志寄存器的各个标志位的详细介绍

一、基本介绍:

CPU的内部的寄存器中,有一类特殊的寄存器(对于不同的处理机,其个数和结构都可能不同);它具有以下三种作用!

这种特殊的寄存器在8086CPU中,被称为标志寄存器flag。8086CPU的标志寄存器有16位,其中存储的信息通常又被称为程序状态字PSW)。

flag和其他寄存器不一样,其他寄存器是用来存储数据的,都是一个寄存器作为一个整体具有一个含义的。但是flag寄存器是每一位都有专门的含义的,记录着特定的信息!

flag寄存器各位示意图

flag寄存器在上图中显示空白的位,在8086CPU中没有被使用,因此不具有任何的含义;其他被标识的位都具有特殊的含义。

二、各个标志位介绍:

OF标志:溢出标志位(有符号数)

flag的第11位是OF,溢出标记位;一般情况下,OF记录了有符号数运算的结果是否发生了溢出;如果发生了溢出,则OF=1;如果没有,则OF=0。

CF和OF之间的区别:CF是针对于无符号数运算,OF位是针对于有符号数运算。

代码举例:

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所表示的进位和溢出,是分别对于无符号数和有符号数运算而言的,彼此之间没有任何的关系。

DF标志:方向标志位

flag的第10位是DF,方向标志位;仅仅用于串处理指令中,控制着地址的变化方向

DF=0;每次操作之后地址递增;即从低地址向高地址处理数据串。

DF=1,每次操作之后地址递减,即从高地址向低地址处理数据串。

由于flag寄存器中的DF位决定着串传送指令执行之后,SI、DI的改变方向;因此8086CPU也提供了相应的指令来对于DF位进行设置:

CLD指令:将标志寄存器的DF位,置为0

STD指令:将标志寄存器的DF位,置为1

IF标志:中断允许标志位

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

——相关操作指令:

STI指令:将IF设置为1,允许可屏蔽中断。

CLI指令:将IF设置为0,禁止可屏蔽中断。

TF标志:跟踪标志位

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

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

SF位:符号标志位(有符号数)

flag的第7位是SF,符号标志位。它记录着相关指令执行后其结果是否为负;如果结果为负,则SF=1;如果结果非负,则SF=0。

在计算机里面,通常使用补码来表示有符号数据。计算机的一个数据既可以看作有符号数,亦可以看作无符号数。譬如:

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

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

这就说明计算机在计算相关的数据时,即可以看作有符号数的运算,亦可以看作无符号数的运算,关键在于使用者需要哪一个!例如:

mov al,1000 0001Badd al,1

计算的结果就是:al=1000 0010B

对于该运算,如果你把它看作无符号数的运算,那么就是129+1=130(1000 0010B);也可以将其看作有符号数的运算,那么就是-127+1=-126(1000 0010B)。

SF标志,就是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... ...

如果觉得《8086汇编语言:标志寄存器的各个标志位的详细介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。