Forum: Mikrocontroller und Digitale Elektronik Tabelle


von Frank (Gast)


Lesenswert?

Hallo

Wie errechne ich die Anfangsadresse in einer Tabelle in ASM?
Wenn ich z.B. aus der Tabelle unten Test5 auslesen will wie müßte man
das in Asm machen?
Vielen Dank
MFG






Tab:
    .db "test1","test2","tets3","test4","test5","test6"

von Rahul (Gast)


Lesenswert?

Wenn die Daten immer die gleiche Länge haben, musst du einfach nur zu
deiner Tabellen-Anfangsadresse die entsprechende Zahl hinzuaddieren.
In diesem Fall: StartAdr + (Eintragslänge * Position).
Bei unterschiedlichen Längen wirst du nicht ohne "Endezeichen"
auskommen und die Tabelle entsprechend durchsuchen müssen.

von Frank (Gast)


Lesenswert?

Danke für die schnelle Antwort!
Hast Du evt. ein ASM Beispiel? Ich bin noch Anfänger und müßte es erst
mal sehen um es zu kapieren.
Gruss
Frank

von Rahul (Gast)


Lesenswert?

ich programmiere in C...

von Top S. (topsoft)


Lesenswert?

Hallo,

nur wenn das ganze nicht zur Laufzeit passieren soll:

ldi ZL, LOW (Tab1Eint5 * 2)
ldi ZH, HIGH(Tab1Eint5 * 2)

Tab1:
      Tab1Eint1: .db "test1"
      Tab1Eint2: .db "test2"
      Tab1Eint3: .db "test3"
      Tab1Eint4: .db "test4"
      Tab1Eint5: .db "test5"
      Tab1Eint6: .db "test6"
Tab2:
      .......
      ....

Gruß Topsoft

von Frank (Gast)


Lesenswert?

doch es soll in echtzeit gehen. Ich will dmit einem Drehgeber ein Menü
machen. Drehgeber abfragen und entsprechend menünamen aus Tab holen.
Was zählt denn alles zur Position beim Tab eintrg?
z.B.: Tab: .db"a ", "b " wenn ich b haben will 3 Pos.????
Frank

von D. W. (dave) Benutzerseite


Lesenswert?

.equ feld_laenge = 5

; r16 übergabe nr des strings
ausgabe_string:
ldi zl, low(tab*2)
ldi zh, high(tab*2)
ldi r17, feld_laenge
mul r16, r17
add zl, r0
adc zh, r1

schleife:
 lmp r16, z+
 rcall zeichen_ausgabe
 dec r17
 brne schleife

ret

Tab:
    .db "test1","test2","tets3","test4","test5","test6"


ich hoffe, das is ohne Fehler.. musst halt mal ausprobieren..
braucht einen AVR mit Hardware-Multiplier. Das mit dem AVR habe ich
jetzt einfach mal aus den vorigen Posts entnommen.

von Top S. (topsoft)


Angehängte Dateien:

Lesenswert?

Hallo,

das mit der Speicheraufteilung sollte der Anhang klären. Wieviele
Menueeinträge werden das den? Auf welchem MC soll das ganze den
laufen?

Gruß Topsoft

von Andi K. (Gast)


Lesenswert?

Flexibler wäre es, das mit einer Sub-Tabelle zu machen, also
Tabelleneinträge mit Unterprogramme welche dann noch Rechnen und
verschiedenes Anzeigen können wie z. B. veränderliche Rechen- oder
Messwerte:

; in zl übergabe nr der Menu-Sub
MenuProg:
 clr zh
 lsl zl
 rol zh
 subi zl,low(-tab*2)
 sbci zh,high(-tab*2)
 lpm r16,z+
 lpm r17,z
 movw zl,r16
 ijmp

Tab:
 .dw Menu1
 .dw Menu2
 .dw Menu3
 .dw Menu4
 .dw Menu5
 .dw Menu6

Menu1:
 Rechne dieses...
 Zeige jenes an...
 .....
 ret

Menu2:
 .....
 ret

Menu3:
 .....
 ret

Menu4:
 .....
 ret

Menu5:
 .....
 ret

Menu6:
 .....
 ret

MfG
Andi

von Andi K. (Gast)


Lesenswert?

Ähm... hier noch eine kürzere Version (7 statt 14 Takte):

; in zl übergabe nr der Menu-Sub
MenuJump:
 clr zh
 subi zl,low(-tab)
 sbci zh,high(-tab)
 ijmp

Tab:
 rjmp Menu1
 rjmp Menu2
 rjmp Menu3
 rjmp Menu4
 rjmp Menu5
 rjmp Menu6

Die Tabelle besteht hier aus lauter RJMP (2 Byte (1 Word) je Eintrag),
also dürfen die Menü-Programme nicht all zu weit weg sein (-2048 bis
+2047 Words).

MfG
Andi

von Frank (Gast)


Lesenswert?

Hallo
Vielen Dank für Eure Hilfe!
Gruss
Frank

P.S.tolles Forum!

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.