Statusregister - Status register

Ein Statusregister , Flag - Register oder Bedingungscoderegister ( CCR ) ist eine Sammlung von Status - Flag - Bits für einen Prozessor . Beispiele für solche Register sind das FLAGS-Register in der x86-Architektur , Flags im PSW-Register ( Program Status Word ) in der IBM System / 360-Architektur bis z / Architecture und das APSR (Application Program Status Register) in der ARM Cortex-A- Architektur .

Das Statusregister ist ein Hardwareregister , das Informationen über den Status des Prozessors enthält . Einzelne Bits werden implizit oder explizit von den auf dem Prozessor ausgeführten Maschinencode- Anweisungen gelesen und / oder geschrieben . Über das Statusregister kann eine Anweisung abhängig vom Ergebnis einer vorherigen Anweisung Maßnahmen ergreifen.

In der Regel werden Flags im Statusregister als Auswirkungen von Arithmetik- und Bitmanipulationsoperationen geändert. Beispielsweise kann ein Z-Bit gesetzt werden, wenn das Ergebnis der Operation Null ist, und gelöscht werden, wenn es ungleich Null ist. Andere Befehlsklassen können auch die Flags ändern, um den Status anzuzeigen. Beispielsweise kann ein Zeichenfolgenbefehl dies tun, um anzuzeigen, ob der Befehl beendet wurde, weil er eine Übereinstimmung / Nichtübereinstimmung gefunden hat oder weil er das Ende des Strings gefunden hat. Die Flags werden von einem nachfolgenden bedingten Befehl gelesen, so dass die angegebene Aktion (abhängig vom Prozessor, ein Sprung, ein Aufruf, eine Rückgabe usw.) nur dann erfolgt, wenn die Flags ein bestimmtes Ergebnis des früheren Befehls anzeigen.

Einige CPU-Architekturen, wie MIPS und Alpha , verwenden kein dediziertes Flag-Register. Andere setzen und / oder lesen nicht implizit Flags. Solche Maschinen geben entweder überhaupt keine impliziten Statusinformationen zwischen Anweisungen weiter oder sie übergeben sie in einem explizit ausgewählten Allzweckregister.

Ein Statusregister kann häufig auch andere Felder enthalten, z. B. speziellere Flags, Interrupt- Aktivierungsbits und ähnliche Arten von Informationen. Während eines Interrupts kann der Status des aktuell ausgeführten Threads beibehalten (und später abgerufen) werden, indem der aktuelle Wert des Statusregisters zusammen mit dem Programmzähler und anderen aktiven Registern im Maschinenstapel oder einem anderen reservierten Speicherbereich gespeichert wird.

Gemeinsame Flaggen

Dies ist eine Liste der häufigsten CPU-Statusregister-Flags, die in fast allen modernen Prozessoren implementiert sind.

Flagge Name Beschreibung
Z. Null-Flagge Gibt an, dass das Ergebnis einer arithmetischen oder logischen Operation (oder manchmal einer Last) Null war.
C. Flagge tragen Ermöglicht das Addieren / Subtrahieren von Zahlen, die größer als ein einzelnes Wort sind, indem bei Bedarf eine Binärziffer von einem weniger signifikanten Wort zum niedrigstwertigen Bit eines signifikanteren Wortes übertragen wird. Es wird auch verwendet, um Bitverschiebungen zu verlängern und auf viele Prozessoren auf ähnliche Weise zu drehen (manchmal über ein dediziertes X- Flag).
S / N. Zeichen Flagge
Negative Flagge
Zeigt an, dass das Ergebnis einer mathematischen Operation negativ ist. In einigen Prozessoren unterscheiden sich die N- und S-Flags mit unterschiedlichen Bedeutungen und Verwendungen: Einer gibt an, ob das letzte Ergebnis negativ war, während der andere angibt, ob eine Subtraktion oder Addition stattgefunden hat.
V / O / W. Überlauf-Flag Gibt an, dass das vorzeichenbehaftete Ergebnis einer Operation zu groß ist, um mithilfe der Zweierkomplementdarstellung in die Registerbreite zu passen .

Andere Flaggen

Auf einigen Prozessoren enthält das Statusregister auch Flags wie diese:

