String auslesen in ASM 20 byte

OP #1044808
Hallo Leute habe hier ein kleines Problemchen und komme einfach nicht 
weiter.

Ich habe in ASM (Mega128) einen String mit 20 bytes angelegt.
1
.dseg
2
Kartenname: .byte 20

ne..

dann habe ich jetzt eine funktion die die zeichen die ich wo anders rein 
schreibe ausliest
1
ldi R20,$0
2

3
DATEN_DISP:
4
 lds R25,Kartenname
5
 inc R20
6
 sts HW_display_adr,R25 ; Daten ins Display
7
 cpi R20,$14
8
 brne DATEN_DISP
9
 dealy  2 ; warten 1 ms

usw. Funktioniert auch super ich kriege 20 mal das 1-te zeichen 
angezeigt.
Aber ich weiß jetzt nicht wie ich den wert von Kartenname+1 ...+2 und so 
weite bekomme.


Kann mir wer helfen?

bedanke mich im Vorraus.
OP #1044817
Martin wrote:
> Ich kenne mich AVr zwar nicht aber einfach einen Pointer verwenden
> (indirekte Adressierung) und den Pointer bei jedem Zeichen erhöhen.

Das ist auch mein Problem hat jemand so´n beispiel also CODE oder so zur 
erklärung.

In asm kommt mir das etwas kompliziert vor.

oder sehe ich da was falsch?
Gast #1044820
>Funktioniert auch super ich kriege 20 mal das 1-te zeichen
>angezeigt.

Logisch. Du springst ja immer an den Anfang deiner Routine zurück.


Das geht so gar nicht. Das LDS wird nicht gehen. Das kann nur statisch 
adressieren.
Gast #1044834
Das könnte gehen:
(bin schon etwas aus asm raus..)
1
 ldi r20, 0                    ; Zeichenzähler
2
 ldi r31, HIGH(Kartenname)
3
 ldi r30, LOW (Kartenname)     ; Z-Pointer auf Stringanfang
4
DATEN_DISP:
5
 ld  r25, z+                   ; erstes Zeichen holen
6
 sts HW_display_adr,  r25      ; Daten ins Display
7
; inc r20                       ; Zeichen zählen
8
 cpi r25, 0                    ; Stringende?
9
; cpi r20, 20                   ; falls Abbruch nach 20Zeichen gewünscht
10
 brne DATEN_DISP               ; nein, dann zurück

Du musst natürlich dafür sorgen, dass im D-Seg hinter dem letzten 
Zeichen eine 0 steht.
OP #1044846
Matthias Lipinsky wrote:
> Das könnte gehen:
> (bin schon etwas aus asm raus..)
>
>
1
>  ldi r20, 0                    ; Zeichenzähler
2
>  ldi r31, HIGH(Kartenname)
3
>  ldi r30, LOW (Kartenname)     ; Z-Pointer auf Stringanfang
4
> DATEN_DISP:
5
>  ld  r25, z+                   ; erstes Zeichen holen
6
>  sts HW_display_adr,  r25      ; Daten ins Display
7
> ; inc r20                       ; Zeichen zählen
8
>  cpi r25, 0                    ; Stringende?
9
> ; cpi r20, 20                   ; falls Abbruch nach 20Zeichen gewünscht
10
>  brne DATEN_DISP               ; nein, dann zurück
11
> 
12
>
>
> Du musst natürlich dafür sorgen, dass im D-Seg hinter dem letzten
> Zeichen eine 0 steht.

Und es Geht tatsächlich...

Ich bedanke mich hezlich...

so schnell und dann noch so einfach. hätte ich nie gedacht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.