FLAGS register

The FLAGS register is the status register in Intel x86 microprocessors that contains the current state of the processor. This register is 16 bits wide. Its successors, the EFLAGS and RFLAGS registers, are 32 bits and 64 bits wide, respectively. The wider registers retain compatibility with their smaller predecessors.

The fixed bits at bit positions 1, 3 and 5, and carry, parity, adjust, zero and sign flags are inherited from an even earlier architecture, 8080 and 8085. The adjust flag used to be called auxiliary carry bit in 8080 and half-carry bit in the Zilog Z80 architecture.

FLAGS

Intel x86 FLAGS register[1]
Bit #MaskAbbreviationDescriptionCategory=1=0
FLAGS
00x0001CFCarry flagStatusCY(Carry)NC(No Carry)
10x0002Reserved, always 1 in EFLAGS [2][3] 
20x0004PFParity flagStatusPE(Parity Even)PO(Parity Odd)
30x0008Reserved[3] 
40x0010AFAdjust flagStatusAC(Auxiliary Carry)NA(No Auxiliary Carry)
50x0020Reserved[3] 
60x0040ZFZero flagStatusZR(Zero)NZ(Not Zero)
70x0080SFSign flagStatusNG(Negative)PL(Positive)
80x0100TFTrap flag (single step)Control
90x0200IFInterrupt enable flagControlEI(Enable Interrupt)DI(Disable Interrupt)
100x0400DFDirection flagControlDN(Down)UP(Up)
110x0800OFOverflow flagStatusOV(Overflow)NV(Not Overflow)
12-130x3000IOPLI/O privilege level (286+ only),
always 1 on 8086 and 186
System
140x4000NTNested task flag (286+ only),
always 1 on 8086 and 186
System
150x8000Reserved,
always 1 on 8086 and 186,
always 0 on later models
 
EFLAGS
160x0001 0000RFResume flag (386+ only)System
170x0002 0000VMVirtual 8086 mode flag (386+ only)System
180x0004 0000ACAlignment check (486SX+ only)System
190x0008 0000VIFVirtual interrupt flag (Pentium+)System
200x0010 0000VIPVirtual interrupt pending (Pentium+)System
210x0020 0000IDAble to use CPUID instruction (Pentium+)System
22-310xFFC0 0000ReservedSystem
RFLAGS
32-630xFFFF FFFF...
...0000 0000
Reserved 

Note: The mask column in the table is the AND bitmask (as hexadecimal value) to query the flag(s) within FLAGS register value.

Usage

All FLAGS registers contain the condition codes, flag bits that let the results of one machine-language instruction affect another instruction. Arithmetic and logical instructions set some or all of the flags, and conditional jump instructions take variable action based on the value of certain flags. For example, jz (Jump if Zero), jc (Jump if Carry), and jo (Jump if Overflow) depend on specific flags. Other conditional jumps test combinations of several flags.

FLAGS registers can be moved from or to the stack. This is part of the job of saving and restoring processor context, against a routine such as an interrupt service routine whose changes to registers should not be seen by the calling code. Here are the relevant instructions:

  • The PUSHF and POPF instructions transfer the 16-bit FLAGS register.
  • PUSHFD/POPFD (introduced with the i386 architecture) transfer the 32-bit double register EFLAGS.
  • PUSHFQ/POPFQ (introduced with the x64 architecture) transfer the 64-bit quadword register RFLAGS.

In 64-bit mode, PUSHF/POPF and PUSHFQ/POPFQ are available but PUSHFD/POPFD are not.[4]:4-349,4-432

The ability to push and pop FLAGS registers lets a program manipulate information in the FLAGS in ways for which machine-language instructions do not exist. For example, the cld and std instructions clear and set the direction flag (DF), respectively; but there is no instruction to complement DF. This can be achieved with the following assembly code:

pushf        ; Use the stack to transfer the FLAGS
pop ax       ; ...into the AX register
push ax      ; and copy them back onto the stack for storage
xor ax, 400h ; Toggle (complement) DF only; other bits are unchanged
push ax      ; Use the stack again to move the modified value
popf         ; ...into the FLAGS register
; Insert here the code that required the DF flag to be complemented
popf         ; Restore the original value of the FLAGS

By manipulating the FLAGS register, a program can determine the model of the installed processor. For example, the alignment flag can only be changed on the 486 and above. If the program tries to modify this flag and senses that the modification did not persist, the processor is earlier than the 486.

Starting with the Intel Pentium, the CPUID instruction reports the processor model. However, the above method remains useful to distinguish between earlier models.

See also

References

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.