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
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.
Peter schrieb:> Der Code funktioniert aber> trotzdem.
Das glaube ich nicht.
Das muss so heissen:
ldi ZL, lo8(2 * table)
ldi ZH, hi8(2 * table)
Der Code liest zwar irgendwelche Bytes, aber nicht an der Stelle table,
sondern irgendwo anders.
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
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.
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