hi8/lo8-Makros in AVR-gas, warum funktionieren sie nur manchmal?

Gast #2978350
Lesenswert?

Servus,

ich frage mich garade warum ich eigentlich immer nur raten kann wann die 
makros hi8() und lo8() funktionieren.
in meinem Assembler-code habe ich festgestellt, dass z.B.
1
subi  r30, lo8(-(array))
2
sbci  r31, hi8(-(array))
problemlos funktioniert, wohingegen
1
lds  r24, lo8(array)
2
lds  r25, hi8(array)
den Fehler
1
Error: garbage at end of line
verursacht.
Was genau ist der Unterschied?
Gast #2978483
Lesenswert?

Stefan Ernst schrieb:
> Der Unterschied ist, dass Letzteres schlicht keinen Sinn macht.
> Was du da eigentlich haben willst:
1
lds  r24, array
2
lds  r25, array+1

Verstehe ich jetzt nicht, denn wenn "array" 16bit-Werte enthält, dann 
lade ich doch genau so wie du es schreibst den Wert vom 1. Array-Element 
in die Register r24 und r25.
Und genau das wollte ich damit bezwecken. Nur wo ist der Unterschied zu 
meinem 2. Beispiel?
#2978505
Lesenswert?

Tobias AsmBeginner schrieb:
> Verstehe ich jetzt nicht, denn wenn "array" 16bit-Werte enthält,

Du programmierst in Assembler, und da enthält "array" gar nichts, 
sondern ist einfach nur eine Adresse. Und "lo8(array)" ist das Low-Byte 
dieser Adresse. Wenn die Adresse z.B. 0x1234 ist, dann ist dein zweiter 
Code sinngemäß:
1
lds  r24, 0x34
2
lds  r25, 0x12
Du willst aber haben:
1
lds  r24, 0x1234
2
lds  r25, 0x1235


In deinem ersten Beispiel geht es um die Adresse selber (und dessen Low- 
und High-Byte). Im zweiten um das, was an dieser Adresse steht. Das sind 
doch wohl zwei grundverschiedene Dinge. Wie kommst du darauf, 
"lo8/hi8(array)" könnte beides gleichzeitig sein?
Persönliche Seite #2978861
Lesenswert?

Tobias AsmBeginner schrieb:
> problemlos funktioniert, wohingegen
>
> lds  r24, lo8(array)
> lds  r25, hi8(array)
>
> den Fehler
>
> Error: garbage at end of line
>
> verursacht.
 
Problem ist, daß die Expression-Modifier nicht zur Instruktion LDS 
passen, die eine Adresse braucht.  Was hingegen passen würde ist
 
1
  ldi r24,lo8(array)
2
  ldi r25,hi8(array)
 
Dies ist der Code, den avr-gcc zB erzeugt für
 
1
extern int array[];
2

3
int* f (void)
4
{
5
  return array;
6
}

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