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?
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.
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?
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.
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.
@ BladeRunner (Gast) >Danke auch für den Link zum Tutorial, auch wenn das nicht die Kernfrage >beantwortet hat Aber sicher tut es das.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.