Soweit hab ich das erstmal verstanden mit dem Bücherregal, danke.
Hier mal mein Code:
Code:
;Programm
;CDurTonleiter rauf und runter spielen
.include "m8def.inc"

.def tmp = r16					;Mein Universallregister

.org 0x000
	rjmp reset					;Interruptvektor "reset:"

reset:
	;Stack einrichten
	ldi tmp, HIGH(RAMEND)		;HIGH-Byte der obersten RAM-Adresse
	out SPH, tmp
	ldi tmp, LOW(RAMEND)		;Low-Byte der obersten RAM-Adresse
	out SPL, tmp

	ldi ZH, HIGH(daten1 * 2)
	ldi ZL, LOW(daten1 * 2)

	sei							;Interrupts zulassen

loop:
	lpm							;nächstes Byte des String nach r0 einlesen
	mov tmp, r0					;Inhalt von R0 nach "tmp" kopieren
	adiw ZL,1					;Adresse des Z-Pointers um 1 erhöhen

	rjmp loop					;immer wieder zu "loop:" springen

daten1:
	.db "Hallo!"		 		;immer eine gerade Anzahl an Bytes
Bloß wie überprüfe ich, ob er auch wirklich den String "Hallo!" in tmp kopiert? Im Debug-Modus seh ich in r16 auch keine Strings..hmm..
@Tekeli: Danke für den Link, bin grad nicht drauf gekommen, da nachzuschauen *g* Habs dadurch auch erstmal besser verstanden, aber das mit der 2x hab ich immer noch nicht verstanden, also keine Sorge. Im Tut steht ja auch "Über die Multiplikation der Adresse mit 2 sollte man sich erst mal keine Gedanken machen: "das ist einfach so"™" Da hat der Florian wohl den Satz geklaut oder er weiß es selber nicht *duck* *gg*

@Tekeli: Hast du dir den Wert "0011 1100 0101 0011" jetzt nur ausgedacht, oder muss ich verstehen, was dahinter steckt?