Die Pointer bestehen aus 2 Registern, die auf die Programmspeicheradresse zeigen, aus der der Datenwert geladen werden soll. Er kann durch das RAMPZ-Register auf einen Drei-Byte Pointer erweitert werden und dann einen erweiterten (=Extended) Adressraum ansprechen (siehe Pointer). Es kann auch ein Post-Inkrement-Modifier mit dem Pointer verwendet werden.
Mit diesem Befehl wird ein 8-Bit Wert aus dem Programm-Flash-Speicher in ein Register geladen. Zulässig sind die Register R0 bis R31. Die Adresse kann hierbei nicht direkt, sondern nur in Form des Z-Pointers angegeben werden. Nachdem die Pointer einen 16-Bit (24-Bit bei ELPM) Adressraum ansprechen können, können Speicheradressen von 0 bis 65535 (16777216 bei EMLPM) erreicht werden.
Achtung: Wird für das zu ladende Register R30 oder R31 verwendet (dies sind die Register die den Z-Pointer definieren) und wird ein Post-Inkrement auf den Z-Pointer angewandt, so ist das Ergebnis des Befehls nicht vorhersagbar.
ldi ZH, high(Label<<1) ;Laden des High-Bytes der Programmspeicheradresse des Labels "Label"
ldi ZL, low(Label<<1) ;Laden des Low-Bytes der Programmspeicheradresse des Labels "Label"
lpm r20, Z ;in das Register R20 wird der Wert von der Adresse des Flash-Speichers geladen, auf die der Pointer Z zeigt
oder im erweiterten Modus:
elpm r20, Z ;in das Register R20 wird der Wert von der Adresse des Flash-Speichers geladen, auf die der Pointer Z zeigt
Alternativ:
lpm r20, Z+ ;in das Register R20 wird der Wert von der Adresse des Flash-Speichers geladen, auf die der Pointer Z zeigt. Anschließend wird der Z-Pointer um 1 erhöht. Dies erfolgt nur innerhalb des 16-Bit (24-Bit bei ELPM) Adressraums des Z-Pointers