Mehrfachverzweigung

#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.
#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

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