CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下三种作用:
- 用来存储相关指令的某些执行结果;
- 用来为CPU执行相关指令提供行为依据;
- 用来控制CPU的相关工作方式。
flag(标志寄存器)和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器不一样,它的每一位都有专门的含义,记录特殊的信息。
flag寄存器的1,3,5,12,13,14,15位在8086CPU中没有使用,不具有任何含义。而0(CF),2(PF),4(AF),6(ZF),7(SF),8(TF),9(IF),10(DF),11(OF)位多具有特殊含义。
ZF标志
flag的第6位是ZF(零标志位)。它记录相关指令后执行后,其结果是否为0。如果结果为0,则ZF=1,如果结果不为0,那么ZF=0;
PF标志
flag的第2位是PF,奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1的个数是否位偶数。如果 1的个数为偶数,PF=1,如果为奇数,PF=0。
SF标志
flag的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负数,SF=1;如果为非负数,SF=0。
在我们将数据当作由符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值就没有意义,虽然相关的指令影响了他的值。
CF标志位
flag为0位的是CF,进位标志位。一般情况下,在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
比如将两个把位数据相加:98H+98H,将产生进位。由于这个进位值在8位中无法保存,但是在CPU进行运算的时候,并不丢失这个进位值,而是记录在一个特殊寄存器的某一位上。
当两个数据做减法运算的时候,有可能向更高位借位。如97H-98H相当于计算197H-98H。而flag的CF也可以用来记录这个值。
OF标志
flag的第11位是OF,溢出标志位。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1;如果没有,OF=0。
注意,CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位。
cmp指令和检测比较结果的指令
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
下面是常用的根据无符号数的比较结果进行转移的条件转移指令。
指令 含义 检测的相关标志位
je 等于则转移 zf=1
jne 不等于则转移 zf=0
jb 低于则转移 cf=1
jnb 不低于则转移 cf=0
ja 高于则转移 cf=0且zf=0
jna 不高于则转移 cf=1或zf=1
DF标志位和串传送指令
flag的第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
movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df的值,将si和di进行递增或递减。
movsw的功能和movsb的功能近似,只是movsw每次将si,di递增2或递减2。
而movsb和movsw一般都是和rep配合使用。
而rep movsb的功能就是:
s: movsb
loop s
可见,rep的作用是根据cx的值,重复执行后面的串传送指令。每次都进行一个字节的转换,则rep movsb就可以循环(cx)个字符的传送。
cld指令:将标志寄存器的df位置0
stf指令:将标志寄存器的df位置1
pushf和popf
pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,进入标志寄存器。