Ich habe ein Programm in Assembler wie folgt:
lots of code
......
.ORG $7000 ;; (or somewhere)
atext: .DB "this is a test string 1"
.ALIGN EVEN
Btext: .DB "this is a test string 2"
(Problem leicht gelöst durch manuelle Ausrichtung wie folgt:
atext: .DB "this is a test string 1",0,0
// 01234567890123456789012 3 4
Und das Hinzufügen von Nullen, wo nötig, um auszurichten.
Ich möchte jetzt den Text auf meinen seriellen Monitor schreiben.
Also mache ich das;
ldi zh,High (text1)
ldi zl,LOW (text1)
push ZH
push ZL
lsl ZL
rol ZH ;; to ensure LPM later
WRTE: lpm R16,Z+ ; get byte/data
cpi R16,0
breq wrte2
call output
rjmp wrte
wrte2:
pop zl
pop zh
ret
Jetzt frage ich mich: Wenn ich benutze
......
WRTE: LD R16,Z+ ; get byte/data /// BAD - DON'T
.....
Was bekomme ich in R16?
.db
setzt den Text automatisch an eine 'gerade' Adresse (wobei der String bei Bedarf mit einer Null aufgefüllt wird), da das Byte-Äquivalent aller Programmspeicheradressen gerade ist (die tatsächliche Adresse kann ungerade oder gerade sein, je nachdem, auf welches WORD verwiesen wird). Daher besteht keine Notwendigkeit für eine 'ALIGN EVEN'-Direktive.
Der LPM-Befehl leitet die Bits 15-1 des Z-Registers an die Programmspeicheradressen-Bits 14-0 (bezieht sich auf bis zu 32k Wörter oder 64k Bytes), und Bit 0 wird verwendet, um das untere oder obere Byte im Wort auszuwählen. Deshalb müssen Sie die Programmadresse beim Einfügen in das Z-Register mit 2 multiplizieren.
Jon
KRIS-Norwegen
gbulmer
Btext
, gerade, ungerade oder etwas anderes? Warum? Ich denke, @Jon hat Ihre Frage beantwortet - das Ausrichten von Daten spielt keine Rolle, da Daten byteadressierbar sind. Vielleicht sollte Jon den Kommentar zu einer Antwort hochstufen?