第十一章 标志寄存器
有这样 3 种作用的特殊的寄存器,在 8086CPU 种被称为标志寄存器:
- 用来存储相关指令的某些执行结果;
- 用来为 CPU 执行相关指令提供行为依据;
- 用来控制 CPU 的相关工作方式。
8086CPU 的标志寄存器有 16 位,其中存储的信息通常被称为程序状态字(PSW)。
flag 寄存器是按位起作用的,即每一位都有专门的含义,区别于其他存放数据的寄存器。

11.1 ZF 标志
flag 的第 6 位,零标志位。记录相关指令执行后,结果是否为 0,是则 zf=1,反之,zf=0。
在 8086CPU 的指令集种,有的指令是影响标志寄存器的逼入,add、sub、mul、div、inc、or、and 等,大多是运算指令;有的指令的执行对标志寄存器没有影响,比如,mov、push、pop等,大多是传送指令。
11.2 PF 标志
flag 的第 2 位,奇偶标志位。记录相关指令执行后,其结果的所有 bit 位中 1 的个数是否为偶数。若 1 的个数位偶数,pf=1,若为奇数,那么 pf=0。
11.3 SF 标志
flag 的第 7 位,符号标志位。记录相关指令执行后,其结果是否为负。若结果为
负,sf=1;否则 sf=0。
11.4 CF 标志
flag 的第 0 位,进位标志位。一般情况下,在进行无符号运算时,它记录了运算结果的最高有效位向更高有效位的进位值,或从更高位的借位值。

11.5 OF 标志
flag 的第 11 位,标志溢出位。一般情况下,OF 记录了有符号数运算的结果是否发生了溢出。若发生了溢出,则 OF=1;反之,OF=0。
注意:CF 是对无符号数运算有意义的标志位,OF 则是对有符号数运算有意义的标志位。
11.6 adc 指令
adc 是带进位加法指令,利用 CF 记录进位值。
格式:adc ax,bx
功能:(ax)=(ax)+(bx)+CF
11.7 sbb 指令
sbb 是带进位减法指令,利用 CF 记录进位值。
格式:sbb ax,bx
功能:(ax)=(ax)-(bx)-CF
11.8 cmp 指令
mcp 是比较指令,功能相当于减法指令,只是不保存结果。
格式:cmp ax,ax
功能:做 (ax)-(ax) 的运算,但并不在 ax 中保存。
通过 cmp 执行后,相关标志位的变化:

cmp 指令既可以对无符号数进行比较,也可以对有符号数进行比较。
以 cmp ah,bh 为例,总逛街 CPU 执行 cmp 指令后,sf 和 of 的值是如何说明比较结果的:

11.9 检测比较结果的条件转移指令
转移指的是它能够修改 IP,条件指的是它可以根据某种条件,决定是否修改。

将 cmp 和条件转移指令配合起来使用。
11.10 DF 标志和串传送指令
flag 的第 10 位,方向标志位。在串处理指令中,控制每次操作后 si、di 的增减。
- df=0,每次操作后 di、si 递增;
- df=1,每次操作后 di、si 递减。
串传送指令 movsb,相当于:
((es)*16+(di))=((ds)*16+(si))
if df=0:
(si)=(si)+1
(di)=(di)+1
if df=1:
(si)=(si)-1
(di)=(di)-1
#汇编描述:
mov es:[di],byte ptr ds:[si]; 8086 并不支持的这样的指令,仅作描述
if df=0:
inc si
inc di
if df=1:
dec si
dec di
movsb 的功能是将 ds:si 指向的内存单元中的字节送入 es:di 中,然后根据寄存器 df 位的值,将 si 和 di 递增或递减。
串传送指令 movsw,相当于:
#汇编描述:
mov es:[di],word ptr ds:[si]; 8086 并不支持的这样的指令,仅作描述
if df=0:
add si,2
add di,2
if df=1:
sub si,2
sub di,2
movsw 的功能是将 ds:si 指向的内存字单元中的字送入 es:di 中,然后根据寄存器 df 位的值,将 si 和 di 递增 2 或递减 2。
一般来说,movsb 和 movsw 都和 rep 配合使用,rep movsb。功能是:
s:movsb
loop s
11.11 pushf 和 popf
pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中弹出数据,送入标志寄存器中。
11.12 标志寄存器在 Debug 中的表示
