CPU 内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下 3 种作用。
(1)用来存储相关指令的某些执行结果;
(2)用来为 CPU 执行相关指令提供行为依据;
(3)用来控制 CPU 的相关工作方式。
这种特殊的寄存器在 8086CPU 中,被称为标志寄存器。8086CPU 的标志寄存器有 16 位,其中存储的信息通常被称为程序状态字(PSW)。我们已经使用过 8086CPU 的 ax、bx、cx、dx、si、di、bp、sp、IP、cs、ss、ds、es 等 13 个寄存器了,本章中的标志寄存器(以下称为 flag)使我们要学习的最后一个寄存器。
flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而 flag 寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
8086CPU 的 flag 寄存器的结构如上图,flag 的 1、3、5、12、13、14、15 位在 8086CPU 中没有使用,不具有任何含义。而 0、2、4、6、7、8、9、10、11 位都具有特殊的含义。
在这一章中,我们学习标志寄存器中的CF, PF, ZF. SF. OF, DF标志位,以及一些与其相关的典型指令。
ZF标志
flag 的第 6 位是 ZF,零标志位
。它记录相关指令执行后,其结果是否为 0,如果结果为 0,那么 zf=1;如果结果不为 0,那么 zf=0。
比如,指令:
mov ax,1 sub ax,1
执行后,结果为 0,则 zf=1
mov ax,2 sub ax,1
执行后,结果不为 0,则 zf=0
对于zf的值,我们可以这样来看,zf标记相关指令的计算结果是否为0,如果为0则zf要记录下“是0”这样的肯定信息。在计算机中1表示逻辑真,表示肯定,所以当结果为0的时候zf=1,表示“结果是0"。如果结果不为0,则zf要记录下“不是0”这样的否定信息。在计算机中0表示逻辑假,表示否定,所以当结果不为0的时候zf=0,表示“结果不是0"。
比如,指令:
mov ax,1 mov ax,0
执行后,结果为0,则zf=1,表示“结果是0
moV aX, or ax,0
执行后,结果不为0,则zf--0,表示“结果非0"
注意:在 8086CPU 的指令集中,有的指令的执行是影响标志寄存器的,比如,add、sub、mul、div、inc、or、and 等,它们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如,mov、push、pop 等,它们大都是传送指令。在使用一条指令的时候,要注意这条指令的全部功能,其中包括,执行结果对标志寄存器的哪些标志位造成影响。