Ja, dass es nacheinander passiert, ist mir klar, aber am Ende kann in r16 ja nicht "Hallo!" stehen, oder? Denn "Hallo!" braucht ja nunmal 6 Bytes. Also steht am Ende im Register nur ein "!"?
Ja, ich wollte ja nur, dass ihr ungefähr den Ablauf versteht, wie man den Speicher ausliest!
Ok, hier kommt die Lösung!
Code:
.include "m8def.inc"
.def lpm_reg = r0
.def temp = r16
.equ daten_laenge = 6
reset:
stack: ; Stack
ldi temp , LOW (RAMEND) ; LOW-Byte
out SPL , temp
ldi temp , HIGH (RAMEND) ; HIGH-Byte
out SPH , temp
z_register:
ldi ZL , LOW (daten * 2) ; Z-Register laden, mit der Adresse der Daten
ldi ZH , HIGH (daten * 2)
main:
lpm ; Daten laden
mov temp , lpm_reg ; in temp verschieben
adiw ZL , 1 ; Z um eins erhöhen
ldi temp , LOW ((daten * 2) + daten_laenge) ; vergleiche LOW-Byte
cp ZL , temp
ldi temp , HIGH ((daten * 2) + daten_laenge) ; vergleiche HIGH-Byte
cpc ZH , temp
breq ende ; springe zu ende, wenn letztes Byte ausgelesen
rjmp main ; nochmal
ende: ; Endschleife
rjmp ende
daten: ; Daten
.DB "Hallo!"
Jetzt erklärt mir bitte die einzelnen Segmente des Codes!
Lesezeichen