FLAGS regiszter

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(wd), 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(wd) 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.

FLAGS

Intel x86 FLAGS regiszter
Bit #MaszkRövidítésLeírásKategória=1=0
FLAGS
00x0001CFCarry flag(wd)StatusCY (Carry)NC (No Carry)
10x0002BRKII/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
20x0004PFParity flagStatusPE (Parity Even)PO (Parity Odd)
30x0008—Fenntartott—
40x0010AFAuxiliary Carry flag(wd)StatusAC (Auxiliary Carry)NA (No Auxiliary Carry)
50x0020—Fenntartott—
60x0040ZFZero flag(wd)StatusZR (Zero)NZ (Not Zero)
70x0080SFSign flag(wd)StatusNG (Negative)PL (Positive)
80x0100TFTrap flag(wd) (lépésenkénti végrehajtás)Control
90x0200IFInterrupt engedély flag(wd)ControlEI (Megszakítás engedélyezése)DI (Megszakítás letiltása)
100x0400DFDirection flag(wd)ControlDN (Down)UP (Up)
110x0800OFOverflow flag(wd)StatusOV (Overflow)NV (Not Overflow)
12–130x3000IOPLI/O jogosultsági szint(wd)
(csak 286+),
mindig csupa 1-es a 8086 és 186-on
System
140x4000NTBeágyazott feladatjelző
(286+ only),
mindig 1 8086 és 186-on
System
150x8000MDMó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
160x0001 0000RFResume flag (386+ only)System
170x0002 0000VMVirtual 8086 mode(wd) flag
(386+ only)
System
180x0004 0000ACAlignment Check (486+, ring 3),
SMAP(wd) Access Check (Broadwell+, ring 0-2)
System
190x0008 0000VIFVirtual interrupt flag (Pentium+)System
200x0010 0000VIPVirtual interrupt pending (Pentium+)System
210x0020 0000IDAble to use CPUID(wd) instruction (Pentium+)System
22–290x3FC0 0000—Reserved—
300x4000 0000(none)AES key schedule loaded flag
(VIA C3/C7 CPUs with VIA PadLock only)
System
31 0x8000 0000 AIAlternate Instruction Set(wd) enabled
(VIA C5XL processors only)
System
RX32"REX32" (an alternate to compatibility mode that allows access to 16 GPRs)
RFLAGS
32‑630xFFFF FFFF...
...0000 0000
—Reserved—
  1. ↑ a PadLock-ot támogató VIA Nano és a későbbi VIA/Zhaoxin processzorok már nem használják az EFLAGS 30-as bitjét.

Megjegyzés: A táblázat maszk oszlopa az AND bitmaszk(wd) (hexadecimális értékként), amely a FLAGS regiszterértéken belüli jelző(k) lekérdezéséhez szükséges.

Használat

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).

Példa

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(wd) 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.

Kapcsolódó szócikkek

Jegyzetek

  1. ↑ Az x86-64 számítógépes architektúrában a hosszú mód (long mode) az a mód, amelyben egy 64 bites operációs rendszer hozzáférhet a 64 bites utasításokhoz és regiszterekhez. A 64 bites programok egy 64 bites módnak nevezett almódban futnak, míg a 32 bites és a 16 bites védett módú(wd) programok egy kompatibilitási módnak nevezett almódban futnak. A valós módú(wd) vagy virtuális 8086 módú(wd) programok nem futtathatók natívan hosszú módban.
  2. ↑ Intel 64 and IA-32 Architectures Software Developer's Manual (PDF). Vol. 1. 2012. május. 3–21. o. 2013. december 6. dátummal az eredetiből archiválva (PDF). Hozzáférés: 2024. március 11.
  3. ↑ NEC, 16-bit V-series Microprocessor Data Book, 1991, pp. 429-433.
  4. ↑ Intel 64 and IA-32 Architectures Software Developer's Manual (PDF). Vol. 1. 2016. december. 78. o. 2019. május 25. dátummal az eredetiből archiválva (PDF). Hozzáférés: 2017. február 7.
  5. 1 2 3 "Silicon reverse engineering: The 8085's undocumented flags". www.righto.com. 2018. október 22. dátummal az eredetiből archiválva. Hozzáférés: 2018. október 21.
  6. ↑ Intel 64 and IA-32 Architectures Software Developer's Manual, Vol. 1. 2022. december. 3–16. o. 2023. június 2. dátummal az eredetiből archiválva. Hozzáférés: 2023. február 2.
  7. ↑ NEC, 16-bit V-Series User's Manual Archiválva 2021. december 2-i dátummal a Wayback Machine-ben., document no. U11301E, sep 2000, p. 186
  8. ↑ VIA, PadLock Programming Guide, v1.66, Aug 4, 2005, pp. 7-8. Archived from the original on May 26, 2010.
  9. ↑ Brilly Wu, RE: (PATCH) KVM: Add CPUID support for VIA CPU, KVM maliling list, 21 Apr 2011 - describes the change in EFLAGS[30] usage between VIA C7 and VIA Nano. Archived on 14 Mar 2026.
  10. ↑ VIA, VIA C3 Processor Alternate Instruction Set Application Note Archiválva 2024. január 19-i dátummal a Wayback Machine-ben., version 0.24, 2002 - see figure 2 on page 12 and chapter 4 on page 21 for details on the EFLAGS.AI flag.
  11. ↑ "rFLAGS register". sandpile.org. Hozzáférés: 2026. február 26.

Fordítás