Servus, habe eine totale Anfänger Frage, die ich mittels älteren Beträgen nicht selbst beantworten konnte. Habe in einem Beispiel Code gesehen, dass ein Arbeitsregister (r16) auch mit HIGH and LOW angesprochen werden kann. Low addressiert das erste (0-7) und HIGH obere Byte (8-15), richtig? Ist es aber nicht so, dass die Arbeitsregister nur 1 Byte groß sind? Ist diese adressierung dann nicht Unsinn? LG HFQ
>Ist es aber nicht so, dass >die Arbeitsregister nur 1 Byte groß sind? Musst mal im Datenblatt nachschauen. r32, r31, r30 sind 16 Bit breit.
>Ist diese adressierung dann >nicht Unsinn? Siehe auch: Beitrag "Little oder Big Endian im mega64?" Der Fred ist noch ganz warm... Normaler Weise werden die Bytes einzeln angesprochen. Da das aber bei Adressen lästig ist, haben die sich für die X, Y, Z-Register Ausnahmen einfallen lassen. High und Low sprichst du einfach über XH, XL, YH, YL, ZH, ZL an. >Low addressiert das erste (0-7) und HIGH obere Byte (8-15), richtig? Low ist Bit 0-7 und High ist 8-15 und die Anordnung erst Low, dann High ist Little Endian, korrekt.
HI High und Low beziehen nicht auf das Register, sondern auf das Argument. Also du lädst damit z.B. r16 mit den oberen oder unteren 8 Bit eines Wertes. Das ganze ist sinnvoll, wenn man einen Wert>255 auf zwei Register aufteilen will. MfG Spess
@ hfquincy >Habe in einem Beispiel Code gesehen, dass ein Arbeitsregister (r16) auch >mit HIGH and LOW angesprochen werden kann. Nein, so nicht. > Low addressiert das erste (0-7) und HIGH obere Byte (8-15), richtig? Ja, von einer Konstante. > Ist es aber nicht so, dass >die Arbeitsregister nur 1 Byte groß sind? Ist diese adressierung dann >nicht Unsinn? Nöö. Das nutzt man so.
1 | ldi ZL,low(meine_daten*2) |
2 | ldi ZH,high(meine_daten*2) |
3 | ; Der Z-Pointzer, welcher aus R30/r31 besteht, zeigt nun auf meine_daten |
4 | |
5 | .... |
6 | |
7 | meine_daten: ; eine Tabelle im Flash |
8 | db. 1,2,3,4,5,6,7 |
Siehe AVR-Tutorial: Mehrfachverzweigung MFG Falk
Drahteinsparer wrote: >>Ist es aber nicht so, dass >>die Arbeitsregister nur 1 Byte groß sind? > > Musst mal im Datenblatt nachschauen. r32, r31, r30 sind 16 Bit breit. Da solltest Du wohl selber mal im Datenblatt nachschauen... 16-Bit-Register gibt es beim AVR nicht, nur einige Befehle, die Registerpaare ansprechen können.
@ johnny-m Genau so habe ich das auch verstanden. Wofür also z. B. so etwas: ... ldi r16,LOW(RAMEND) out SPL,r16 ldi r16,HIGH(RAMEND) out SPH,r16 ... Dass es sich insgesamt in dem Bsp. um die Initialisierung des Stack Pointers handelt ist mir völlig klar. Und das unter den Arbeitsregistern auch 3 Pointer Registerpaare (X,Y,Z) existieren, ist mir auch bekannt. Aber dies trifft A) bei R16 nicht zu UND B) weiterhin wird in dem o.g. Bsp. ausschließlich R16 mit LOW/HIGH angesprochen Hast du so etwas schon einmal gesehen? Wie darf ich das verstehen? LG HFQ
H. F. wrote: > ... > ldi r16,LOW(RAMEND) > out SPL,r16 > ldi r16,HIGH(RAMEND) > out SPH,r16 > ... > > Dass es sich insgesamt in dem Bsp. um die Initialisierung des Stack > Pointers handelt ist mir völlig klar. Und das unter den Arbeitsregistern > auch 3 Pointer Registerpaare (X,Y,Z) existieren, ist mir auch bekannt. > Aber dies trifft > > A) bei R16 nicht zu UND > B) weiterhin wird in dem o.g. Bsp. ausschließlich R16 mit LOW/HIGH > angesprochen Da wird nicht r16 angesprochen. Das LOW bzw. HIGH bezieht sich auf RAMEND. RAMEND ist ein 16 Bit Wert. Davon willst du das niederwertige Byte und dieses soll wiederrum in r16 landen ldi r16, LOW(RAMEND) von wo es dann weitergereicht wird in das Register, welches das niederwertige Byte des Stackpointer aufnimmt. out SPL, r16 Selbiges mit dem höherwertigen Byte von RAMEND und dem HIGH
Prima, jetzt habe ich auch Spess53 verstanden. Vielen Dank für diese Antworten dafür! Weiß nun endlich bescheid. LG HFQ
H. F. wrote: > Prima, > > lag es an meiner ersten Frage? Indirekt. Merken: Wenn du Fragen zu einem Codestück hast, dann zeige das Codestück selbst und nicht nur eine Beschreibung davon. Ein Codestück ist meistens ziemlich eindeutig. Eine Beschreibung davon eher nicht.
Hi Mal ein Beispiel: Low($3FF)=$FF High($3FF)=$03 Beim Stackpointer ist r16 nur ein Zwischenregister, da SPL/SPH nicht direkt mit einem Wert geladen werden können. Das Low und High bezieht sich in diesem Fall auf SPL und SPH. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.