Forum: Compiler & IDEs hi8/lo8-Makros in AVR-gas, warum funktionieren sie nur manchmal?


von Tobias AsmBeginner (Gast)


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?

von Stefan E. (sternst)


Lesenswert?

Tobias AsmBeginner schrieb:
> Was genau ist der Unterschied?

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

von Tobias AsmBeginner (Gast)


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?

von Stefan E. (sternst)


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?

von Tobias AsmBeginner (Gast)


Lesenswert?

Danke Stefan, irgendwie klingt das jetzt logisch.
Da muss ich wohl nen Knoten im Kopf gehabt haben, der sich hiermit 
gelöst haben sollte.
Danke

von Johann L. (gjlayde) Benutzerseite


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
}

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.