Status Flags
状态标志位(比特位0,2,4,6,7和11)指示了算术指令的结果,例如ADD,SUB,MUL,与DIV指令。
标志位 | 描述 |
CF(bit 0) | 进位/借位Carry。如果算术指令的结果的最高有效位产生了进位/借位,则置1;否则置0。这个标志位指示了无符号整数计算的结果是否溢出;也用于多精度(multiple-precision)算术运算(注:例如利用两个16位宽的寄存器做32位加减法,中间结果会用到CF标志位,下面有解释)。 |
PF(bit 2) | 奇偶校验位Parity。如果指令结果的最低字节含有偶数个比特1,则置1;否则置0。 |
AF(bit 4) | 辅助进位/借位Auxiliary Carry。如果算术运算在第3比特位(最低比特位是0)产生了进位/借位,则置1;否则置0。这个标志主要用于二进制编码的十进制数BCD算术运算。 |
ZF(bit 6) | 零标志位Zero。如果指令结果为0,则置1;否则置0 |
SF(bit 7) | 符号位Sign。设置为指令结果的最高有效比特位,即有符号整数的符号比特位。0表示结果是正数或者是0;1表示负数。 |
OF(bit 11) | 溢出位Overflow。如果整数运算结果超出了目标操作数可容纳的值域(正数过大,负数过小,不包括符号位),则置1;否则置0(即结果可信)。这个标志指示了有符号整数算术运算的结果是否溢出。 |
在这些标志位中,只有CF标志位可以直接使用STC/CLC/CMC指令进行修改。BT,BTS,BTR,BTC指令可以将指定的标志位复制到CF标志位中。
有了状态标志位,就可以让单条算术运算指令为3种不同的数据类型产生结果:无符号整数,有符号整数,和BCD整数。如果算术运算的结果作为无符号整数,则CF标志位指示了结果是否越界(out-of-range);如果作为有符号整数,则OF标志位指示了结果是否溢出(overflow);如果作为BCD整数,则需要检查AF标志位。SF标志位指示了有符号整数的符号。ZF标志指示了结果是否为0,对有符号整数与无符号整数都适用。
当执行多精度整型运算时,CF标志位可辅助ADC指令做加法,或辅助SBB指令做减法,这样可以将进位/借位条件从前一个操作传递给下一个操作。如下示例,若ADD指令结果的最高位产生了进位,则ADC指令会将这个进位(在CF标志位中)加到结果中。
条件转移指令Jcc(按cc条件跳转),SETcc指令(按cc条件设置字节),LOOPcc指令(按cc条件循环),和CMOVcc指令(按cc条件move)都会使用一个或多个状态标志位,将其作为条件进行测试,根据测试结果执行跳转,设置,循环或搬移操作。
Control Flag (DF Flag)
方向标志位(DF,bit 10)控制字符串指令(MOVS,CMPS,SCAS,LODS,STOS)的操作方向。将DF设置为1,则字符串指令的操作方向是自动递减(即从高地址向低地址处理字符串);DF=0,则是自动递增(即从低地址向高地址处理字符串)。
STD/CLD指令分别用于设置与清除DF标志位。
指令 | 描述 |
MOVS | 将DS:ESI地址上的字符串搬移到ES:EDI地址上 |
CMPS | 从源操作数中减去目标操作数,根据结果设置标志寄存器的状态标志位(CF,ZF,OF,SF,PF和AF);结果并不保存到内存中。 |
SCAS | 从EAX/AX/AL寄存器中减去目标字符串,根据结果设置标志寄存器的状态标志位。 |
LODS | 将DS:ESI地址上的字符串加载到EAX/AX/AL寄存器 |
STOS | 将EAX/AX/AL寄存器中的字符串保存到ES:EDI指定的地址中 |
STD/CLD | 设置/清除DF标志位 |