条件码(conditional code)寄存器描述了最近的算术或逻辑操作的属性,可以检测这些条件码来执行条件分支指令。事实上,条件码的用法十分灵活,所以需要剖析得更仔细一些。
条件码寄存器详解
EFLAGS寄存器用于存储条件码,主要用于提供程序的状态及进行相应的控制。[1]这一32位寄存器的每一位有不同的名称和用途,其中名称为0和1的位是保留位,其值不应该被改变。下表[2]给出了每一位的相关信息:
第?位
名称
作用
0
CF
进位标志(Carry Flag)。若算术操作产生的结果在最高有效位(most-significant bit)发生进位或借位则将其置1,反之清零。这个标志指示无符号整型运算的溢出状态,这个标志同样在多倍精度运算(multiple-precision arithmetic)中使用。
1
1
-
2
PF
奇偶标志(Parity Flag)。如果结果的最低有效字节(least-significant byte)包含偶数个1位则该位置1,否则清零。
3
0
-
4
AF
调整标志(Adjust Flag)。如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。这个标志在BCD(binary-code decimal)算术运算中被使用。
5
0
-
6
ZF
零标志(Zero Flag)。若运算结果为0则将该位置1,反之清零。
7
SF
符号标志(Sign Flag)。该标志被设置为有符号整型的最高有效位。即如果结果是负数则置为1。
8
TF
陷阱标志(Trap Flag)。将该位设置为1以允许单步调试模式,清零则禁用该模式。
9
IF
中断标志(Interruption Flag)。该标志用于控制处理器对可屏蔽中断请求(maskable interrupt requests)的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。
10
DF
方向标志(Direction Flag)。设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),清除该标志则使得串指令自动递增。STD以及CLD指令分别用于设置以及清除DF标志。
11
OF
溢出标志(Overflow Flag)。当带符号整数运算溢出时置1。
12-13
IOPL
I/O特权标志(I/O Privilege Level field)。指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能允许访问I/O地址空间。
14
NT
嵌套任务标志(Nested Task flag)。这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。
15
0
-
16
RF
恢复标志(Resume Flag)。控制处理器对调试异常的响应。
17
VM
虚拟8086模式标志(Virtual-8086 Mode)。置1以允许虚拟8086模式,清除则返回保护模式。
18
AC
对齐检查标志(Alignment Check)。该标志以及在CR0寄存器中的AM位置1时将允许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。
19
VIF