Mehrfachverzweigung

OP #3926666
Lesenswert?
• ▲
▼
Hi zusammen, ich verstehe einen Vorgang bei der Mehrfachverzweigung 
nicht.
Währe um eine Erklärung oder Hinweise in Form von Links etc. dankbar.

Beim Befehl  ldi  ZL,low(Sprungtabelle*2) und ldi 
ZH,high(Sprungtabelle*2)
wird die Adresse der Sprungtabelle x2 genommen. Begründung im Tutorial 
ist
das Bit0. Hier entscheidet das Bit0 ob das High oder Low Byte gelesen 
werden soll.

Ich verstehe nicht warum dann der Zeiger mal 2 genomme werden muss.
Zeigt der dann nicht auf eine völlig andere Adresse?

Danke euch.
#3926683
Lesenswert?
• ▲
▼
ROM-Adressen sind im AVR Assembler Wortadressen, d.h. die Adressen 
zweier aufeinander folgender Codeworte unterscheiden sich um 1. 
Entsprechende Labels im ROM-Bereich des Programms enthalten also 
Wortadressen.

Der byteweise arbeitende (E)LPM Befehl jedoch verwendet Byteadressen, 
d.h. die Adressen zweier aufeinander folgender ROM-Worte unterscheiden 
sich darin um 2, nicht um 1. Die Byteadresse einer ROM-Position ist 
also das doppelte der Wortadresse.

Deshalb kommt ein AVR mit 128KB ROM zwar mit einem 16-Bit Program 
Counter für 64K Worte aus, benötigt aber 17 Adressbits um diesen 
Speicher als Daten zu lesen.

Im GNU-Assembler ist das übrigens anders.
OP #3930341
Lesenswert?
• ▲
▼
so habe mir jetzt mal die Definitionen (Wort, Byte..) nochmal 
angeschaut.
1 Wort = 2 Byte = 16 Bit. ROM Adressen sind 16 Bit Breit.

der LPM Befehl arbeitet aber Byteweise (lädt also immer 8 Bit)

Das LSB der Adresse wird dafür verwendet um zu bestimmen ob das low oder 
high Byte in das Zielregister geladen wird und fällt raus. Daher die 
Multiplikation mal 2 um das Muster eins nach links zu schieben.

Hoffe liege richtig und habe es so erklärt dass prx mich versteht. :-)

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.