8086CPU的标志寄存器有16位,其中储存的信息通常被称为程序状态字。
其他寄存器时用来存放数据的,整个寄存器具有一个含义。
flag寄存器是按位起作用的,它的每一位都有专门的含义,记录特定的信息。
8086CPU的flag寄存器的结构
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
1、ZF标志
(flag的第六位) 零标志位
它记录相关指令执行后
结果为0,ZF=1
结果不为0,ZF=0
例:
mov ax,1
sub ax,1
指令执行后,结果为0,则ZF=1
mov ax,2
mov ax,1
指令执行后,结果为1,则ZF=0
注意:
在8086CPU的指令集中,有的指令的执行是影响标志寄存器,如:add、sub 等,它们大多数是运算指令(进行逻辑或算数运算)
有的指令的执行对寄存器没有影响,如mov,push,pop等,它们大多是传送指令。
2、PF标志
(flag第二位) 奇偶标志位
它记录指令执行后,结果的所有二进制位中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标志
(flag第七位) 符号标志位
结果为负,SF=1
结果为正,SF=0
有符号数与补码
计算机中通常用补码来表示有符号数。
例:
mov al,10000001B
add al,1
将add指令当无符号数运算,那么add指令相当于计算-127+1为-126(10000010B)
CPU在执行add等指令时,就已经包含两种含义,也将得到用同一种信息来记录两种结果。
关键在于程序需要哪种结果
将数据当做无符号数来运算,SF值无意义。
将数据当做有符号数来运算,可以通过SF得知结果的正负。
某些指令将影响标志寄存器中多个标志位,这些被影响的标记位比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据。
4、CF标志
(flag第零位) 进位标志位
在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 (进位或借位 CF=1)
例
mov al,98H
add al,al
执行后 (al)=30H,CF=1
5、OF标志
(flag第十一位) 溢出标志位
在进行有符号运算时,如果结果超过了机器所能表示的范围称为溢出。
溢出 OF=1
6、adc指令
adc是带进位加法的指令,它利用了CF位记录的进位数
格式: adc 操作对象1,操作对象2
功能:
操作对象1=操作对象1+操作对象2+CF
例
mov ax,2
mov bx,1
sub bx,ax
adc ax,1
执行后,(ax)=4
CF值的含义由adc指令前的指令决定(借位还是进位)
7、sbb指令
带借位减法的指令,它利用了CF上记录的借位值。
格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
sbb和adc是基于相同思想设计的两种操作指令,sbb在应用思路上与adc类似。
8、cmp指令
cmp是比较指令,功能类似于减法指令,但是不保存结果。
cmp指令执行后,将对标志寄存器产生影响。
其他相关指令通过识别这些别影响的标志寄存器位得知比较结果。
格式:cmp 操作对象1,操作对象2
例:
mov ax,1
cmp ax,ax
比较结果为0
其产生影响:ZF=1,PF=1,SF=0,CF=0,OF=0
具体情况具体分析。
9、检测比较结果的条件转移指令
与cmp配合使用。
根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF值。
根据有符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF和OF值。
一些指令:
指令 | 含义 | 检测的相关标志位 |
je | 等于则转移 | ZF=1 |
jne | 不等于则转移 | ZF=0 |
jb | 低于则转移 | CF=1 |
jnb | 不低于则转移 | CF=0 |
ja | 高于则转移 | CF=0,ZF=0 |
jna | 不高于则转移 | CF=1或ZF=1 |
10、DF标志和串传送指令
(flag第十位) 方向标志位
在串处理指令中,控制每次操作后si,di的增减
DF=0 每次操作后 si,di递增
DF=1 每次操作后 si,di递减
格式:movsb
功能:(以字节为单位传送)
((es)*16+(di))=((ds)*16+(si))
DF=0 (si)=(si)+1
(di)=(di)+1
DF=1 (si)=(si)-1
(di)=(di)-1
movsw
功能:(以字为单位传送)
si,di递增(减)2.
movsb和movsw一般和rep配合使用,格式如下:
rep movsb
rep作用是根据CX的值,重复执行后面的串地址指令。
8086CPU提供下面两条指令对DF位进行设置
cld指令:将标志寄存器DF位置0
std指令:将标志寄存器DF位置1
assume cs:code
data segment
db 'welcome to masm!'
db 16 dup (0)
data ends
code segment
start : mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
mov ax,4c00h
int 21h
code ends
end start
11、pushf和popf
pushf:将标志寄存器的值压栈
popf:从栈中弹出数据,送入标志寄存器