Forum: Mikrocontroller und Digitale Elektronik Adresstabelle im Assembler


von Peter Pippinger (Gast)


Lesenswert?

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

von Thomas P. (pototschnig)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Thomas P. (pototschnig)


Lesenswert?

>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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas P. (pototschnig)


Lesenswert?

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

von Peter Pippinger (Gast)


Lesenswert?

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!

von Thomas P. (pototschnig)


Lesenswert?

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

von Peter P. (uncle-sam7)


Lesenswert?

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
Noch kein Account? Hier anmelden.