String aus ROM lesen mit GNU Assembler für ATmega8

Gast #1541689
Lesenswert?

ldi ZH, High(temp *2)   ;Byteadresse
ldi ZL, Low(temp*2)
lesen:
lpm r0, Z+              ;in register r0 einlesen
                ;tu irgendwas damit
                ;allerdings sollte der wert noch erhalten bleiben, da er
                ;noch abgefragt wird
tst r0
brne lesen              ;wenn nicht null-Byte, widerholen

...
Gast #1541698
Lesenswert?

Für AVR oder?

ein AVR hat 16bit breite Befehle, also ist der Flash 16 bit breit 
organisiert.
Um jetzt auf einzelne Bytes im Flash zuzugreifen, erwartet der Befehl 
lpm (load program memory) eine Byteadresse statt einer Wortadresse.
Also Adresse mal 2.
Hoffe es war verständlich :-)
OP #1541710
Lesenswert?

Hallo,

vielen Dank für die schnelle Antwort, doch die Konvertierung von temp in 
eine Byteadresse funktioniert nicht mit avr-as (GNU Assembler). Sonst 
ist die Idee nicht schlecht.

Hat jemand noch einen Tip für die Umwandlung in eine Byteadresse?

Vielen Dank für Eure Mühen.

HUE
#1542097
Lesenswert?

Ich frage mich warum du überhaupt avr-as benutzt und nicht den von Atmel 
zur Verfügung gestellten Assembler.
Stringverarbeitung ist auch in C nichts weltbewegend kompliziertes, 
sodass es auch aus dieser Sicht wenig Sinn macht, eine C-Funktion durch 
eine Assembler Funktion zu ersetzen.
OP #1542354
Lesenswert?

Hallo,

ich habe folgende Situation:

Mit den Ports vom ATmega8 steuere ich einen Nadeldrucker an um Werte 
auszugeben. Damit ich nicht jedes einzelne Zeichen nacheinander in ein 
Register lade und dann ausgebe, wollte ich die Strings wie "Temperatur" 
oder "Speicher" im FLASH ablegen und dann mittels hochzählenden Adressen 
auslesen und dann an den Drucker senden.

Die ursprüngliche Version klappt problemlos, doch die oben angeführten 
Beispiele sind nicht GNU avr-as kompatibel.

Es muß doch eine ähnliche Lösung für den GNU Assembler gehen, oder?

MfG

HUE
#1542610
Lesenswert?

1
temp:      .ascii    "Temperatur"
Hier musst du an zwei Dinge denken:
1) keine "automatische" Null-Terminierung des Strings
2) an das Alignen, denn der avr-as arbeitet Byte-orientiert(*)

Wegen (*) brauchst du auch kein "*2".
1
#define ZL  r30
2
#define ZH  r31
3
...
4
ldi ZL, lo8(temp)
5
ldi ZH, hi8(temp)

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