LOW and HIGH Arbeitsregister?

OP #732762
Lesenswert?
• ▲
▼
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
#732771
Lesenswert?
• ▲
▼
>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.
Gast #732776
Lesenswert?
• ▲
▼
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
#732777
Lesenswert?
• ▲
▼
@ 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
#732838
Lesenswert?
• ▲
▼
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.
OP #733465
Lesenswert?
• ▲
▼
@ 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
#733472
Lesenswert?
• ▲
▼
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
#733478
Lesenswert?
• ▲
▼
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.
Gast #733481
Lesenswert?
• ▲
▼
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren