In dem Moment, wo wir die main-Schleife betreten haben wir ja noch die Adresse von 'H' in Z stehen, also daten1 + 0.
Wir lesen dann das 'H' aus.
Danach erhöhen wir auf daten1 + 1 und vergleichen mit dem Wert für das erste Byte nach dem String, also daten1 + 6 (das siebte Byte).
Nun springen wir wieder an den Anfang.
und mache das gleiche mit 'a', 'l', 'l', 'o' und '!'.
Sobald wir nach dem '!' wiederholen, sieht das ganze so aus:
Wir haben im Z daten1 + 5 (6. Byte) und laden mit lpm das Byte in r0.
Das verschieben wir nach temp.
Danach erhöhen wir Z um 1, also haben wir daten1 + 6 (7.Byte, was nciht mehr da ist).
Wir vergleichen nun die Register mit jeweils dem Endwert und da glaich, springen wir mit breq zum Ende!

Ich hoffe es war verständlicher?