Forum: Mikrocontroller und Digitale Elektronik Sprungtabelle per Z-Register


von BladeRunner (Gast)


Lesenswert?

Hallo,
folgendes Problem:
Ich möchte über das Z-Register per ijmp eine Sprungtabelle realisieren.
Beim Suchen bin ich auf folgenden Thread gestoßen:
Beitrag "Sprungtabelle"
Hier wird ja auch erklärt wie es geht (Antwort von Hannes).
Allerdings verstehe ich nicht warum ich nicht, wie später von einem 
anderen User vorgeschlagen, r16 nach links shiften muss (So hätte ich 
das auch gemacht). Die Sprungtabelle besteht doch aus Word(aka 2byte) 
Einträgen und ijmp kann ja nicht wissen der wievielte Eintrag da 
aufgerufen wird. Da ja vorher das Z-Register einfach um den Inhalt von 
r16 erhöht wird müsste der Sprung bei anderen Indizes als 0 eigentlich 
total in die Hose gehen, oder?

Warum klappt das so wie Hannes es beschreibt, kann mir da ein Pro die 
Erleuchtung bringen?

von Karl H. (kbuchegg)


Lesenswert?

Des Rätsels Lösung liegt darin, was ijmp haben möchte (Wordadresse oder 
Byteadresse) bzw. darin welche Adresse der Assembler nimmt, wenn du ein 
Label irgendwo hinschreibst.

Sobald dir das klar ist, dass es hier 2 Welten gibt, Byteadresse versus 
Wordadresse, ist dir auch der Rest klar, warum du mal Shiften musst 
(d.h. mit 2 multiplizieren um von Wordadresse auf Byteadresse zu kommen) 
bzw. warum du mal nicht Shiften musst. Und das ganze abhängig vom 
Befehl, den du anwenden willst, bzw. welche Adressform der haben will.

von BladeRunner (Gast)


Lesenswert?

Uff ,viel zu lernen ich noch habe.
Ich komm vom 6510, da waren Sprungtabellen per indirektem JMP an der 
Tagesordnung, also JMP($FFFC)-> Springe an die Adresse die in FFFC und 
FFFD steht.
Das ein Mnemonic verschiedene Datentypen erwarten kann verwirrt mich da 
noch ein wenig. Gibt es dazu vielleicht ein wenig einsteigerfreundliche 
Literatur für einen alten Commodore-Opa?

von Karl H. (kbuchegg)


Lesenswert?

BladeRunner schrieb:
> Uff ,viel zu lernen ich noch habe.
> Ich komm vom 6510, da waren Sprungtabellen per indirektem JMP an der
> Tagesordnung, also JMP($FFFC)-> Springe an die Adresse die in FFFC und
> FFFD steht.

Ja.
Und ein AVR würde in so einem Fall genau an das Doppelte dieser 
Byteadresse springen, da der JMP implizit immer eine Wordadresse nimmt. 
Dies deshalb, weil komplette Befehle im AVR IMMER genau 2 Bytes belegen 
und es daher sinnlos ist das Least signifikant Bit mit in die Adresse 
aufzunehmen, weil es sowieso immer 0 ist.

Das Flash des AVR ist bei den meisten Befehlen ganz einfach wortweise 
adressiert, mehr steckt da nicht dahinter. Und das ist eine direkte 
Konsequenz aus der Tatsache, dass ALLE Befehle immer 2 Bytes lang sind, 
was das komplette Design der Befehlsabarbeitung vereinfacht.
Es ist wie bei Briefkästen in einem Haus, in dem die Regel gilt: Jeder 
Mieter hat IMMER 2 Briefkästen zur Verfügung. D.h. man muss nicht jedem 
Briefkasten eine eigen Nummer geben, sondern nur jedem 2-ten. Der 
Briefkasten '5' ist der 10-te in der Reihe, wenn man alle Briefkästen 
einzeln zählt. Aber der Mieter aus Wohnung '5' geht zum Briefkasten '5', 
selbst dann wenn es bei Einzelzählung eigentlich der 10-te in der Reihe 
ist.

von Falk B. (falk)


Lesenswert?


von BladeRunner (Gast)


Lesenswert?

Mein Problem ist wohl dass ich noch nicht verinnerlicht habe dass ich es 
hier nicht mit einer von Neumann Architektur zu tun habe- ich bin es 
gewöhnt dass Code und Daten im selben Speicher liegen und austauschbar 
sind. Ich hab auch immer wieder mit selbstmodifizierendem Code 
gearbeitet.
Daher war für mich da intern auch die Barriere mit "woher kann der 
wissen...".
Klar, der Programmspeicher enthält ja in der Tat nur das, Word-lange 
Befehle. So betrachtet gibt das Sinn.
Herzlichen Dank für die schnelle und kompetente Erklärung.
Danke auch für den Link zum Tutorial, auch wenn das nicht die Kernfrage 
beantwortet hat (den Aufbau kannte ich ja schon, nur das warum war mir 
unklar).

Ich wünsch euch allen einen guten Jahreswechsel.

von Falk B. (falk)


Lesenswert?

@  BladeRunner (Gast)

>Danke auch für den Link zum Tutorial, auch wenn das nicht die Kernfrage
>beantwortet hat

Aber sicher tut es das.

von BladeRunner (Gast)


Lesenswert?

Ohs, indeed, wenn man nicht nur oben den Teil zur Sprungliste liest, 
dann schon schäm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.