除了前述的多种具有特定用途的寄存器之外,8086的CPU中还存在一类特殊的寄存器,称为标识寄存器flag,其每一位可能用来存储特定的信息,主要有以下三类:
(1)相关指令的某些执行结果;
(2)为CPU执行相关指令提供依据;
(3)控制CPU的相关工作方式。
在这个16位的寄存器中,共有9个bit位被用作某种标识位,其他几个bit为保留位,没有实际意义。以下几节中将浏览其中几个标志位的作用和使用方法。
1、ZF标识:
ZF标识位为flag的第六位,其含义为0标识位。当某条汇编指令完成后,结果为0,则ZF==1;否则,ZF==0。
2、PF标识:
PF标识位为flag的第二位,其含义为奇偶标识位,表示该指令的执行结果中非零位的个数是否为偶数。结果中有偶数个1,则PF==1;否则,PF==0。
3、SF标识:
SF标识位为flag的第七位,其含义为结果是否为负数。SF命名中的S(sign)可以认为是负号(-)的含义,若结果为负,SF==1;若结果为正,SF==0。
4、CF标识:
CF标识位为flag的第0位,其含义为进位标识位。该标识位仅仅对无符号数运算有意义。在进行N位无符号数运算时,若运算结果过大,N位无符号数无法保存产生进位,或者运算结果小于0产生了借位,在某条指令存在进位或借位的情况下,CF==1;否则,CF==0;
5、OF标识:
OF标识位为flag的第11位,其含义为溢出标识位,O即溢出(Overflow)的含义。该标识位仅仅对有符号数运算有意义。对于有符号数的溢出,简单理解即为:由于有符号数的最高位为符号位,这样就可能产生两个正数相加,最高位表示正号的0被后面的1覆盖变成了负数,或者两个负数相加,由于借位的缘故导致表示负号的1变成了0。若某条指令运行过程中没有发生溢出,OF==0;若出现溢出,OF==1;
6、abc指令
abc指令实现的是带进位的加法功能,其调用方式同不带进位的加法指令add类似:
abc oprand1, oprand2该指令的同add的不同之处在于,其结果相当于add的结果加上CF标识位的值。add指令和adc指令配合,可以实现对更大的数据进行加法运算。
7、sbb指令
与abc指令类似,sbb指令实现的是带借位的减法。
sbb oprand1, oprand2该指令的意义:oprand1 = oprand1 - oprand2 -CF。
8、cmp指令
cmp指令实现比较功能,相当于不保存结果的减法指令。该指令执行后会影响标识寄存器,并通过标识寄存器支持其他指令来获取比较结果。使用方式为:
cmp ax, bx若指令执行后zf=0,那么可以判断二者是否相等;cf为1说明ax<bx,反之ax>bx。
对于有符号数,两个操作数相减可能产生负值,使得sf=0,此时需要根据of所指示的溢出情况来判断大小。若of=0说明没有出现溢出,则sf所标识的正负值正确表示了两个操作数的差值符号;若of=1,则说明出现了溢出,两个操作数差的正负值情况同sf标识的相反。
9、检测比较结果的条件转移指令
以下几条指令可以同cmp配合,实现根据两个操作数大小关系而进行跳转。假设前一条指令为cmp ax, bx。
je——ax==bx的时候进行跳转;
jne——ax!=bx的时候进行跳转;
jb——ax<bx的时候进行跳转;
jnb——ax>=bx的时候进行跳转;
ja——ax>bx的时候进行跳转;
jna——ax<=bx的时候进行跳转。
10、DF标识和串传送指令
方向标识位DF是flag寄存器的第10位,其作用是控制每次操作之后si和di的增减。当DF=0时,每次操作si和di递增,反之si和di递减。
串传送指令movsb和movesw的作用为串数据传送,前者传输字节型数据,后者传输字型数据。这两个指令的用法通常为:首先指定ds和es的值,然后使用这两个数据将ds:si中的数据按字节或字送入es:di中,然后将si和di递增1或2。该指令通常同寄存器cx和rep配合,实现对一段内存中数据的传递。
11、pushf和popf
这两个指令提供了直接访问标识寄存器的方法,前者的功能是将标识寄存器压栈,后者的功能是从栈中将数据弹出,赋予标识寄存器。