Dem Instruction Set Summary kann man entnehmen, dass bis auf wenige Ausnahmen die
- Bit-Instruktionen
- arithmetischen-Instruktionen
- logischen Instruktionen
die Flags im Statusregister (SREG) verändern. Welche Flags gesetzt und ggf. auch wieder wann gelöscht werden, soll an Beispielen mit dem AVR Simulator
gezeigt werden.
Das 8-Bit breite Statusregister enthält Informationen über das Ergebnis der zuletzt ausgeführten arithmetischen Anweisung. Diese Informationen können zum Ändern des
Programmflusses verwendet werden, um bedingte Operationen auszuführen.
I-Flag - Bit7 (Global Interrupt Enable)
- Das 7. Bit Global Interrupt Enable muss gesetzt werden, damit Interrupts freigegeben werden. Es ist kein Flag des Controllers.
- Ist das I-Flag gelöscht, wird kein Interrupt in einem Programm freigegeben.
- Das I-Bit wird durch Hardware gelöscht, nachdem ein Interrupt aufgetreten ist, und durch den RETI-Befehl gesetzt, um nachfolgende Interrupts freizugeben.
- Das I-Bit kann auch von einer Anwendung mit den Befehlen SEI und CLI gesetzt bzw. gelöscht werden (siehe ISS).
Es kontrolliert das MCU Control Register.
T-Flag - Bit6 (Bit Copy Storage)
- Bit Copy Speicher Flag wird später besprochen. Es ist kein Controller-Flag.
H-Flag - Bit5 (Half Carry Flag)
- Zeigt bei einigen arithmetischen Operationen (Addition, Subtraktion, Inkrement, Dekrement und Vergleiche) einen Übertrag vom lower nibble Bit3 zu Bit4 im
upper nibble an.
S-Flag - Bit4 (Sign Bit)
- Das S-Bit ist immer eine EXOR Verknüpfung zwischen dem Negativ-Flag N und dem Zweierkomplement-Überlauf-Flag V. Damit lassen sich
vorzeichenbehaftete Werte miteinander vergleichen. Ist Bit7 vom Wert 1, so wird die Zahl als negativ interpretiert (-1 ... -128), ist sie vom Wert 0, ist sie eine positive Zahl (0 ...
127).
V-Flag - Bit3 (Two´s Complement Overflow)
- Das Zweierkomplement-Überlauf-Flag V unterstützt die Zweierkomplement-Arithmetik. Es wird
gesetzt, wenn es einen Über- oder Unterlauf gegeben hat. Nach logischen Befehlen ist das V-Flag immer 0.
N-Flag - Bit2 (Negative Flag)
- Zeigt ein negatives Ergebnis nach einer arithmetischen oder logischen Instruktion an. Bei der 2er-Komplement-Arithmetik entspricht eine 1 in Bit7 einer negativen
Zahl.
C-Flag - Bit1 (Carry Flag)
- Gibt es bei der zuletzt ausgeführten Instruktion einen Über- oder Unterlauf, wird das Flag gesetzt. Bei einer Addition, Subtraktion. logischen Operation (wenn der
erste Operand kleiner als der zweite ist) oder zyklischem Schieben wird das C-Flag gesetzt.
Z-Flag - Bit0 (Zero Flag)
- Das Flag wird bei einem Ergebnis 0 nach einer arithmetischen oder logischen Instruktion gesetzt.
Wie arbeitet das Programm SREG1.asm ?
Betrachten wir die einzelnen Instruktionen. Schlage im Datenblatt des ATMega 8 das Instruction Set Summary (ISS)
auf.
- Gestartet wird die Simulation in Programmzeile 26 mit der Instruktion OUT. Sie löscht alle Flags in
SREG.
- Die nachfolgenden beiden Instruktionen LDI speichern jeweils eine Zahl in A (R19) und
B (R20). Flags werden laut ISS nicht gesetzt.
- Der Additionsbefehl ADD in Programmzeile 30 setzt in SREG die Flags H
(Halfcarry Flag) und C (Carry Flag) -> siehe Abb. 3.
- Das H-Flag wird gesetzt, weil Bit4 von vorher 0 auf 1 wechselt. Es erfolgte ein Übertrag vom lower
nibble zu Bit4 im upper nibble.
- Das C-Flag wird gesetzt, weil die Summe aus E9 und 4E dezimal 311 ergibt oder binär: 1 0011
0111. Es erfolgt ein Übertrag in das neunte Bit, angezeigt durch das C-Flag.
- Das Z-Flag ist nicht gesetzt; es erfolgt ein Rücksprung in Programmzeile 26. Alles beginnt von vorn.
Wie arbeitet das Programm SREG2.asm ?
Mit Hilfe eines Simulationsprogramms lässt sich auf diese Weise sehr genau das Verhalten eines Controllers und der Flags bei
Ausführung jeder einzelnen Instruktion beobachten. Neben den Datenblättern ein sehr nützliches Werkzeug, um Programmierfehler auszumerzen oder einzukreisen.