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 cldund stdAnweisungen 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

Verweise