8086CPU的flag寄存器的结构如下:
11.1 ZF标志
Flag的第6位是ZF,零标志位。它记录相关指令执行后,其结果是否为0.如果结果为0,则zf=1,r指令中显示ZR(1);如果结果不为0,那么zf=0,r指令中显示NZ(0);
11.2 PF标志
Flag的第2位是PF,奇偶标志位。它记录相关指令执行后,其结的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1,r指令中显示PE(1);如果1的个数为偶数,pf=0,r指令中显示P0(0);
11.3 SF标志
Flag的第7位是SF,符号标志位。它记录有关指令执行后,其结果是否为负,如果结果为负,sf=1,r指令中显示NG(1);如果结果非负,sf=0,r指令中显示PL(0);
11.4 CF标志
Flag的第0位是CF,进位标志位。一般情况下,在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。如果进位为1,则r指令显示CY(1);如果进行为0,则r指令显示NC(0)。
而当两个数据做减法的时候,有可能向更高位借位。比如,两个数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。而flag的CF位也可以用来记录这个借位值。
比如:
Mov al,97H
Sub al,98H//执行后(al)=FFH,CF=1,CF记录了向更高位的借位值。
Sub al,al
标志寄存器的值及含义
溢出标志OF(Over flow flag) OV(1) NV(0)
方向标志DF(Direction flag) DN(1) UP(0)
中断标志IF(Interrupt flag) EI(1) DI(0)
符号标志SF(Sign flag) NG(1) PL(0)
零标志ZF(Zero flag) ZR(1) NZ(0)
辅助标志AF(Auxiliary carry flag) AC(1) NA(0)
奇偶标志PF(Parity flag) PE(1) PO(0)
进位标志CF(Carry flag) CY(1) NC(0)
11.5 OF标志
在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
Flag的第11位是OF,溢出标志位。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1,r指令显示OV(1);如果没有,OF=0,r指令显示NV(0)。
CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位。
CF和OF所表示的进位和溢出,是分别对无符号数和有符号数运算而言的,他们之间没有任何关系。
11.6 adc指令
Abc是带进位加法指令,它利用了CF位上记录的进位值。
11.8cmp指令
Cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。Cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器来得知比较结果
Cmp指令格式:cmp 操作对象1,操作对象2
11.9检测比较结果的条件转移指令
“转移”指的是它能够修改IP,而“条件”指的是它可以根据某种条件,决定是否修改IP。
比如,jcxz就是一个条件转移指令,它可以检测cx中的数值,如果(cx)=0,就修改IP,否则什么也不做。所有条件转移指令的位移都是[-128,127]。
11.10 DF标志和串传送指令
Flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的增减。
Df=0,每次操作后si、di递增;
Df=1,每次操作后si、di递减;
串传送指令:
格式:movsb
功能:movesb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减。
格式:movesw
功能:movesw的功能是将ds:si指向的内存单元中的字单元送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2。
Movsb和movsw进行的是串传送操作的一个步骤,一般来说,movsb和movsw都和rep配合使用,格式如下:
Rep movsb
用汇编语言来描述就是:
S:movsb
可见,rep的作用就是根据cx的值,重复执行后面的串传送指令。由于执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现cx个字符的传送。
由于flag的df位决定着串传送指令执行后,si和di改变的方向,所以CPU应提供相应的指令来对df位进行设置,从而使程序员能够决定传送的方向。
8086CPU提供两条指令对df位进行设置
Cld指令:将标志寄存器的df位置0;
Std指令:将标志寄存器的df位置1;
11.11 pushf 和popf
Pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。
Pushf和popf,为直接访问寄存器提供了一种方法。
pushf:指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2,这条指令可用来保存全部标志位。
popf:指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2。