mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Adresstabelle im Assembler


Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...

Da müsste sich jemand mal die Arbeit machen das AVR-Tutorial einmal zu 
kopieren und zum ARM-Tutorial umzuschreiben :-)

Mfg
Thomas Pototschnig

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...
>
> 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.

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...
>>
>> 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

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.