Hallo Gucky,

wie es im Tutorial steht:

Für das Lesen aus dem Programmspeicher gibt es nur den Zeiger Z und den Befehl LPM. Er lädt das Byte an der Adresse Z in das Register R0. Da im Programmspeicher jeweils Worte, also zwei Bytes stehen, wird die Adresse mit zwei multipliziert und das unterste Bit gibt jeweils an, ob das untere oder obere Byte des Wortes im Programmspeicher geladen werden soll. Also etwa so:

LDI ZH,HIGH(2*Adresse)
LDI ZL,LOW(2*Adresse)
LPM

Nach Erhöhen des Zeigers um Eins wird das zweite Byte des Wortes im Programmspeicher gelesen. Da die Erhöhung des 16-Bit-Speichers um Eins auch oft vorkommt, gibt es auch hierfür einen Spezialbefehl für Zeiger:

ADIW ZL,1
LPM
Ob man nun die Adresse eins links schiebt oder mit 2 multipliziert ist gleich (bei Binärrechnung).

Grüße