010、存储—标志寄存器
标志寄存器
Visual Studio (一般不看这个)
![]()
![]()
X86DBG
EFLAGS:00000344
BIT:0000 0000 0000 0000 0000 0011 0100 0100
Bit 9:IF = 1(允许可屏蔽中断)
Bit 8:TF = 1(开启单步调试)
Bit 6:ZF = 1(运算结果为 0)
Bit 2:PF = 1(运算结果低 8 位中,1 的数量为偶数)
其余常用标志位:CF = 0、AF = 0、SF = 0、DF = 0、OF = 0。
注意:EFLAGS 的 Bit 1 是保留位,读取时固定为 1。:contentReference[oaicite:0]{index=0}
因此,若表示 CPU 实际读取的完整 EFLAGS,Bit 1 应计入,数值应为:
0x346 = 0000 0000 0000 0000 0000 0011 0100 0110
部分工具可能只根据具名标志位生成摘要值,从而显示为 0x344;记录时需要区分标志位摘要与完整 EFLAGS 值。
EFLAGS 常用标志位
| Flags | Visual Studio | Index | 含义 | 代码示例 |
|---|---|---|---|---|
| CF(Carry Flag) | CY(进位标志) | 0 | 运算结果产生进位或借位时置 1,否则置 0。主要用于判断无符号整数溢出。 | MOV AL, 0FFHADD AL, 1 |
| PF(Parity Flag) | PE(奇偶标志) | 2 | 运算结果低 8 位中,1 的个数为偶数时置 1,否则置 0。 | MOV EAX, 0FFFFFFFFHADD EAX, 1 |
| AF(Auxiliary Carry Flag) | AC(辅助进位) | 4 | 低四位向高四位,即 Bit 3 向 Bit 4 产生进位或借位时置 1。 | 0000 1111 + 0000 0001结果: 0001 0000,AF = 1 |
| ZF(Zero Flag) | ZR(零标志) | 6 | 运算结果为 0 时置 1,否则置 0。 | MOV EAX, 0FFFFFFFFHADD EAX, 1 |
| SF(Sign Flag) | PL(符号标志) | 7 | 等于运算结果的最高有效位(MSB);最高位为 1 时,SF = 1。 | MOV AL, 70HADD AL, 10H |
| DF(Direction Flag) | UP(方向标志) | 10 | 控制字符串指令的处理方向。DF = 0 时地址递增;DF = 1 时地址递减。 | CLD:DF = 0STD:DF = 1 |
| OF(Overflow Flag) | OV(溢出标志) | 11 | 运算结果发生有符号整数溢出时置 1。 | MOV AL, 7FHADD AL, 1 |
CF 判断无符号数溢出,OF 判断有符号数溢出。
OF 判断规律:正数 + 正数得到负数,或负数 + 负数得到正数时,OF = 1。
注意:原图中 ZF 的 Index 写成了 5,正确位置应为 Bit 6。
常用标志位位置:CF = Bit 0、PF = Bit 2、AF = Bit 4、ZF = Bit 6、SF = Bit 7、DF = Bit 10、OF = Bit 11。
1 | ; CF = 1,产生进位 |
课后练习
1、拆解 EFLAGS 寄存器。
2、编写汇编指令,分别只影响某个标志位的值:CF、PF、AF、SF、OF
其他
| Flags | Index | 含义 |
|---|---|---|
| IOPL(I/O Privilege Level) | 12、13 | 表示当前程序的 I/O 特权级,占 2 Bit,取值范围为 0~3 |
| NT(Nested Task) | 14 | 嵌套任务标志。执行嵌套任务时,该标志位会被置 1 |
| RF(Resume Flag) | 16 | 恢复标志,用于控制调试异常的响应,避免同一条指令重复触发调试异常 |
| VM(Virtual 8086 Mode) | 17 | VM = 1 表示进入 虚拟 8086 模式;VM = 0 表示不处于虚拟 8086 模式 |
注意:IOPL 占用 Bit 12~13,不是单独一个标志位。
常用标志位位置:CF = Bit 0、PF = Bit 2、AF = Bit 4、ZF = Bit 6、SF = Bit 7、TF = Bit 8、IF = Bit 9、DF = Bit 10、OF = Bit 11、IOPL = Bit 12~13、NT = Bit 14、RF = Bit 16、VM = Bit 17。








