11.0 概述
CPU内部寄存器中,有一种特殊的寄存器(对不同的处理机,个数和结构可能不同),具有以下三种作用
(1) 用来存储相关指令的某些执行结果
(2) 用来为CPU执行相关指令提供行为依据
(3) 用来控制CPU的相关工作方式
这种特殊的寄存器在8086CPU中被称为标志寄存器.标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW).以下标志寄存器简称flag.
flag寄存器与其他寄存器不同,是按位起作用的,每一位都有专门的含义,记录特定的信息.
15 14 13 12 11 OF 10 DF 09 IF 08 TF 07 SF 06 ZF 05 04 AF 03 02 PF 01 00 CF
11.1 ZF标志
零标志位,记录相关指令执行后,结果是否为0.如果结果为0,ZF=1,如果不为0,ZF=0.
注:在8086CPU指令集中,有的指令的执行是影响标志寄存器的(大多是运算指令),有的指令的执行对标志寄存器没有影响(大多是传送指令).
11.2 PF标志
奇偶标志位,记录相关指令运行后,结果中所有bit位中1的个数是否为偶数,如果是偶数,PF=1,否则为0.
11.3 SF标志
符号标志位,表示结果是否为负,如果为负,SF=1,否则为0.
注:CPU在执行ADD指令的时候,必然会影响到SF标志,至于我们需不需要这种影响,就看我们如何看待指令所进行的运算了.
11.4 CF标志
进位标志位.在进行>>无符号数<<运算的时候,记录了运算结果的最高有效位向更位的进位值,或从更高位的借位值.
11.5 OF标志
举出标志位,记录了>>有符号数<<运算结果是否溢出,溢出置1,否则置0.
注:CF和OF的区别,CF是对无符号数运算有意义的标志,OF是对有符号数运算有意义的标志.他们之间没有任何关系.
11.6 adc指令
带进位加法指令(利用CF)
adc reg1,reg2
功能: (reg1)=(reg1)+(reg2)+CF
注:adc所使用的借位值受上一条指令影响,可利用adc执行对任意大数据的加法(通过循环),但注意循环内部不要影响到CF.
11.7 sbb指令
带借位减法指令(利用CF)
sbb reg1,reg2
功能:(reg1)=(reg1)-(reg2)-CF
11.8 cmp指令
比较指令,功能相当于减法指令,只是不保存结果,但影响flag各个位,其他指令通过识别这些标志位来得知比较结果.
影响的标志位有:zf,pf,sf,cf.of
>>>>如果因为溢出而导致实际结果为负,那么逻辑上真正的结果必然为正,反之亦然<<<<
11.9 检测比较结果的条件转移指令
je:jump equal,等于则转移,判断zf=1
jne:jump not equal,不等于刚转移,判断zf=0
jb:jump below,低于则转移,判断cf=1
jnb:jump not below,不低于则转移,判断cf=0
ja:jump above,高于则转移,判断cf=0且zf=0
jna:jump not above,不高于则转移,判断cf=1或zf=1
11.10 DF标志和串传送指令
DF:方向标志位,在串处理指令中,控制每次操作后si,di的增减.
8086CPU中的串传送指令:movsb,movsw,经常配合rep使用,如rep movsb或rep movsw
8086CPU提供两条指令对DF位进行设置.
cld:置DF位为0.
std:置DF位为1.
movsb功能描述: mov es:[di],byte ptr ds:[si]
movsw功能描述: mov es:[di],word ptr ds:[si]
11.11 pushf和popf
标志寄存器压栈,出栈指令
11.12 标志寄存器在debug中的表示
标志 值为1的标志 值为0的标志
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
实验11 编写子程序
略