LD - Load Indirect from Data Space to Register using Index X
LD (LDD) - Load Indirect from Data Space to Register using Index Y
LD (LDD) - Load Indirect from Data Space to Register using Index Z
LDI - Load Immediate
LDS - Load Direct from Data Space
LPM - Load Program Memory
LSL - Logical Shift Left
LSR - Logical Shift Right
Syntax: |
(a) LD Rd,X (b) LD Rd,X+ (c) LD Rd,-X |
Funktion: |
Dieser Befehl lädt ein Byte, das über das X-Register adressiert ist, aus dem
Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern,
den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich).
Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das
EEPROM hat immer einen eigenen Adressbereich. Die 16 Bit - Adresse der Speicherzelle wird im X-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPX-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPX-Registers verändert werden. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar. Das X-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren und Dekrementieren wirkt sich auf die verketteten RAMPX- und X-Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High-Byte des X- Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden. |
Operation: |
(a) Rd ← (X) (b) Rd ← (X), X ← X + 1 (c) X ← X - 1, Rd ← (X) |
Operanden: | 0 ≤ d ≤ 31 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 3 |
16 Bit Operations Code: |
(a) 1001 000d dddd 1100 (b) 1001 000d dddd 1101 (c) 1001 000d dddd 1110 |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
clr r27 ;High-Byte X-Pointer löschen ldi r26,$60 ;Low-Byte X-Pointer aus 60h setzen ld r0,X+ ;R0 mit Wert aus Adresse 60h laden ld r1,X ;R1 mit Wert aus Adresse 61h laden weiter ld r3,X ;R3 mit Wert aus Adresse 61h laden ld r2,-X ;R2 mit Wert aus Adresse 60h laden
Syntax: |
(a) LD Rd,Y (b) LD Rd,Y+ (c) LD Rd,-Y (d) LDD Rd,Y+q |
Funktion: |
Dieser Befehl lädt ein Byte, das mit oder ohne Verschiebung (q) über das Y-Register
adressiert ist, aus dem Datenspeicher. Bei Bausteinen mit SRAM besteht der
Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie
dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der
Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen
Adressbereich. Die 16 Bit - Adresse der Speicherzelle wird im Y-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPY-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPY-Registers verändert werden. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar. Das Y-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren, Dekrementieren und die Verschiebung wirken sich auf die verketteten RAMPY- und Y- Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High- Byte des Y-Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden. |
Operation: |
(a) Rd ← (Y) (b) Rd ← (Y), Y ← Y + 1 (c) Y ← Y - 1, Rd ← (Y) (d) Rd ← (Y+q) |
Operanden: | 0 ≤ d ≤ 31, (d) 0 ≤ q ≤ 63 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 3 |
16 Bit Operations Code: |
(a) 1000 000d dddd 1000 (b) 1001 000d dddd 1001 (c) 1001 000d dddd 1010 (d) 10q0 qq0d dddd 1qqq |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
clr r29 ;High-Byte Y-Pointer löschen ldi r28,$60 ;Low-Byte Y-Pointer aus 60h setzen ld r0,Y+ ;R0 mit Wert aus Adresse 60h laden ld r1,Y ;R1 mit Wert aus Adresse 61h laden ld r2,-Y ;R2 mit Wert aus Adresse 60h laden ld r3,Y+2 ;R3 mit Wert aus Adresse 62h laden
Syntax: |
(a) LD Rd,Z (b) LD Rd,Z+ (c) LD Rd,-Z (d) LDD Rd,Z+q |
Funktion: |
Dieser Befehl lädt ein Byte, das mit oder ohne Verschiebung (q) über das Z-Register
adressiert ist, aus dem Datenspeicher. Bei Bausteinen mit SRAM besteht der
Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie
dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der
Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen
Adressbereich. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar. Die 16 Bit - Adresse der Speicherzelle wird im Z-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPZ-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPZ-Registers verändert werden. Da der Z- Pointer auch für indirekte Unterprogrammaufrufe, indirekte Sprünge und das Auslesen von Tabellen aus dem Programmspeicher verwendet wird, sollten besser die X- und Y- Pointer für das Adressieren von Speicherplätzen verwendet werden. Das Z-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren, Dekrementieren und die Verschiebung wirken sich auf die verketteten RAMPZ- und Z- Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High- Byte des Z-Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden. |
Operation: |
(a) Rd ← (Z) (b) Rd ← (Z), Z ← Z + 1 (c) Z ← Z - 1, Rd ← (Z) (d) Rd ← (Z+q) |
Operanden: | 0 ≤ d ≤ 31, (d) 0 ≤ q ≤ 63 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 3 |
16 Bit Operations Code: |
(a) 1000 000d dddd 0000 (b) 1001 000d dddd 0001 (c) 1001 000d dddd 0010 (d) 10q0 qq0d dddd 0qqq |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
clr r31 ;High-Byte Z-Pointer löschen ldi r30,$60 ;Low-Byte Z-Pointer aus 60h setzen ld r0,Z ;R0 mit Wert aus Adresse 60h laden ld r3,Z+2 ;R3 mit Wert aus Adresse 62h laden
Syntax: | LDI Rd,K |
Funktion: | Dieser Befehl lädt eine Konstante in das Register Rd. Der Befehl kann nur mit den Registern R16 bis R31 verwendet werden. |
Operation: | Rd ← K |
Operanden: | 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 1 |
16 Bit Operations Code: | 1110 KKKK dddd KKKK |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
ldi r30,$F0 ;Low-Byte Z-Pointer mit F0h laden
Syntax: | LDS Rd,k |
Funktion: |
Dieser Befehl lädt ein Datum aus dem Datenspeicher in das Register Rd. Bei Bausteinen
mit internem SRAM besteht der Datenspeicher aus den Registern, dem I/O-Speicher und
dem internen SRAM (sowie dem externen SRAM, wenn beschaltbar). Bei Bausteinen
ohne internen SRAM besteht der Datenspeicher nur aus den Registern. Das EEPROM
hat immer einen eigenen Adressbereich. Die 16 Bit - Adresse muss immer angegeben
werden, wobei der Speicherzugriff auf die tatsächlich vorhandenen Speicherzellen
begrenzt ist. Der LDS - Befehl benutzt das RAMPD-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPD-Registers verändert werden. Der Befehl ist nicht in allen AVR - Mikrocontrollern verfügbar. |
Operation: | Rd ← (k) |
Operanden: | 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535 |
Programmzähler: | PC ← PC + 2 |
Words: | 2 (4 Byte) |
Zyklen: | 2 |
32 Bit Operations Code: |
1001 000d dddd 0000 kkkk kkkk kkkk kkkk |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
lds r30,$FF00 ;Datum aus Adresse FF00h in R30 laden.
Syntax: |
(a) LPM (b) LPM Rd,Z (c) LPM Rd,Z+ |
Funktion: |
Dieser Befehl lädt ein Byte, das über das Z-Register adressiert ist, aus den unteren 64k-
Byte des Programmspeichers in das Register Rd. Der Programmspeicher enthält an
jeder Adresse 2 Byte (1 Word). Daher adressiert das Z-Register, wenn das LSB 0 ist,
das niederwertige Byte der Adresse und mit LSB = 1 das höherwertige Byte des Wortes
an der Adresse. Das Z-Register kann mit dem Befehl entweder unverändert bleiben oder
automatisch inkrementiert werden. Bei Bausteinen mit der Möglichkeit des Selbstprogrammierens kann der LPM - Befehl verwendet werden, um die Werte der Fuse- und Lock-Bits zu lesen. Nicht alle LPM- Varianten sind in allen Bausteinen verfügbar. Im AT90S1200 ist der Befehl gar nicht implementiert. |
Operation: |
(a) R0 ← (Z) (b) Rd ← (Z) (c) Rd ← (Z), Z ← Z + 1 |
Operanden: | (a) keiner, R0 ist das Ziel (b) 0 ≤ d ≤ 31 (c) 0 ≤ d ≤ 31 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 3 |
16 Bit Operations Code: |
(a) 1001 0101 1100 1000 (b) 1001 000d dddd 0100 (c) 1001 000d dddd 0101 |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
ldi r30,$00 ;Low-Byte Z-Pointer mit 00h laden ldi r31,$01 ;High-Byte Z-Pointer mit 01h laden lpm r20,Z+ ;Low-Byte aus Adresse 0100h in R20 laden ... lpm r20,Z ;High-Byte aus Adresse 0100h in R20 laden
Syntax: | LSL Rd |
Funktion: | Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach links geschoben. Das Bit 7 wird in das Carry-Flag geschoben, das Bit 0 wird gelöscht. Damit stellt dieser Befehl unabhängig vom Vorzeichen des Wertes in Rd eine Multiplikation mit 2 dar. |
Operation: | |
Operanden: | 0 ≤ d ≤ 31 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 1 |
16 Bit Operations Code: | 0000 11dd dddd dddd |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | ↔ | ↔ | ↔ | ↔ | ↔ | ↔ |
H: | Das H-Flag enthält nach dem Linksschieben das ursprüngliche Bit 3 des Registers Rd. |
S: | Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht. |
V: | Das V-Flag wird gesetzt, wenn nach dem Linksschieben entweder das N-Flag oder das C-Flag gesetzt ist. Wenn beide Bits gleich sind, wird das V-Flag gelöscht. |
N: | Das N-Flag wird gesetzt, wenn das MSB (Bit 7) des Ergebnisses gesetzt ist, andernfalls wird es gelöscht. |
Z: | Das Z-Flag wird gesetzt, wenn das Ergebnis 0000h ist, andernfalls wird das Flag gelöscht. |
C: | Das C-Flag enthält nach dem Linksschieben das ursprüngliche Bit 7 des Rd Registers. |
lsl r16 ;Multipliziert das Register R16 ;mit 2 durch Linksschieben.
Syntax: | LSR Rd |
Funktion: | Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach rechts geschoben. Das Bit 0 wird in das Carry-Flag geschoben, das Bit 7 wird gelöscht. Damit stellt dieser Befehl bei einem vorzeichenlosen Wert in Rd eine Division mit 2 dar. Das Carry kann genutzt werden, um das Ergebnis zu runden. |
Operation: | |
Operanden: | 0 ≤ d ≤ 31 |
Programmzähler: | PC ← PC + 1 |
Words: | 1 (2 Byte) |
Zyklen: | 1 |
16 Bit Operations Code: | 1001 010d dddd 0110 |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | ↔ | ↔ | 0 | ↔ | ↔ |
S: | Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht. |
V: | Das V-Flag wird gesetzt, wenn nach dem Rechtsschieben entweder das N-Flag oder das C-Flag gesetzt ist. Wenn beide Bits gleich sind, wird das V-Flag gelöscht. |
N: | Das N-Flag wird gelöscht. |
Z: | Das Z-Flag wird gesetzt, wenn das Ergebnis 0000h ist, andernfalls wird das Flag gelöscht. |
C: | Das C-Flag enthält nach dem Rechtsschieben das ursprüngliche Bit 7 des Rd Registers. |
lsr r16 ;Schiebt die Bits des Registers R16 eine ;Position nach rechts.