Datentabelle in Assembler

Gast #31513
Lesenswert?

print:
  lpm
        tst R0
        breq print_end
        mov r16, r0
        rcall sendbyte
        adiw ZL, 1
        rjmp print


text:

.db 84, 101, 115, 116, 0
.db 8, 10, 11, 16, 5, 0

Wenn ich das richtig verstanden habe, steht der wert 84 nach dem ersten 
durchlauf in r16. Doch wie komme ich in die nächste Datenzeile??

MFG Jörn
Gast #31514
Lesenswert?

spielt keine Rolle, in welcher Zeile die .db stehen, solange du Z 
incrementierst, wird das nächste Byte gelesen. Willst du direkt ein 
andere Zeile anspringen, solltest du lieber symbolische Marken einfügen 
und dann mit Hilfe dieser Z laden.
Gast #31515
Lesenswert?

ich will von der Zeile 1 in die 2. Zeile springen, das muss doch möglcih 
sein oder? Also angenommen in der variable x steht der wert 1 dann liest 
das prog. die erste zeile aus, steht in der der variable aber 2 dann 
nimmt das prog. die zweite zeile.


Zeile1: .db 84, 101, 115, 116, 0
Zeile2: .db 8, 10, 11, 16, 5, 0
#31517
Lesenswert?

Wenn das nicht nur 2 Zeilen sein sollen, dann nimmst Du eine 2. Tabelle, 
in der erstmal alle Byte-Adressen drinstehen:

Adressen: .dw 2*zeile1, 2*zeile2 ;usw.
Zeile1: .db 84, 101, 115, 116, 0
Zeile2: .db 8, 10, 11, 16, 5, 0

Zuerst lädst Du Z mit 2*Adressen und addierst den Index 2* dazu (da 2 
Byte je Adresse). Dann holst du die beiden Bytes, lädst diese nach Z und 
somit zeigt Z auf die gewünschte Zeile.

Peter
Gast #31518
Lesenswert?

Hallo,

Da ihr schon mal dabei seid, jemandem beizubringen, wie
man eine Tabelle in den Ram speichert und diese bei bedarf
ausliest, möchte ich mich gleich mal mit hinten anstellen.

Ich habe nämlich ähnliches (oder sogar selbiges?) vor:

Möchte jedem gelesenen AD-Wert (256 Werte@8Bit)
eine gewisse Zahl zuordnen. Soll für eine Temperatur-
ausgabe werden.
Beispiel: AD-Wert ist "154" , es soll eine "024" zugerodnet
werden, welche ich dann irgendwo hin als Temperatur ausgebe.

Von LPM habe ich mal flüchtig gehört. Das scheint
das richtige zu sein. Wie arbeite ich aber damit ?
Und wie kriege ich die Wertetabelle in den Ram ?
Gast #31519
Lesenswert?

Hallo

Ja so was ähnliches wie Andi_K habe ich auch vor, nur das der ASCII wert 
also von 0-?? einen bestimmten Datensatz bestehend aus je 8 zeichen 
zugeordnet werden soll.

Bsp:  Asciicode = 3

      .de 6, 5, 98, 50, 66, 66
      .de 4, 3, 58, 59, 20, 44
  *   .de 5, 8, 55, 88, 44, 55   *  diese Zeile soll nun wert für wert 
ausgelesen werden und jeder wert per spi an ein display (Nokia 3310 
gesendet werden.

MFG Jörn
Gast #31520
Lesenswert?

Hallo Jörn,

also ich würde den Z-Pointer einfach "asciicode"-mal um 6 erhöhen. Also 
so in der Art:

ldi ZH, HIGH(text<<1)
ldi ZL, LOW(text<<1)

tst asciicode
breq loopend

loop:
adiw ZL, 0x06
dec asciicode
brne loop
loopend:

Dann sollte der Z-Pointer auf die von dir gewünschte "Zeile" zeigen.

Thomas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren