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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.