返回:网络安全知识库 · 上一节:段寄存器 · 下一节:内存特性

🎨 颜色标记说明

  • 粉色:特别重要、主线必掌握、优先复盘的内容。
  • 蓝色:核心概念、术语、分类名。
  • 橙色:需要关注的边界、易错点、注意事项。
  • 绿色:解释类内容、帮助理解知识点。

标志寄存器

Visual Studio (一般不看这个)

a1806fd536927e02c532fa3608044ed5 image-20260720183811873

X86DBG

53e0f8237282ccb45503b4451d8cba08

EFLAGS00000344

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, 0FFH
ADD AL, 1
PF(Parity Flag) PE(奇偶标志) 2 运算结果低 8 位中,1 的个数为偶数时置 1,否则置 0。 MOV EAX, 0FFFFFFFFH
ADD 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, 0FFFFFFFFH
ADD EAX, 1
SF(Sign Flag) PL(符号标志) 7 等于运算结果的最高有效位(MSB);最高位为 1 时,SF = 1。 MOV AL, 70H
ADD AL, 10H
DF(Direction Flag) UP(方向标志) 10 控制字符串指令的处理方向。DF = 0 时地址递增;DF = 1 时地址递减。 CLD:DF = 0
STD:DF = 1
OF(Overflow Flag) OV(溢出标志) 11 运算结果发生有符号整数溢出时置 1。 MOV AL, 7FH
ADD 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
; CF = 1,产生进位
MOV AL, 0FFH
ADD AL, 1
; AL = 00H, CF = 1


; PF = 1,低 8 位有偶数个 1
MOV EAX, 0FFFFFFFFH
ADD EAX, 1
; EAX = 00000000H, PF = 1


; AF = 1,bit3 向 bit4 进位
MOV AL, 0FH
ADD AL, 1
; AL = 10H, AF = 1


; ZF = 1,结果为 0
MOV EAX, 0FFFFFFFFH
ADD EAX, 1
; EAX = 00000000H, ZF = 1


; SF = 1,最高位为 1
MOV AL, 70H
ADD AL, 10H
;AL = 80H, SF = 1


; DF = 0,字符串操作地址递增
CLD
; DF = 0

; DF = 1,字符串操作地址递减
STD
; DF = 1


; OF = 1,有符号溢出
MOV AL, 7FH
ADD AL, 1
; AL = 80H, OF = 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。