11.标志寄存器
1.CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下3种作用。
(1)用来存储相关指令的某些执行结果;
(2)用来为CPU执行相关指令提供行为依据;
(3)用来控制CPU的相关工作方式。
这种特殊的寄存器在8086CPU中,被称为标志寄存器.本章中的标志寄存器(以下简称flag)使我们学习的最后一个寄存器.
2.flag寄存器是按位起作用的,也就是说,它的每一个位都有专门的含义,记录特定的信息.
3.flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义;0、2、4、6、7、8、9、10、11位都具有特殊的含义。
4.flat的第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
5.8086CPU指令集中,大多数的运算指令(进行逻辑或算术运算)会影响标志寄存器,而大多数的传送指令则不会影响标志寄存器。
6.flag的第2位是PF,奇偶标志位。他记录指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,则PF=1,反之PF=0.
比如,指令:
mov al,1
add al,10
执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;
mov al,1
or al,2
执行后,结果为00000011B,其中有2(偶数)个1,则PF=1;
sub al,al
执行后,结果为00000000B,其中有0(偶数)个1,则PF=1
7.flag的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负,如果为负,SF=1;如果非负,SF=0;
8.计算机中的一个数据可以看作是有符号数,也可以看作是无符号数。
9.SF标志,就是CPU对有符号数运算结果的一种记录,他记录数据的正负。
10.CPU字执行add等指令时,是必然影响到SF标志位的值。
11.flag的第0位是CF,进位标志位。一般情况下,在进行无符号运算时,他记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
比如,指令:
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记录了从最高位向更高位的借位值
12.在进行有符号运算的时候,如果超过了机器所能表示的范围称为溢出。
13.flag的第11位是OF,溢出标志位。一般情况下,OF记录了有符号数运算结果是否发生了溢出。如果发生了溢出,OF=1;反之,OF=0。
14.注意CF和OF的区别:CF是针对无符号数运算有意义的标志,而OF是针对有符号数运算有意义的标志。
15.adc是带进位加法指令,它利用CF位上记录的进位值。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
比如指令 adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CF
16.adc所使用的进位值受上一条指令影响,可利用adc执行对任意大数据的加法(通过循环),但注意循环内部不要影响到CF.
17.sbb是带借位减法指令,它利用CF位上记录的借位值
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
比如指令 adc ax,bx 实现的功能是:(ax)=(ax)-(bx)-CF
18.cmp是比较指令,功能相当于减法指令,只是不保存结果,但影响flag各个位,其他指令通过识别这些标志位来得知比较结果。
指令格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2,但并不保存结果,仅仅根据结果对标志位寄存器进行设置。
比如:指令 cpp ax,ax,做(ax)-(ax)的运算,结果为0,但并不保存到ax中,进影响flag相关各位。指令执行后:ZF=1,PF=1,SF=0,CF=0,OF=0.
19.如果因为溢出导致实际结果为负,那么逻辑上真正的结果必然为正。
20.flah的第10位是DF,方向标志位.在串处理指令中,控制酶促操作后si,di上网增减.
df=0 每次操作后si、di递增
df=1 每次操作后si、di递减
格式:movsb
功能:执行movsb指令相当于进行下面几部操作
(1)((es)*16+(di))=((ds)*16)+(si))
(2)如果df=0 则: (si)=(si)+1
(di)=(di)+1
如果df=1 则: (si)=(si)-1
(di)=(di)-1
例如,用串传送指令进行数据传送。
assume CS:code
data SEGMENT
DB 'Welcome to masn!'
DB 16 dup (0)
data ENDS
code SEGMENT
s:MOV AX,data
MOV DS,AX
MOV SI,0 ;ds:si指向data:0
MOV ES,AX
MOV DI,16 ;es:di指向data:0010
MOV CX,16 ;(cx)=16,rep循环16次
CLD ;设置df=0,正向传送
REP MOVSB
MOV AX,4c00h
INT 21
code ENDS
END s
21.pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。
22.pushf和popf,为直接访问标志寄存器提供了一种方法。
23.标志寄存器在Debug中的表示
![]()