Adressierungsarten AVR
Die AVR-Mikrocontroller unterstützen mächtige und effiziente Adressierungsarten,
um auf den Programmspeicher (Flash) und den Datenspeicher
(SRAM, Register, I/O-Speicher und erweiterten I/O-Speicher) zuzugreifen.
Nachfolgend werden die verschiedenen Arten der Adressierung beschrieben.
In den Abbildungen bedeutet OP das Stück des Operationscodes
innerhalb des Befehlswortes.
Aus Gründen der Vereinfachung zeigen nicht alle Bilder den
exakten Ort der adressierenden Bits.
Die Variablen RAMEND und FLASHEND stehen für die
höchste Speicherzelle im Daten- und Programmspeicher.
Nicht alle Adressierungsarten sind
in allen Bausteinen verfügbar.
Direkte Adressierung eines Registers
Der Operand für den Befehl ist im Register d (Rd).

Direkte Adressierung von zwei Registern (Rd und Rr)
Die Operanden für den Befehl sind in den Registern d (Rd) und r (Rr) enthalten.
Das Ergebnis der Operation wird im Register d (Rd) abgelegt.

Direkte I/O-Adressierung
Die Adresse des I/O-Operanden ist in den 6 Bits des Befehlswortes enthalten.
Rr/Rd ist die Adresse des Ziel- oder Quellregisters.
In manchen Bausteinen sind mehr als 64 Speicherzellen im I/O-Bereich vorhanden.
Dieser erweiterte Speicherbereich von 64 bis 255 kann nur über die Datenadressierung
und nicht über die I/O-Adressierung erreicht werden.

Direkte Datenadressierung
Die 16-Bit-Adresse in den unteren 16 Bit des zwei Worte langen Befehls gibt die
Speicherzelle im Datenspeicher an.
Rr/Rd ist die Adresse des Ziel- oder Quellregisters.

Indirekte Datenadressierung mit Versatz
Die Adresse des Operanden ergibt sich aus der Addition des Y- oder Z-Registers mit den 6 Bits (Versatz) in dem Befehlswort.
Rr/Rd ist die Adresse des Ziel- oder Quellregisters.

Indirekte Datenadressierung
Die Adresse des Operanden wird über den Inhalt des X-, Y- oder Z-Registers bestimmt.
In Bausteinen ohne SRAM entspricht die indirekte Datenadressierung der indirekten Registeradressierung.
Die indirekte Registeradressierung ist eine Teilmenge der indirekten Datenadressierung,
da der Datenspeicher von 0 bis 31 im Registerbereich liegt.

Indirekte Datenadressierung mit vorherigem Dekrement
Bei dieser Art der Adressierung wird das X-, Y- oder Z-Register vor der Ausführung des Befehls dekrementiert.
Die Adresse des Operanden ist also der um eins verminderte Inhalt des entsprechenden Registers.

Indirekte Datenadressierung mit anschließendem Inkrement
Bei dieser Art der Adressierung wird das X-, Y- oder Z-Register nach der Ausführung des Befehls inkrementiert.
Die Adresse des Operanden ist also der Inhalt des entsprechenden Registers, bevor dieses um eins erhöht wird.

Laden von Konstanten aus dem Programmspeicher mit LPM und ELPM
Die Adresse der Daten wird im Z-Register angegeben.
Die oberen 15 Bit geben die Wortadresse an.
Beim LPM-Befehl selektiert das LSB das Low-Byte (LSB=0) oder High-Byte (LSB=1).
Beim SPM-Befehl muss das LSB=0 sein, da er sich auf ganze Worte (zwei Bytes) bezieht.
Wenn der ELPM-Befehl genutzt wird, adressiert das RAMPZ-Register den erweiterten Speicherbereich,
das Z-Register die Seite.

Laden von Konstanten aus dem Programmspeicher mit LPM Z+ und ELPM Z+
Die Adresse der Daten wird im Z-Register angegeben.
Nach dem Zugriff auf die angegebene Speicherzelle wird der Z-Pointer inkrementiert.
Die oberen 15 Bit geben die Wortadresse an.
Das LSB adressiert das Low-Byte (LSB=0) oder das High-Byte (LSB=1).
Wenn der ELPM Z+ Befehl genutzt wird, adressiert das RAMPZ-Register den erweiterten Speicherbereich,
das Z-Register die Seite.

Direkte Programmadressierung, JMP und CALL
Die Ausführung des Programms wird an der Adresse fortgesetzt,
die in den 22 Bit des gesamten Befehlswortes angegeben ist.

Indirekte Programmadressierung, IJMP und ICALL
Die Ausführung des Programms wird an der Adresse fortgesetzt, die in den 16 Bit des Z-Registers angegeben ist.

Relative Programmadressierung, RJMP und RCALL
Die Ausführung des Programms wird an der Adresse fortgesetzt,
die sich aus der Addition des aktuellen PC mit der relativen Adresse k und 1 ergibt.
Die relative Adresse k kann Werte zwischen -2048 und +2047 annehmen.
