Ein Ergebnis ist mehr als nur eine Zahl
Eine ALU gibt nicht nur die Summe oder Differenz zweier Operanden aus — echte Prozessoren speichern zusätzlich eine Handvoll Ein-Bit-Statusflags, die Eigenschaften dieses Ergebnisses beschreiben, weil Software ständig Ja/Nein-Fragen dazu stellen muss: War es null, gab es einen Überlauf, entstand beim Addieren ein Übertrag.
Zero und Carry
Zwei Flags decken das Wesentliche ab:
- Zero (Z) — 1, wenn jedes Ausgangsbit 0 ist. Boolflows ZERO_DET-Block berechnet genau das, indem er alle Ausgangsbits verknüpft.
- Carry (C) — der eigene Cout des Addierers, zusammen mit dem Ergebnis gespeichert. Bei der Subtraktion bedeutet ein Übertrag aus A+(¬B)+1 üblicherweise „kein Borgen aufgetreten", also A≥B.
Overflow: wenn Carry nicht ausreicht
Carry allein sagt nicht, ob ein vorzeichenbehaftetes Ergebnis falsch ist — die Addition zweier großer positiver Zahlen im Zweierkomplement kann ein negativ aussehendes Ergebnis ganz ohne Übertrag erzeugen. Die Standardlösung ist Overflow (V) = Cout XOR (Übertrag in das Vorzeichenbit): Die beiden internen Überträge stimmen im Normalbetrieb überein und weichen genau dann voneinander ab, wenn ein vorzeichenbehaftetes Ergebnis übergelaufen ist.
Von Flags zu Sprüngen
Ein bedingter Sprungbefehl wie „springe, wenn gleich" ist nichts weiter als die Prüfung des Zero-Flags, das von einem vorangegangenen Komparator oder einer Subtraktion übrig geblieben ist. Verdrahten Sie im Schaltungseditor einen CMP4 oder eine subtrahierende ALU mit einem ZERO_DET, und Sie haben die Bedingungsprüfungshälfte jeder if-Anweisung gebaut, die eine CPU je ausführt.