AVR Assembler - Tabelle im Programmspeicher

Gast #4945987
Lesenswert?

Hallo,

ich habe eine Tabelle im Programmspeicher abgelegt und greife über lpm 
darauf zu. Über R16 steuere ich den Offset. In R17 steht dann der Wert:
1
clr r0
2
ldi r16, 0
3
ldi ZL, lo8(table)
4
ldi ZH, hi8(table)
5
add ZL, r16
6
adc ZH, r0          
7
lpm r17, Z
8

9
...
10
...
11

12
.section .progmem.data
13
.type table, @object
14
.size table, 8
15
table:
16
.byte  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07

Im Netz habe ich nun gelesen, dass man die Addresse der Tabelle um eins 
nach links schieben muss, und im Bit 0 dann das Low oder High Byte 
auswählt.

Wie man oben sieht, mache ich das ja nicht. Der Code funktioniert aber 
trotzdem.

Ist das nun Zufall (kann ich kaum glauben)? Oder woran liegt das?

Könnte es vlt. daran liegen, dass ich mit dem GCC arbeite, welcher mit 
der Libc mitkommt, und es sich da anders verhält?

Danke und Gruß, Peter
(Firma: Vescomp) #4946038
Lesenswert?

Peter schrieb:
> Könnte es vlt. daran liegen, dass ich mit dem GCC arbeite, welcher mit
> der Libc mitkommt, und es sich da anders verhält?

 Ja.

 Adressen im Flash sind Wordadressen, im RAM sind es Byteadressen.
 In reinem Assembler würde dir das oben nicht durchgehen, bzw.
 die Flashadresse auf welche ZL:ZH zeigt, wäre um Faktor 2 kleiner.
#4946187
Lesenswert?

Hi

Wir können wohl davon ausgehen, daß 'lo8' und 'hi8', wie bereits 
vermutet, Makros sind, Die sich um diese Anpassung 'Tabelle im 
Programmspeicher' kümmern.
Mit diesen Makros eine Tabelle im DSEG anzusprechen, dürfte dann 
fehlschlagen.

Wieder: nicht der komplette Code oder hi8/lo8 sind interne Makros dieses 
Assembler (gibt's ja nun auch die eine oder andere Variante von ...)

MfG
#4946224
Lesenswert?

Patrick J. schrieb:
> Wir können wohl davon ausgehen, daß 'lo8' und 'hi8', wie bereits
> vermutet, Makros sind, Die sich um diese Anpassung 'Tabelle im
> Programmspeicher' kümmern.

Nicht wirklich.

Patrick J. schrieb:
> Mit diesen Makros eine Tabelle im DSEG anzusprechen, dürfte dann
> fehlschlagen.

Nein, auch das geht.

Der GCC, und damit auch der dazugehörige Assembler, arbeiten 
grundsätzlich Byte orientiert. Alle Label sind Byte-Adressen, egal ob 
Flash oder RAM. Datenzugriffe gehen daher "einfach so". Aber man braucht 
dann halt spezielle Vorkehrungen, wenn man die Wort-Adresse benötigt, 
z.B. für indirekte Sprünge oder Sprungtabellen.
Gast #4946775
Lesenswert?

Timm T. schrieb:
> Peter schrieb:
>> Der Code funktioniert aber
>> trotzdem.
>
> Das glaube ich nicht.

Ich kann mich nur wiederholen: Das geht so.

Stefan E. schrieb:
> Der GCC, und damit auch der dazugehörige Assembler, arbeiten
> grundsätzlich Byte orientiert. Alle Label sind Byte-Adressen, egal ob
> Flash oder RAM. Datenzugriffe gehen daher "einfach so".

Und das wäre auch eine passende Erklärung dafür.

Gruß Peter

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