# Statusregister

Das Statusregister (auch Zustandsregister, englisch condition code register (CCR), oder Programmstatuswort, englisch program status word (PSW)) ist ein spezielles Register im Rechenwerk eines Mikroprozessors. Da man diese Bits auch als Flags bezeichnet, wird das Statusregister auch Flagregister genannt. Es enthält eine Reihe von Flags, die von der arithmetisch-logischen Einheit (ALU) in Abhängigkeit von der zuletzt durchgeführten Rechenoperation (z. B. Überlauf, negatives Ergebnis) gesetzt werden. Einige Flags können auch durch direkte Anweisungen geändert werden. Manche Prozessoren – z. B. der 6502 – setzen die meisten Statusflags auch schon bei reinen Ladeoperationen.

## Verwendung

Bedingte (Sprung-)Anweisungen hängen ausschließlich von diesen Flags ab und einige Rechenoperationen der ALU werden vom Zustand der Flags beeinflusst.
Der Inhalt des Statusregisters lässt sich auf dem Stack ablegen, um ihn zu sichern. Dieses geschieht automatisch, wenn ein Interrupt aufgerufen wird, damit das Programm nach Beendigung des Interrupts ungestört weiter arbeiten kann.
Art und Umfang des Statusregisters ist abhängig von der CPU-Architektur. Eine Reihe von Flags treten jedoch in den meisten heutigen Mikroprozessoren auf. Zu diesen Flags zählen:
* das Carry-Flag (oder auch Borrow-Flag)
* das Zero-Flag
* das Sign-Flag bzw. Negative-Flag
* das Overflow-Flag
* das Adjust-Flag (auch Auxiliary-Carry-Flag oder Half-Carry-Flag)
* das Parity-Flag
* das Interrupt-Flag oder die Interrupt-Flags
* das BCD-Flag

## Allgemeine Flags eines Statusregisters
### Carry-Flag

Ist dieses Flag gesetzt, dann trat bei der letzten Rechenoperation ein Übertrag auf, wenn man von vorzeichenlosen Operanden ausgeht. War der letzte ausgeführte Befehl eine Schiebeoperation, so zeigt das Carry-Flag an, welchen Wert das rausgeschobene Bit hatte.

### Zero-Flag

Ist das Zero-Flag gesetzt, dann war das letzte Rechenergebnis gleich Null.
Bei einem Vergleichsbefehl werden zwei Operanden, ohne sie zu verändern, intern subtrahiert. Dann zeigt das Zero-Flag an, ob diese beiden Operanden gleich sind.

### Sign-Flag (Negative-Flag)

Heutige Mikroprozessoren verwenden zur Darstellung vorzeichenbehafteter Zahlen das Zweierkomplement. Negative Zahlen erkennt man am gesetzten höchstwertigen Bit. Das Sign-Flag wird entsprechend diesem Bit gesetzt.

### Overflow-Flag

Ist das Overflow-Flag gesetzt, dann trat bei der letzten Rechenoperation ein Überlauf auf, wenn man von vorzeichenbehafteten Operanden ausgeht. Beim Vergleich (interne Subtraktion) von vorzeichenbehafteten Werten benötigt man bedingte Sprungbefehle, die neben dem Overflow-Flag auch vom Sign-Flag abhängen.

### Parity-Flag

Ist die Anzahl der gesetzten Bits beim letzten Rechenergebnis gerade (Binärdarstellung), so wird das Parity-Flag gesetzt. Ist die Anzahl ungerade, so wird es gelöscht. Bei x86-Prozessoren wird das Parity-Flag nur über das niederwertigste Byte gebildet.

### Interrupt-Enable-Flag(s)

Dieses Flag ist kein Status-Flag, sondern ein Steuerungs-Flag. Wird es gelöscht, so werden maskierbare bzw. sperrbare Interrupts vom Prozessor ausgesetzt. Man löscht dieses Flag zu Beginn von Interrupt-Routinen (manche Prozessoren erledigen dies automatisch), damit diese ungestört bis zum Ende durchlaufen können. Der Prozessor führt nach dem Setzen des Interrupt-Enable-Flags erst noch eine Anweisung aus, bevor er wieder Interrupts zulässt. So kann man in einer Interrupt-Routine nach dem Setzen dieses Flags noch den Return-Befehl ausführen lassen.
Es gibt Interrupts, die vom Status des Interrupt-Enable-Flags unberührt bleiben. Diese nennt man nicht-maskierbare Interrupts (NMI).
Manche CPUs haben mehrere dieser Bits, um Interrupts verschiedener Prioritäten sperren oder erlauben zu können.

### Adjust-Flag

Hat ein Mikroprozessor keine speziellen Rechenbefehle für dualkodierte Dezimalziffern (BCD), so ist häufig dieses Flag vorhanden. Es wird bei „normalen“ binären Rechenoperationen gesetzt, wenn ein Übertrag zwischen den Halbbytes auftritt; z. B. bei der Addition von 9 und 7 = 16: 1001$_2$ + 0111$_2$ = 1 0000$_2$. Dieses Flag zeigt dann an, ob das Ergebnis korrigiert werden muss. 1001$_2$ + 0111$_2$ = 0001$_2$*(10$^1$) + 0110$_2$*(10$^0$).
Andere Mikroprozessoren besitzen ein BCD-(Status-)Flag, mit dem man vorab einstellen kann, ob der Prozessor wie mit „normalen“ binären Zahlen oder wie mit dualkodierten Dezimalziffern zu rechnen hat.

### BCD-Flag

Dieses Flag ist kein Status-Flag, sondern ein Steuerungs-Flag. Wird es gesetzt, arbeitet die Prozessor-Arithmetik – die ALU – im BCD-Modus statt in rein binärer Arithmetik. Damit sollen vor allem Finanzrechnungen direkt im Dezimalsystem durchgeführt und Ungenauigkeiten bei Umrechnung von binären Fest- oder Gleitkommazahlen vermieden werden.

## CPU-Architekturen ohne arithmetische Flags

Einige RISC-Architekturen haben keine üblichen Statusregister mit entsprechenden Flags. Dazu gehören MIPS (ebenso der dem MIPS nachempfundene Altera Nios), DEC Alpha und AMD 29000. Bei manchen CPU-Befehlen werden die entsprechenden Status-Flags, etwa der Übertrag („carry“), in einem Universalregister (etwa r8) als Bits gespeichert, in anderen Fällen, wie beim Erkennen eines arithmethischen Überlaufs, behilft man sich mit längeren Ersatzkonstrukten aus mehreren CPU-Befehlen.