8086 FLAGS标志位详解
8086微处理器有一个16位的标志寄存器(FLAGS),其中只使用了9位,分为状态标志(6位)和控制标志(3位)。
一、状态标志(6位)
反映ALU运算结果的特征,供后续条件跳转指令判断。
| 标志位 | 英文全称 | 含义 | 置1条件 |
|---|---|---|---|
| CF | Carry Flag | 进位/借位标志 | 加法产生进位或减法产生借位 |
| PF | Parity Flag | 奇偶标志 | 结果低8位中“1”的个数为偶数 |
| AF | Auxiliary Carry Flag | 辅助进位标志 | 低4位向高4位产生进位/借位(BCD码运算用) |
| ZF | Zero Flag | 零标志 | 运算结果为0 |
| SF | Sign Flag | 符号标志 | 运算结果的最高位为1(即负数,有符号数视角) |
| OF | Overflow Flag | 溢出标志 | 有符号数运算结果超出范围 |
CF 与 OF 的区别:
CF针对无符号数:超出 0~65535(或 0~255)时置1
OF针对有符号数:结果超出 -32768~+32767(或 -128~+127)时置1
示例:
MOV AL, 0x7F ; 127 ADD AL, 1 ; 结果 0x80 (128) ; CF=0, OF=1(有符号溢出), SF=1(最高位为1), ZF=0二、控制标志(3位)
由程序员设置,控制CPU行为。
| 标志位 | 英文全称 | 作用 |
|---|---|---|
| IF | Interrupt Flag | 中断允许标志:1=允许可屏蔽中断,0=禁止 |
| DF | Direction Flag | 方向标志:1=串操作地址递减,0=递增 |
| TF | Trap 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]四、常用指令对标志位的影响
| 指令 | CF | OF | SF | ZF | AF | PF |
|---|---|---|---|---|---|---|
| ADD / ADC | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| SUB / SBB | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| INC / DEC | — | ✓ | ✓ | ✓ | ✓ | ✓ |
| MUL / DIV | 变化 | — | 变化 | 变化 | ? | 变化 |
| AND / OR / XOR | 0 | 0 | ✓ | ✓ | ? | ✓ |
| NOT | — | — | — | — | — | — |
| CMP | 同SUB | 同SUB | 同SUB | 同SUB | 同SUB | 同SUB |
| MOV | — | — | — | — | — | — |
✓ = 受影响,— = 不影响,? = 未定义
五、典型应用场景
1. 判断无符号数大小(利用CF)
CMP AX, BX JA label ; AX > BX (CF=0 and ZF=0) JB label ; AX < BX (CF=1)2. 判断有符号数大小(利用OF和SF)
CMP AX, BX JG label ; AX > BX JL label ; AX < BX3. 多字节加法(利用CF)
ADD AL, BL ; 低8位相加 ADC AH, BH ; 高8位加上低位进位4. 单步调试(利用TF)
TF=1时,CPU执行每条指令后自动触发INT 1,调试器可利用此功能。
5. 快速数组复制(利用DF)
CLD ; DF=0,地址递增 REP MOVSB ; 正向复制 STD ; DF=1,地址递减 REP MOVSB ; 反向复制总结表速查
| 标志 | 含义 | 最常用时机 |
|---|---|---|
| CF | 无符号数加减进位/借位 | 多精度运算、无符号比较 |
| OF | 有符号数溢出 | 有符号比较、算术运算错误检测 |
| ZF | 结果为零 | 相等判断、循环计数 |
| SF | 结果为负 | 有符号数符号判断 |
| AF | 低4位进位 | BCD码调整(DAA/DAS) |
| PF | 低8位1的个数为偶 | 通信数据校验 |
| IF | 可屏蔽中断开关 | 临界区保护、中断控制 |
| DF | 串操作方向 | 字符串/数组复制方向控制 |
| TF | 单步陷阱 | 调试器实现 |
