Hallo NG, ich würde gerne in einem Bereich mehrere Adressen, die ja später erst vom Assembler bzw. Linker generiert werden festhalten, um daruf dann schnell zugreifen zu können. Ich stelle mir das ungefär so vor: ----------------------------------- main: // (start at 0x0202000) (hier kommen ein paar Befehle) sub1: // (start at 0x0202100) (hier kommen ein paar Befehle) sub2: // (start at 0x0202200) (hier kommen ein paar Befehle) sub3: // (start at 0x0202300) sprungtabelle: @sub1, @sub2, @sub3 ----------------------------------- in der "sprungtabelle" sollen jetzt die 3 absoluten Adressen der Labels sub1, sub2 und sub3 stehen. Im Beispiel also 0x0202100, 0x0202200, 0x0202300. Das ganze benötige ich, um einem Wert (Byte) ca. 200 verschiedene Funktionen zuzuordnen. Achso, verwenden tue ich die IAR Workbench. Aber wenn mir jemand sagt, wie es auf seinem Assembler funktioniert, kann ich es auch mal so bei mir probieren. Vielleicht habe ich ja Glück und es funktioniert auf die selbe Art und Weise. Vielen Dank für jeden Tip! Peter Pippinger
In der Regel lädt man die Adresse von Sprungtabelle in ein Register, multipliziert den Index mit 4 und addiert ihn dann auf das Register mit der Adresse. Dann kannst du ganz easy die Speicheradresse laden und dort hinspringen ... ARM7-Assembler kenn ich nur im Ansatz, aber so hätte ich das probiert (in r1 der Index): ldr r0,=sprungtabelle add r0,r0,r1, lsl #2 ldr PC,[r0] Mfg Thomas Pototschnig
Peter Pippinger wrote: > Achso, verwenden tue ich die IAR Workbench. Aber wenn mir jemand sagt, > wie es auf seinem Assembler funktioniert, kann ich es auch mal so bei > mir probieren. Vielleicht habe ich ja Glück und es funktioniert auf die > selbe Art und Weise. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Lange_Sprungtabelle
>Karl heinz Buchegger wrote: >> Peter Pippinger wrote: >> >> Achso, verwenden tue ich die IAR Workbench. Aber wenn mir jemand sagt, >> wie es auf seinem Assembler funktioniert, kann ich es auch mal so bei >> mir probieren. Vielleicht habe ich ja Glück und es funktioniert auf die >> selbe Art und Weise. > >http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Lange_Sprungtabelle Da müsste sich jemand mal die Arbeit machen das AVR-Tutorial einmal zu kopieren und zum ARM-Tutorial umzuschreiben :-) Mfg Thomas Pototschnig
Thomas Pototschnig wrote: >>Karl heinz Buchegger wrote: >>> Peter Pippinger wrote: >>> >>> Achso, verwenden tue ich die IAR Workbench. Aber wenn mir jemand sagt, >>> wie es auf seinem Assembler funktioniert, kann ich es auch mal so bei >>> mir probieren. Vielleicht habe ich ja Glück und es funktioniert auf die >>> selbe Art und Weise. >> >>http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Lange_Sprungtabelle > > Da müsste sich jemand mal die Arbeit machen das AVR-Tutorial einmal zu > kopieren und zum ARM-Tutorial umzuschreiben :-) Oder die Leute, vor allem wenn sie keinen AVR benutzen, würden endlich mal klar und deutlich dazuschreiben um welchen Prozessor es sich handelt. :-) Aber er fragte ja nach irgendeinem Assembler.
Karl heinz Buchegger wrote: > Thomas Pototschnig wrote: >>>Karl heinz Buchegger wrote: >>>> Peter Pippinger wrote: >>>> >>>> Achso, verwenden tue ich die IAR Workbench. Aber wenn mir jemand sagt, >>>> wie es auf seinem Assembler funktioniert, kann ich es auch mal so bei >>>> mir probieren. Vielleicht habe ich ja Glück und es funktioniert auf die >>>> selbe Art und Weise. >>> >>>http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Lange_Sprungtabelle >> >> Da müsste sich jemand mal die Arbeit machen das AVR-Tutorial einmal zu >> kopieren und zum ARM-Tutorial umzuschreiben :-) > > Oder die Leute, vor allem wenn sie keinen AVR benutzen, > würden endlich mal klar und deutlich dazuschreiben um welchen > Prozessor es sich handelt. :-) > Aber er fragte ja nach irgendeinem Assembler. Aaah ... ja du hast Recht, das stand nicht explizit dabei, aber Peter kennen wir doch schon von den anderen Fragen über ARM7-Assembler :-) Mfg Thomas Pototschnig
Hey, coole G´schichte Jungs und Mädels! Das bedeutet dann, wenn ich alles richtig verstanden habe, dass ich einfach nochmal die Labels im Datenbereich aufführen. Diese Stellen nehmen dann als Wert die Adresse des jeweiligen Labels an. Muss ich später unbedingt noch probieren... Vielen Dank!
Peter Pippinger wrote: > Hey, coole G´schichte Jungs und Mädels! > > Das bedeutet dann, wenn ich alles richtig verstanden habe, dass ich > einfach nochmal die Labels im Datenbereich aufführen. Diese Stellen > nehmen dann als Wert die Adresse des jeweiligen Labels an. Muss ich > später unbedingt noch probieren... Jo so sollte das sein. Musst halt mal schauen, wie man "doublewords" definiert ... im x86-Assembler gabs dazu dann sowas wie .dd Aber da du ja schon Strings im Speicher ablegen kanns, solltest du das auch hinkriegen können. Mfg Thomas Pototschnig
Hallo NG, So, nachdem nun mein neuer Beitrag zum Thema "premature optimization" richtigerweise mit dem Hinweis auf diesen Betrag gelöscht wurde, möchte ich hier der Vollständigkeit halber meinen Weg zeigen, der - so wie ich denke - nicht mehr kürzer geht (zumindest auf ARM7 ohne TBB+Co.) Wahnsinn, wie schnell die Zeit vergeht. 2007... Danke nochmal an Thomas Pototschnig. Der Wink ging genau in die richtige Richtung. Hier nun meine aktuelle Auswertung der Opcodes im Emulator: // get actual opcode (neue Version) ldr r5, =memory ldrb r5, [r5, r8] ldr r4, =opcodes ldr pc, [r4, r5, lsl #2] // get actual opcode (alte Version) // ldr r5, =memory // add r5, r5, r8 // ldrb r5, [r5] // lsl r5, r5, #2 // ldr r4, =opcodes // add r5, r5, r4 // ldr r5, [r5] dabei ist r8 PC des 6502, r10 ist A des 6502, "memory" das Label des "C64-Speichers" und "opcodes" ist das Label der Sprungtabelle: // c64 memory memory: DC8 0xa0, 0x80, 0xa2, 0x80 opcodes: DC32 op_00 // BRK ... DC32 op_a0 // LDY #$xx ... DC32 op_a2 // LDX #$xx ... Die Opcodes selbst schauen dann so wie dieses Beispiel aus: op_a9: // LDA #$xx bl imm // get value from #$xx into r5 mov r10, r5 add r8, r8, #2 // program-counter add r7, r7, #2 // 2 clock-cycles b drive_cpu Also, ich denke, dass sieht sehr vielversprechend aus. Ich denke, dass das zeitlich echt rockt. Sämtliche Register der 6502 bekommen jeweils ein ARM7 Register. Was ich an der Assembler-Version gegenüber der C-Version noch einen gewaltigen Vorteil finde: bis jetzt wird noch kein Stack verwendet, da die Rücksprungadressen ja über das Linkregister abgehandelt werden.
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.