标志寄存器
1. ZF标志
(1)flag的第6位是ZF,零标志位。
它记录相关指令执行后,
结果为0 , ZF = 1
结果不为0,ZF = 0
比如:
mov ax,1
sub ax,1
指令执行后,结果为0,则ZF = 1。
mov ax,2
sub ax,1
指令执行后,结果为1,则ZF = 0。
(2)对于ZF的值,我们可以这样来看,ZF标记相关指令的计算结果是否为0,
如果为0,则在ZF要记录下“是0”这样的肯定信息。
- 在计算机中1 表示逻辑真,表示肯定,所以当结果为0的时候 ZF=1,
表示“结果是0 ”。如果结果不为0,则ZF要记录下“不是0”这样的否定信息。
- 在计算机中0表示逻辑假,表示否定,所以当结果不为0 的时候ZF=0,表示“结果不是0”。
示例
指令:mov ax,1
and ax,0
执行后,结果为0,则ZF=1,表示“结果是0”。
指令:mov ax,1
or ax,0
执行后,结果不为0,则ZF=0,表示“结果非0”。
注意:
在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,
比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令
(进行逻辑或算术运算);
有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。
我们在使用一条指令的时候,要注意这条指令的全部功能,其中包括,
执行结果对标记寄存器的哪些标志位造成影响。
2.PF标志
flag的第2位是PF,奇偶标志位。
它记录指令执行后,结果的所有二进制位中1的个数:
为偶数,PF = 1;
为奇数,PF = 0。
示例
指令:mov al,1
add al,10
执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;
指令:mov al,1
or al,10
执行后,结果为00000011B,其中有2(偶数)个1,则PF=1;
3.SF标志
(1)flag的第7位是SF,符号标志位。
它记录指令执行后,
结果为负,SF = 1;
结果为正,SF = 0。
(2)我们知道计算机中通常用补码来表示有符号数据。
计算机中的一个数据可以看作是有符号数,也可以看成是无符号数。
比如:
00000001B ,可以看作为无符号数 1 ,或有符号数+1;
10000001B ,可以看作为无符号数129,也可以看作有符号数-127。
这也就是说,对于同一个二进制数据,计算机可以将它当作无符号数据来运算,
也可以当作有符号数据来运算。
(3)不管我们如何看待,CPU 在执行add等指令的时候,就已经包含了两种含义,
也将得到用同一种信息来记录的两种结果。
关键在于我们的程序需要哪一种结果
(4)SF 标志,就是CPU对有符号数运算结果的一种记录 ,它记录数据的正负。
- 在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。
- 如果我们将数据当作无符号数来运算,SF的值则没有意义,
虽然相关的指令影响了它的值。
- 这也就是说,CPU在执行 add 等指令时,是必然要影响到SF标志位的值的。
至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。
(5)某此指令将影响标志寄存器中的多个标志位,这些被影响的标记位比较
全面地记录了指令的执行结果,为相关的处理提供了所需的依据。
检测点11.1
sub al,al al=0h ZF=1 PF=1 SF=0
mov al,1 al=1h ZF=1 PF=1 SF=0
push ax al=1h ZF=1 PF=1 SF=0
pop bx ax=1h ZF=1 PF=1 SF=0
add al,bl al=2h ZF=0 PF=0 SF=0
add al,10 al=12h ZF=0 PF=1 SF=0
mul al ax=144h ZF=0 PF=1 SF=0
4.CF标志
(1)flag的第0位是CF,进位标志位。
一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的
进位值,或从更高位的借位值。
(2)对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,
的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。
(3) 我们知道,当两个数据相加的时候,有可能产生从最高有效位向更高位的进位。
比如,两个8 位数据:98H+98H,将产生进位。
由于这个进位值在8位数中无法保存,我们在前面的课程中,就只是简
单地说这个进位值丢失了。
其实CPU在运算的时候,并不丢弃这个进位值,而是记录在
一个特殊的寄存器的某一位上。
8086CPU 就用flag的CF位来记录这个进位值。
比如,下面的指令:
mov al,98H
add al,al ;执行后: (al)=30H,CF=1,
;CF记录了最高有效位向更高位的进位值
(4)而当两个数据做减法的时候,有可能向更高位借位。
比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。
而flag的CF位也可以用来记录这个借位值
5.OF标志
如果运算结果超出了机器所能表达的范围,将产生溢出。
注意,这里所讲的溢出,只是对有符号数运算而言。
由于在进行有符号数运算时,可能发生溢出而造成结果的错误。
则CPU需要对指令执行后是否产生溢出进行记录。
flag的第11位是OF,溢出标志位。
一般情况下,OF记录了有符号数运算的结果是否发生了溢出。
如果发生溢出,OF=1,
如果没有, OF=0。
一定要注意CF和OF的区别:
CF是对无符号数运算有意义的标志位;
而OF是对有符号数运算有意义的标志位
比如:
mov al,98
add al,99
add指令执行后:CF=0,OF=1。
前面我们讲过,CPU在执行add等指令的时候,就包含了两种含义:
无符号数运算和有符号数运算。
- 对于无符号数运算,CPU用CF位来记录是否产生了进位;
- 对于有符号数运算,CPU 用 OF 位来记录是否产生了溢出,
当然,还要用SF位来记录结果的符号。
我们可以看出,CF 和OF 所表示的进位和溢出,是分别对无符号数和
有符号数运算而言的,它们之间没有任何关系。
6.cmp指令
(1)cmp 是比较指令,功能相当于减法指令,只是不保存结果。
cmp 指令执行后,将对标志寄存器产生影响。
其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
(2)cmp指令
格式:cmp 操作对象1,操作对象2
功能:计算操作对象1–操作对象2 但并不保存结果,
仅仅根据计算结果对标志寄存器进行设置。
做(ax)–(ax)的运算,结果为0,但并不在ax中保存,
仅影响flag的相关各位。
指令执行后:
ZF=1,
PF=1,
SF=0,
CF=0,
OF=0。