Hi.
Bzgl. Rd und Rr:
"
Rd: Destination (and source) register in the Register File
Rr: Source register in the Register File
" (s. Doku)
In Rd wird also geschrieben (und evtl. gelesen), während aus Rr gelesen
wird.
Dabei stehen Rd und Rr als Platzhalter für irgendwelche Register aus r0,
..., r31. Für welche genau der jeweilige Befehl verwendbar ist, steht in
der Doku zu jedem Befehl.
Zu den Flags im SREG:
Die einzelnen Bits im SREG speichern jeweils einen bestimmten Teil des
Ergebnisses der letzten ausgeführten arithmetischen Operation:
Das "C" = Carry Flag, z.B., signalisiert, dass es einen Überlauf gegeben
hat,
das "Z" = Zero Flag zeigt an, dass das Ergebnis 0 war, e.t.c..
Das BREQ aus deinem Beispiel verzweigt also, wenn die vorherige
Berechnung 0 ergeben hat, also das Z-Flag auf 1 gesetzt ist.
Das erscheint natürlich erstmal eigenartig, weil ein Vergleich zweier
Werte intuitiv ja nichts mit 0 zu tun hat.
Tatsächlich ist das aber eine "Nebenwirkung" der Art und Weise, wie die
ALU einen Vergleich bewerkstelligt:
Um A mit B zu vergleichen, rechnet sie intern einfach A-B und setzt dann
die Flags entsprechend des Ergebnisses. Sind A und B gleich, ist das
Ergebnis eben 0 und deshalb wird das Z-Flag gesetzt.
Noch eine kurze Erläuterung zur Atmel Doku bzgl. der wichtigsten Flags:
C-"Carry"-Flag wird gesetzt, wenn es zu einem Überlauf bei einer
(8-Bit-)Operation gekommen ist. Bsp: 250 + 10 = 260. 260 passt aber
nicht mehr in 8 Bit, deshalb wird das Carry gesetzt.
Z-"Zero"-Flag: Ergebnis war 0, s.o.
N-"Negative"-Flag: Ergebnis war "negativ"; relevant, wenn mit
vorzeichenbehafteten ("signed") Werten gerechnet wird: Werte von -128
bis 127 statt von 0 bis 255.
V-"oVerflow?"-Flag: Wie das Carry-Flag, nur eben für signed Werte: 120 +
10 passt nicht mehr in einen signed 8-Bit-Wert (max. 127, s.o.), deshalb
wird das Flag gesetzt.
Die einzelnen Flags braucht man allerdings i.d.R. nicht explizit
auszuwerten (- geschweige denn zu setzen...), sondern lässt das die
meist viel klareren Branch-Befehle erledigen.
Viele Grüße
Hanno