Flagge Name Beschreibung
H / A / DC Half-Carry-Flag
Hilfsflag
Digit Carry
Dezimal-Anpassungsflag
Zeigt an, dass als Ergebnis der letzten arithmetischen Operation ein Bitübertrag zwischen den Halbbytes (typischerweise zwischen den 4-Bit-Hälften eines Byte-Operanden) erzeugt wurde. Ein solches Flag ist im Allgemeinen nützlich, um BCD- Arithmetikoperationen auf binärer Hardware zu implementieren.
P. Paritätsflagge Gibt an, ob die Anzahl der gesetzten Bits des letzten Ergebnisses ungerade oder gerade ist.
ich Flag unterbrechen Bei einigen Prozessoren gibt dieses Bit an, ob Interrupts aktiviert oder maskiert sind. Wenn der Prozessor mehrere Interrupt- Prioritätsstufen hat, wie z. B. der PDP-11 , können mehrere Bits verwendet werden, um die Priorität des aktuellen Threads anzuzeigen, sodass er nur durch Hardware unterbrochen werden kann, die auf eine höhere Priorität eingestellt ist. Bei anderen Architekturen kann ein Bit anzeigen, dass ein Interrupt derzeit aktiv ist und dass der aktuelle Thread Teil eines Interrupt-Handlers ist .
S. Supervisor-Flagge Auf Prozessoren, die zwei oder mehr Schutzringe bereitstellen , geben ein oder mehrere Bits im Statusregister den Ring des aktuellen Threads an (wie vertrauenswürdig er ist oder ob er das Betriebssystem für Anforderungen verwenden muss, die andere Threads behindern könnten). Auf einem Prozessor mit nur zwei Klingeltönen kann ein einzelnes Bit den Supervisor vom Benutzermodus unterscheiden.

CPU-Architekturen ohne arithmetische Flags

Statusflags ermöglichen es einer Anweisung, basierend auf dem Ergebnis einer vorherigen Anweisung zu handeln. In Pipeline- Prozessoren wie superskalaren und spekulativen Prozessoren kann dies zu Gefahren führen , die die Verarbeitung verlangsamen oder zusätzliche Hardware erfordern, um sie zu umgehen.

Einige Textverarbeitungsprogramme mit sehr langen Anweisungen verzichten auf die Statusflags. Eine einzelne Anweisung führt sowohl einen Test durch als auch gibt an, zu welchem ​​Ergebnis dieses Tests eine Aktion ausgeführt werden soll, z. B. Vergleiche a mit b und Springe zu c, wenn gleich. Das Testergebnis wird nicht für nachfolgende Anweisungen gespeichert.

Eine andere Alternative zum Statusregister besteht darin, dass Prozessoranweisungen Statusinformationen in einem Allzweckregister ablegen, wenn das Programm dies anfordert. MIPS , AMD 29000 , DEC Alpha und RISC-V sind Beispiele für Architekturen, die Vergleichsanweisungen bereitstellen, die das Vergleichsergebnis in einem Allzweckregister als einzelnes Bit oder als numerischen Wert von 0 oder 1 speichern. Bedingte Verzweigungen basieren auf der Wert im Universalregister.

Normalerweise testen Vergleichsanweisungen die Gleichheit oder die vorzeichenbehaftete / vorzeichenlose Größe. Um auf andere Bedingungen zu testen, verwendet ein Programm eine Äquivalenzformel. Zum Beispiel hat MIPS kein "Übertragsbit", aber ein Programm, das eine Mehrwortaddition durchführt, kann testen, ob eine Einzelwortaddition von Registern übergelaufen ist, indem getestet wird, ob die Summe niedriger als ein Operand ist:

        # alow = blow + clow
	addu	alow, blow, clow
        # set tmp = 1 if alow < clow, else 0
	sltu	tmp, alow, clow
	addu	ahigh, bhigh, chigh
	addu	ahigh, ahigh, tmp

Der sltu Befehl wird tmp basierend auf dem angegebenen Vergleich seiner beiden anderen Operanden auf 1 oder 0 gesetzt. (Hier wird das Allzweckregister tmp nicht als Statusregister verwendet, um einen bedingten Sprung zu steuern, sondern der mögliche Wert von 1, der den Übertrag von der Addition niedriger Ordnung anzeigt, wird zu dem Wort hoher Ordnung addiert.)

Dieses Schema wird beim Hinzufügen von drei oder mehr Wörtern weniger bequem, da beim Rechnen zwei Additionen auftreten b + c + tmp , von denen jedes einen Übertrag erzeugen kann, der mit zwei sltu Anweisungen erkannt werden muss . Glücklicherweise können diese beiden Übertragungen ohne Risiko eines Überlaufs zueinander hinzugefügt werden, sodass sich die Situation bei fünf Anweisungen pro hinzugefügtem Wort stabilisiert.

Siehe auch

Verweise