8086 FLAGS标志位详解
8086微处理器有一个16位的标志寄存器FLAGS其中只使用了9位分为状态标志6位和控制标志3位。一、状态标志6位反映ALU运算结果的特征供后续条件跳转指令判断。标志位英文全称含义置1条件CFCarry Flag进位/借位标志加法产生进位或减法产生借位PFParity Flag奇偶标志结果低8位中“1”的个数为偶数AFAuxiliary Carry Flag辅助进位标志低4位向高4位产生进位/借位BCD码运算用ZFZero Flag零标志运算结果为0SFSign Flag符号标志运算结果的最高位为1即负数有符号数视角OFOverflow Flag溢出标志有符号数运算结果超出范围CF 与 OF 的区别CF针对无符号数超出 0~65535或 0~255时置1OF针对有符号数结果超出 -32768~32767或 -128~127时置1示例MOV AL, 0x7F ; 127 ADD AL, 1 ; 结果 0x80 (128) ; CF0, OF1有符号溢出, SF1最高位为1, ZF0二、控制标志3位由程序员设置控制CPU行为。标志位英文全称作用IFInterrupt Flag中断允许标志1允许可屏蔽中断0禁止DFDirection Flag方向标志1串操作地址递减0递增TFTrap Flag陷阱标志1单步调试模式每执行一条指令产生一次中断控制标志只能通过专用指令修改IF→STI(置1)CLI(置0)DF→STD(置1)CLD(置0)TF→ 无直接指令需通过PUSHF/POPF修改三、未使用的标志位8086的FLAGS寄存器共16位实际只用9位其余位bit 1, 3, 5, 12~15保留读出不固定写入应置0以保证兼容性。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]四、常用指令对标志位的影响指令CFOFSFZFAFPFADD / ADC✓✓✓✓✓✓SUB / SBB✓✓✓✓✓✓INC / DEC—✓✓✓✓✓MUL / DIV变化—变化变化?变化AND / OR / XOR00✓✓?✓NOT——————CMP同SUB同SUB同SUB同SUB同SUB同SUBMOV——————✓ 受影响— 不影响? 未定义五、典型应用场景1. 判断无符号数大小利用CFCMP AX, BX JA label ; AX BX (CF0 and ZF0) JB label ; AX BX (CF1)2. 判断有符号数大小利用OF和SFCMP AX, BX JG label ; AX BX JL label ; AX BX3. 多字节加法利用CFADD AL, BL ; 低8位相加 ADC AH, BH ; 高8位加上低位进位4. 单步调试利用TFTF1时CPU执行每条指令后自动触发INT 1调试器可利用此功能。5. 快速数组复制利用DFCLD ; DF0地址递增 REP MOVSB ; 正向复制 STD ; DF1地址递减 REP MOVSB ; 反向复制总结表速查标志含义最常用时机CF无符号数加减进位/借位多精度运算、无符号比较OF有符号数溢出有符号比较、算术运算错误检测ZF结果为零相等判断、循环计数SF结果为负有符号数符号判断AF低4位进位BCD码调整DAA/DASPF低8位1的个数为偶通信数据校验IF可屏蔽中断开关临界区保护、中断控制DF串操作方向字符串/数组复制方向控制TF单步陷阱调试器实现