A FLAGS regiszter az állapotregiszter, amely egy x86-os CPU aktuális állapotát tartalmazza. A flag bitek mérete és jelentése architektúrától függ. Általában a számtani műveletek eredményét, valamint a CPU működésére az adott időpontban vonatkozó korlátozásokkal kapcsolatos információkat tükrözi. Ezen korlátozások némelyike magában foglalhatja bizonyos megszakítások kiváltásának megakadályozását, egy "privilegizált" utasításosztály végrehajtásának tiltását. További állapotflagek megkerülhetik a memória-leképezést, és meghatározhatják, hogy a CPU milyen műveletet tegyen számtani túlcsordulás esetén.
Az átvitel (carry), paritás (parity), kiegészítő átvitel (auxiliary carry vagy félátvitel, half-carry), nulla (zero) és előjel (sign) jelzők számos architektúrában megtalálhatók (sok modern (RISC) architektúrában nincsenek jelzők, mint például az átvitel, és még ha használnak is jelzőket, akkor a félátvitel ritka, mivel a BCD aritmetika már nem elterjedt, sőt, x86-64-en hosszú módban is korlátozott támogatással rendelkezik).
Az Intel 8086-ban a regiszter 16 bit széles. Utódai, az EFLAGS és RFLAGS regiszterek (a modern x86-64-ben) 32, illetve 64 bit szélesek. A szélesebb regiszterek továbbra is kompatibilisek kisebb elődeikkel.
| Intel x86 FLAGS regiszter | ||||||
|---|---|---|---|---|---|---|
| Bit # | Maszk | Rövidítés | Leírás | Kategória | =1 | =0 |
| FLAGS | ||||||
| 0 | 0x0001 | CF | Carry flag | Status | CY (Carry) | NC (No Carry) |
| 1 | 0x0002 | BRKI | I/O Trap (csak NEC V25/V35/V55), foglalt és mindig 1 az EFLAGS-ban minden más x86 processzoron | Control | (NEC only) I/O permitted | (NEC only) I/O trapped |
| 2 | 0x0004 | PF | Parity flag | Status | PE (Parity Even) | PO (Parity Odd) |
| 3 | 0x0008 | — | Fenntartott | — | ||
| 4 | 0x0010 | AF | Auxiliary Carry flag | Status | AC (Auxiliary Carry) | NA (No Auxiliary Carry) |
| 5 | 0x0020 | — | Fenntartott | — | ||
| 6 | 0x0040 | ZF | Zero flag | Status | ZR (Zero) | NZ (Not Zero) |
| 7 | 0x0080 | SF | Sign flag | Status | NG (Negative) | PL (Positive) |
| 8 | 0x0100 | TF | Trap flag (lépésenkénti végrehajtás) | Control | ||
| 9 | 0x0200 | IF | Interrupt engedély flag | Control | EI (Megszakítás engedélyezése) | DI (Megszakítás letiltása) |
| 10 | 0x0400 | DF | Direction flag | Control | DN (Down) | UP (Up) |
| 11 | 0x0800 | OF | Overflow flag | Status | OV (Overflow) | NV (Not Overflow) |
| 12–13 | 0x3000 | IOPL | I/O jogosultsági szint (csak 286+), mindig csupa 1-es a 8086 és 186-on | System | ||
| 14 | 0x4000 | NT | Beágyazott feladatjelző (286+ only), mindig 1 8086 és 186-on | System | ||
| 15 | 0x8000 | MD | Módjelző (csak NEC V-series), minden Intel CPU-n fenntartva. Mindig 1 a 8086/186-on, 0 a 286-os és újabb verziókon. | Control | (NEC only) Native Mode (186 compatible) | (NEC only) Emulation Mode (8080 compatible) |
| EFLAGS | ||||||
| 16 | 0x0001 0000 | RF | Resume flag (386+ only) | System | ||
| 17 | 0x0002 0000 | VM | Virtual 8086 mode flag (386+ only) | System | ||
| 18 | 0x0004 0000 | AC | Alignment Check (486+, ring 3), SMAP Access Check (Broadwell+, ring 0-2) | System | ||
| 19 | 0x0008 0000 | VIF | Virtual interrupt flag (Pentium+) | System | ||
| 20 | 0x0010 0000 | VIP | Virtual interrupt pending (Pentium+) | System | ||
| 21 | 0x0020 0000 | ID | Able to use CPUID instruction (Pentium+) | System | ||
| 22–29 | 0x3FC0 0000 | — | Reserved | — | ||
| 30 | 0x4000 0000 | (none) | AES key schedule loaded flag (VIA C3/C7 CPUs with VIA PadLock only) | System | ||
| 31 | 0x8000 0000 | AI | Alternate Instruction Set enabled (VIA C5XL processors only) | System | ||
| RX32 | "REX32" (an alternate to compatibility mode that allows access to 16 GPRs) | |||||
| RFLAGS | ||||||
| 32‑63 | 0xFFFF FFFF... ...0000 0000 | — | Reserved | — | ||
Megjegyzés: A táblázat maszk oszlopa az AND bitmaszk (hexadecimális értékként), amely a FLAGS regiszterértéken belüli jelző(k) lekérdezéséhez szükséges.
Minden FLAGS regiszter tartalmazza a feltételkódokat, azaz a jelzőbiteket, amelyek lehetővé teszik, hogy egy gépi kódú utasítás eredménye egy másik utasításra hatással legyen. Az aritmetikai és logikai utasítások beállítják a jelzők (flag-ek) egy részét vagy egészét, a feltételes ugró utasítások pedig bizonyos jelzők értéke alapján változó műveleteket hajtanak végre. Például a jz (Jump if Zero), a jc (Jump if Carry) és a jo (Jump if Overflow) adott jelzőktől függenek. Más feltételes ugrások több jelző kombinációit tesztelik.
A FLAGS regiszterek áthelyezhetők a verembe vagy a veremből. Ez a CPU-kontextus mentésének és visszaállításának része egy olyan rutinnal szemben, mint például egy megszakításkezelő rutin, amelynek regiszterváltozásait a hívó kódnak nem szabad látnia. Íme a vonatkozó utasítások:
64 bites módban a PUSHF/POPF és a PUSHFQ/POPFQ elérhető, de a PUSHFD/POPFD nem.[11]:4–349, 4–432
A FLAGS regiszter alsó 8 bitje nyitott a SAHF és LAHF általi közvetlen betöltés/tárolás manipulációra is (az akkumulátor magasabb helyiértékű része, az AH betöltése/tárolása jelzőkbe).
A FLAGS regiszterek feltöltésének és bezárásának képessége lehetővé teszi a programok számára, hogy a FLAGS regiszterekben lévő információkat olyan módon manipulálják, amelyre gépi nyelvi utasítások nem léteznek. Például a cld és std utasítások törlik, illetve beállítják az irányjelzőt (DF), de nincs utasítás a DF kiegészítésére. Ez a következő assembly kóddal érhető el:
; Ez egy 8086-os kód, 16 bites regiszterekkel a veremre helyezve,
; és a flags regiszter csak 16 bites ennél a CPU-nál.
pushf ; Használja a veremtárolót a FLAGS-ok átviteléhez
pop ax ; … az AX regiszterbe
push ax ; és másolja vissza őket a verembe tárolás céljából
xor ax, 400h ; Csak a DF bitet kapcsolja ki (invertálja, 'kiegészíti'); a többi bit változatlan marad
push ax ; Használd újra a veremkezelőt a módosított érték
popf ; … FLAGS regiszterbe helyezéséhez
; Ide kell beszúrni azt a kódot, amelyhez a DF jelző kiegészítése szükséges.
popf ; A FLAGS eredeti értékének visszaállítása
A FLAGS regiszter manipulálásával a program meghatározhatja a telepített processzor modelljét. Például az igazítási jelző csak a 486-os és újabb processzorokon módosítható. Ha a program megpróbálja módosítani ezt a jelzőt, és azt érzékeli, hogy a módosítás nem maradt fenn, akkor a processzor korábbi, mint a 486-os.
Az Intel Pentiummal kezdődően a CPUID utasítás a processzor modelljét adja meg. A fenti módszer azonban továbbra is hasznos a korábbi modellek megkülönböztetésére.