Forum: Mikrocontroller und Digitale Elektronik AVR Instruction Set - Erklärung der Legende


von Martin L. (mcm)


Lesenswert?

Hi,

ich bin gerade dabei mir das AVR Instruction Set durchzulesen und es 
wird doch tatsächlich so einiges klar.

Jedoch sind einige Erklärungen in der Legende nicht klar, evtl. könnt 
ihr ja helfen:

1. Was bedeutet die Abkürzung Rd und Rr. Was ist vorallem der 
Unterschied?

2. Ich habe mir z.B. BREQ immer so gemerkt, dass wenn bei z.B. einem 
Zähler die Zahl gleich 0 wird dann eben verzweigt wird (bzw. anders 
herum bei BRNE). Generell habe ich mich dabei immer gefragt, was bei 
diesem Befehl die Bedingung ist. Im Instruction Set wird auf S.29 das 
nun weiter erklärt: im Punkt "Operation" wird nun erklärt:
1
If Rd = Rr (Z = 1) then PC ← PC + k + 1, else PC ← PC + 1
. Wie bereits angedeutet, was heißen hier Rd, Rr und Z? Gerade weil ich 
ja nur einen Pfad und keine Parameter wie Rd, Rr oder Z angeben muss. PC 
ist soweit klar als ProgrammCounter.

3. Um was handelt es sich bei Flags? Kann es sein, dass das sozusagen 
Statusmeldungen (deshalb im SREG) oder Schalter (wie beim I-Flag) sind? 
Aber was besagt das Zero, Carry, Negative und alle anderen (V,S,H,T) 
Flags aus?

Ich hoffe, Ihr könnt mir diesbzgl. helfen :)

von (prx) A. K. (prx)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Arithmetik8

Rd und Rr sind die beiden Registeroperanden eine AVR-Befehls.

von Hanno (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.