FLAGS-Register - FLAGS register
Das FLAGS- Register ist das Statusregister , das den aktuellen Zustand einer CPU enthält . Die Größe und Bedeutung der Flag-Bits sind architekturabhängig. Es spiegelt normalerweise das Ergebnis von arithmetischen Operationen sowie Informationen über Einschränkungen des CPU-Betriebs zum aktuellen Zeitpunkt wider. Einige dieser Beschränkungen können das Verhindern der Auslösung einiger Interrupts, das Verbot der Ausführung einer Klasse von "privilegierten" Befehlen umfassen. Zusätzliche Statusflags können die Speicherzuordnung umgehen und definieren, welche Aktion die CPU bei einem arithmetischen Überlauf ausführen soll.
Die Übertrags-, Paritäts-, Anpassungs-, Null- und Vorzeichen-Flags sind in vielen Architekturen enthalten. Das Anpassungsflag wurde früher als Hilfsübertragsbit in 8080 und Halbübertragsbit in der Zilog Z80- Architektur bezeichnet.
In der i386- Architektur ist das Register 16 Bit breit. Seine Nachfolger, die Register EFLAGS und RFLAGS , sind 32 Bit bzw. 64 Bit breit. Die breiteren Register bleiben mit ihren kleineren Vorgängern kompatibel.
FLAGGEN
Intel x86 FLAGS registrieren | ||||||
---|---|---|---|---|---|---|
Bit # | Maske | Abkürzung | Beschreibung | Kategorie | =1 | =0 |
FLAGGEN | ||||||
0 | 0x0001 | CF | Flagge tragen | Status | CY (Übertragen) | NC (kein Übertrag) |
1 | 0x0002 | Reserviert, immer 1 in EFLAGS | ||||
2 | 0x0004 | PF | Paritätsflagge | Status | PE (Gerade Parität) | Bestellung (Parität ungerade) |
3 | 0x0008 | Reserviert | ||||
4 | 0x0010 | AF | Flagge anpassen | Status | AC (Hilfstransport) | NA (Kein Hilfstransport) |
5 | 0x0020 | Reserviert | ||||
6 | 0x0040 | ZF | Nullflagge | Status | ZR(Null) | Neuseeland (nicht Null) |
7 | 0x0080 | SF | Flagge unterschreiben | Status | NG (Negativ) | PL(positiv) |
8 | 0x0100 | TF | Trap-Flag (Einzelschritt) | Steuerung | ||
9 | 0x0200 | WENN | Unterbrechungsfreigabe-Flag | Steuerung | EI (Unterbrechung aktivieren) | DI (Interrupt deaktivieren) |
10 | 0x0400 | DF | Richtungsflagge | Steuerung | DN (Unten) | Nach oben nach oben) |
11 | 0x0800 | VON | Überlaufflagge | Status | OV (Überlauf) | NV (kein Überlauf) |
12-13 | 0x3000 | IOPL |
E/A-Berechtigungsebene (nur 286+), immer 1 bei 8086 und 186 |
System | ||
14 | 0x4000 | NT | Flag für verschachtelte Aufgaben (nur 286+), immer 1 bei 8086 und 186 |
System | ||
fünfzehn | 0x8000 | Reserviert, immer 1 bei 8086 und 186, immer 0 bei späteren Modellen |
||||
FLAGS | ||||||
16 | 0x0001 0000 | HF | Wiederaufnahme-Flag (nur 386+) | System | ||
17 | 0x0002 0000 | VM | Virtuelles 8086-Modus- Flag (nur 386+) | System | ||
18 | 0x0004 0000 | AC | Ausrichtungsprüfung (nur 486SX+) | System | ||
19 | 0x0008 0000 | VIF | Virtuelles Interrupt-Flag (Pentium+) | System | ||
20 | 0x0010 0000 | VIP | Virtueller Interrupt anstehend (Pentium+) | System | ||
21 | 0x0020 0000 | ICH WÜRDE | Kann den CPUID-Befehl verwenden (Pentium+) | System | ||
22‑31 | 0xFFC0 0000 | Reserviert | System | |||
RFLAGS | ||||||
32‑63 | 0xFFFF FFFF… …0000 0000 |
Reserviert |
Hinweis: Die Maskenspalte in der Tabelle ist die UND- Bitmaske (als hexadezimaler Wert), um das/die Flag(s) im FLAGS-Registerwert abzufragen.
Verwendungszweck
Alle FLAGS-Register enthalten die Bedingungscodes , Flag-Bits, die es den Ergebnissen eines maschinensprachlichen Befehls ermöglichen, einen anderen Befehl zu beeinflussen. Arithmetische und logische Befehle setzen einige oder alle Flags, und bedingte Sprungbefehle führen eine variable Aktion basierend auf dem Wert bestimmter Flags durch. Beispielsweise hängen jz
(Sprung bei Null), jc
(Sprung bei Übertrag) und jo
(Sprung bei Überlauf) von bestimmten Flags ab. Andere bedingte Sprünge testen Kombinationen mehrerer Flags.
FLAGS-Register können vom oder auf den Stack verschoben werden. Dies ist Teil der Aufgabe des Sicherns und Wiederherstellens des CPU-Kontexts für eine Routine wie eine Interrupt-Service-Routine, deren Änderungen an Registern vom aufrufenden Code nicht gesehen werden sollen. Hier die entsprechenden Anweisungen:
- Die Befehle PUSHF und POPF übertragen das 16-Bit-FLAGS-Register.
- PUSHFD/POPFD (eingeführt mit der i386- Architektur) übertragen die 32-Bit-Doppelregister-EFLAGS.
- PUSHFQ/POPFQ (eingeführt mit der x64- Architektur) übertragen das 64-Bit-Quadword-Register RFLAGS.
Im 64-Bit-Modus sind PUSHF/POPF und PUSHFQ/POPFQ verfügbar, PUSHFD/POPFD jedoch nicht.
Die unteren 8 Bits des FLAGS-Registers sind auch offen für eine direkte Lade-/Speicher-Manipulation durch SAHF und LAHF (Laden/Speichern von AH in Flags).
Beispiel
Die Fähigkeit, FLAGS-Register zu pushen und zu öffnen, ermöglicht es einem Programm, Informationen in den FLAGS auf eine Weise zu manipulieren, für die es keine Maschinensprachbefehle gibt. Zum Beispiel kann die cld
und std
Anweisungen klar und stellen Sie den Richtungs - Flag (DF) verbunden ist; aber es gibt keine Anweisung, DF zu ergänzen. Dies kann mit dem folgenden Assemblercode erreicht werden :
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
Durch Manipulation des FLAGS-Registers kann ein Programm das Modell des installierten Prozessors bestimmen. Beispielsweise kann das Ausrichtungs-Flag nur beim 486 und höher geändert werden . Wenn das Programm versucht, dieses Flag zu ändern und feststellt, dass die Änderung nicht bestanden hat, ist der Prozessor älter als der 486.
Beginnend mit dem Intel Pentium , der CPUID meldet Anweisung des Prozessormodells. Die obige Methode bleibt jedoch nützlich, um zwischen früheren Modellen zu unterscheiden.
Siehe auch
- Bitfeld
- Kontrollregister
- CPU-Flag (x86)
- Programmstatuswort
- Statusregister
- x86-Assemblersprache
- x86-Anweisungslisten