Arithmetische und logische Befehle
Datentransport Befehle
MCU Steuerbefehle
Verzweigungsbefehle
Bit- und Bittest-Befehle
Mnemonik | Operanden | Beschreibung | Operation | Flags | Takte |
---|---|---|---|---|---|
ADD | Rd, Rr | Addiert zwei Register | Rd ← Rd + Rr | Z, C, N, V, S, H | 1 |
ADC | Rd, Rr | Addiert Carry und zwei Register | Rd ← Rd + Rr + C | Z, C, N, V, S, H | 1 |
ADIW (1) | Rd, K (3) | Addiert eine Konstante zu einem Registerpaar | Rd+1:Rd ← Rd+1:Rd + K | Z, C, N, V, S | 2 |
SUB | Rd, Rr | Subtrahiert zwei Register | Rd ← Rd - Rr | Z, C, N, V, S, H | 1 |
SUBI | Rd, K (3) | Subtrahiert eine Konstante vom Register | Rd ← Rd - K | Z, C, N, V, S, H | 1 |
SBC | Rd, Rr | Subtrahiert Carry und Register vom Register | Rd ← Rd - Rr - C | Z, C, N, V, S, H | 1 |
SBCI | Rd, K (3) | Subtrahiert eine Konstante und Carry vom Register | Rd ← Rd - K - C | Z, C, N, V, S, H | 1 |
SBIW (1) | Rd, K (3) | Subtrahiert eine Konstante von einem Registerpaar | Rd+1:Rd ← Rd+1:Rd - K | Z, C, N, V, S | 2 |
AND | Rd, Rr | Logische UND-Verknüpfung zweier Register | Rd ← Rd • Rr | Z, N, V, S | 1 |
ANDI | Rd, K (3) | Logische UND-Verknüpfung Register mit Konstante | Rd ← Rd • K | Z, N, V, S | 1 |
OR | Rd, Rr | Logische ODER-Verknüpfung zweier Register | Rd ← Rd v Rr | Z, N, V, S | 1 |
ORI | Rd, K (3) | Logische ODER-Verknüpfung Register mit Konstante | Rd ← Rd v K | Z, N, V, S | 1 |
EOR | Rd, Rr | Logische XOR-Verknüpfung zweier Register | Rd ← Rd Rr | Z, N, V, S | 1 |
COM | Rd | Einerkomplement des Registers | Rd ← FFh - Rd | Z, C, N, V, S | 1 |
NEG | Rd | Zweierkomplement des Registers | Rd ← 00h - Rd | Z, C, N, V, S, H | 1 |
SBR | Rd, K (3) | Setzt Bit(s) in Register | Rd ← Rd v K | Z, N, V, S | 1 |
CBR | Rd, K (3) | Löscht Bit(s) in Register | Rd ← Rd • (FFh - K) | Z, N, V, S | 1 |
INC | Rd | Inkrementieren Register | Rd ← Rd + 1 | Z, N, V, S | 1 |
DEC | Rd | Dekrementieren Register | Rd ← Rd - 1 | Z, N, V, S | 1 |
TST | Rd | Test ob Register Null oder Minus | Rd ← Rd • Rd | Z, N, V, S | 1 |
CLR | Rd | Löschen Register | Rd ← Rd Rd | Z, N, V, S | 1 |
SER | Rd (3) | Setzen des Registers | Rd ← FFh | keines | 1 |
MUL (1) | Rd, Rr | Multipliziert die Register Rd und Rr, ohne Vorzeichen | R1:R0 ← Rd x Rr | Z, C | 2 |
MULS (1) | Rd, Rr (3) | Multipliziert die Register Rd und Rr, mit Vorzeichen | R1:R0 ← Rd x Rr | Z, C | 2 |
MULSU (1) | Rd, Rr (3) | Multipliziert die Register Rd und Rr, mit / ohne Vorzeichen | R1:R0 ← Rd x Rr | Z, C | 2 |
FMUL (1) | Rd, Rr (3) | Multipliziert die Register Rd und Rr, gebrochene Zahlen ohne Vorzeichen | R1:R0 ← (Rd x Rr)<<1 | Z, C | 2 |
FMULS (1) | Rd, Rr (3) | Multipliziert die Register Rd und Rr, gebrochene Zahlen mit Vorzeichen | R1:R0 ← (Rd x Rr)<<1 | Z, C | 2 |
FMULSU (1) | Rd, Rr (3) | Multipliziert die Register Rd und Rr, gebrochene Zahlen mit / ohne Vorzeichen | R1:R0 ← (Rd x Rr)<<1 | Z, C | 2 |
Mnemonik | Operanden | Beschreibung | Operation | Flags | Takte |
---|---|---|---|---|---|
MOV | Rd, Rr | Kopiert von Register nach Register | Rd ← Rr | keines | 1 |
MOVW (1) | Rd, Rr | Kopiert von Registerpaar nach Registerpaar | Rd+1:Rd ← Rr+1:Rr | keines | 1 |
LDI | Rd, K (3) | Register mit Konstante laden | Rd ← K | keines | 1 |
LDS (1) | Rd, k | Register mit Konstante aus Datenspeicher laden | Rd ← (k) | keines | 2 |
LD (2) | Rd, X | Register indirekt laden | Rd ← (X) | keines | 2 |
LD (2) | Rd, X+ | Register indirekt laden und Zeiger anschließend inkrementieren | Rd ← (X), X ← X + 1 | keines | 2 |
LD (2) | Rd, -X | Register indirekt laden und Zeiger vorher dekrementieren | X ← X - 1, Rd ← (X) | keines | 2 |
LD (2) | Rd, Y | Register indirekt laden | Rd ← (Y) | keines | 2 |
LD (2) | Rd, Y+ | Register indirekt laden und Zeiger anschließend inkrementieren | Rd ← (Y), Y ← Y + 1 | keines | 2 |
LD (2) | Rd, -Y | Register indirekt laden und Zeiger vorher dekrementieren | Y ← Y - 1, Rd ← (Y) | keines | 2 |
LDD (1) | Rd, Y+q | Register indirekt mit Verschiebung laden | Rd ← (Y + q) | keines | 2 |
LD (2) | Rd, Z | Register indirekt laden | Rd ← (Z) | keines | 2 |
LD (2) | Rd, Z+ | Register indirekt laden und Zeiger anschließend inkrementieren | Rd ← (Z), Z ← Z + 1 | keines | 2 |
LD (2) | Rd, -Z | Register indirekt laden und Zeiger vorher dekrementieren | Z ← Z - 1, Rd ← (Z) | keines | 2 |
LDD (2) | Rd, Z+q | Register indirekt mit Verschiebung laden | Rd ← (Z + q) | keines | 2 |
STS (1) | k, Rr | Register in Datenspeicher speichern | (k) ← Rr | keines | 2 |
ST (2) | X, Rr | Register indirekt speichern | (X) ← Rr | keines | 2 |
ST (2) | X+, Rr | Register indirekt speichern und X danach inkrementieren | (X) ← Rr, X ← X + 1 | keines | 2 |
ST (2) | -X, Rr | Register indirekt speichern und X vorher dekrementieren | X ← X - 1, (X) ← Rr | keines | 2 |
ST (2) | Y, Rr | Register indirekt speichern | (Y) ← Rr | keines | 2 |
ST (2) | Y+, Rr | Register indirekt speichern und Y danach inkrementieren | (Y) ← Rr, Y ← Y + 1 | keines | 2 |
ST (2) | -Y, Rr | Register indirekt speichern und Y vorher dekrementieren | Y ← Y - 1, (Y) ← Rr | keines | 2 |
STD (1) | Y+q, Rr | Register indirekt mit Verschiebung speichern | (Y + q) ← Rr | keines | 2 |
ST (2) | Z, Rr | Register indirekt speichern | (Z) ← Rr | keines | 2 |
ST (2) | Z+, Rr | Register indirekt speichern und Z danach inkrementieren | (Z) ← Rr, Z ← Z + 1 | keines | 2 |
ST (2) | -Z, Rr | Register indirekt speichern und Z vorher dekrementieren | Z ← Z - 1, (Z) ← Rr | keines | 2 |
STD (1) | Z+q, Rr | Register indirekt mit Verschiebung speichern | (Z + q) ← Rr | keines | 2 |
LPM (2) | Laden aus dem Programmspeicher in R0 | R0 ← (Z) | keines | 3 | |
LPM (2) | Rd, Z | Laden aus dem Programmspeicher in Rd | Rd ← (Z) | keines | 3 |
LPM (2) | Rd, Z+ | Laden aus dem Programmspeicher in Rd und Z hinterher inkrementieren | Rd ← (Z), Z ← Z + 1 | keines | 3 |
ELPM (1) | Laden aus dem erweiterten Programmspeicher in R0 | R0 ← (RAMPZ:Z) | keines | 3 | |
ELPM (1) | Rd, Z | Laden aus dem erweiterten Programmspeicher in Rd | Rd ← (RAMPZ:Z) | keines | 3 |
ELPM (1) | Rd, Z+ | Laden aus dem erweiterten Programmspeicher in Rd und Z hinterher inkrementieren | Rd ← (RAMPZ:Z), Z ← Z + 1 | keines | 3 |
SPM (1) | In den Programmspeicher speichern | (Z) ← R1:R0 | keines | - | |
IN | Rd, A | I/O Stelle einlesen | Rd ← A | keines | 1 |
OUT | A, Rr | I/O Stelle ausgeben | A ← Rr | keines | 1 |
PUSH (1) | Rr | Sichert Rr in den Stack | STACK ← Rr | keines | 2 |
POP (1) | Rd | Holt Stack in Rd | Rd ← STACK | keines | 2 |
Mnemonik | Operanden | Beschreibung | Operation | Flags | Takte |
---|---|---|---|---|---|
BREAK (1) | - | Unterbrechung | siehe Beschreibung der Break - Funktion | keines | 1 |
NOP | - | Leerbefehl | keine Operation | keines | 1 |
SLEEP | - | Übergang in den Sleep-Modus | siehe Beschreibung der Sleep - Funktion | keines | 1 |
WDR | - | Watchdog Reset | siehe Beschreibung Watchdog / Timer | keines | 1 |
Mnemonik | Operanden | Beschreibung | Operation | Flags | Takte |
---|---|---|---|---|---|
RJMP | k | Relativer Sprung | PC ← PC + k + 1 | keines | 2 |
IJMP (1) | Indirekter Sprung zu (Z) | PC(15:0) ← Z, PC(21:16) ← 0 | keines | 2 | |
EIJMP (1) | Erweiterter indirekter Sprung zu (Z) | PC(15:0) ← Z, PC(21:16) ← EIND | keines | 2 | |
JMP (1) | k | Direkter Sprung | PC ← k | keines | 3 |
RCALL | k | Relativer Aufruf Unterprogramm | PC ← PC + k + 1 | keines | 3 / 4 |
ICALL (1) | Indirekter Aufruf Unterprogramm | PC(15:0) ← Z, PC(21:16) ← 0 | keines | 3 / 4 | |
EICALL (1) | Erweiterter indirekter Aufruf Unterprogramm | PC(15:0) ← Z, PC(21:16) ← EIND | keines | 4 | |
CALL (1) | k | Direkter Aufruf Unterprogramm | PC ← k | keines | 4 |
RET | Rückkehr aus Unterprogramm | PC ← STACK | keines | 4 | |
RETI | Rückkehr aus Interrupt - Routine | PC ← STACK | I | 4 | |
CPSE | Rd, Rr | Vergleichen, überspringen wenn gleich | Wenn (Rd=Rr) dann PC ← PC + 2 oder 3 | keines | 1/2/3 |
CP | Rd, Rr | Vergleichen | Rd - Rr | Z, N, S, V, C, H | 1 |
CPC | Rd, Rr | Register Vergleichen mit Carry | Rd - Rr - C | Z, N, S, V, C, H | 1 |
CPI | Rd, K (3) | Vergleiche Register mit Konstante | Rd - K | Z, N, S, V, C, H | 1 |
SBRC | Rr, b | Überspringen, wenn Bit in Register gelöscht | Wenn (Rr(b)=0) dann PC ← PC + 2 oder 3 | keines | 1/2/3 |
SBRS | Rr, b | Überspringen, wenn Bit in Register gesetzt | Wenn (Rr(b)=1) dann PC ← PC + 2 oder 3 | keines | 1/2/3 |
SBIC | A, b (3) | Überspringen, wenn Bit in I/O-Register gelöscht | Wenn (A(b)=0) dann PC ← PC + 2 oder 3 | keines | 1/2/3 |
SBIS | A, b (3) | Überspringen, wenn Bit in I/O-Register gesetzt | Wenn (A(b)=1) dann PC ← PC + 2 oder 3 | keines | 1/2/3 |
BRBS | s, k | Verzweigen, wenn Statusbit s gesetzt ist. | Wenn (SREG(s)=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRBC | s, k | Verzweigen, wenn Statusbit s gelöscht ist. | Wenn (SREG(s)=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BREQ | k | Verzweigen wenn gleich | Wenn (Z=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRNE | k | Verzweigen wenn nicht gleich | Wenn (Z=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRCS | k | Verzweigen wenn Carry gesetzt ist. | Wenn (C=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRCC | k | Verzweigen wenn Carry gelöscht ist. | Wenn (C=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRSH | k | Verzweigen wenn gleich oder grösser | Wenn (C=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRLO | k | Verzweigen wenn kleiner | Wenn (C=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRMI | k | Verzweigen wenn Minus | Wenn (N=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRPL | k | Verzweigen wenn Plus | Wenn (N=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRGE | k | Verzweigen wenn größer oder gleich, vorzeichenbehaftet | Wenn (N V = 0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRLT | k | Verzweigen wenn kleiner als, vorzeichenbehaftet | Wenn (N V = 1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRHS | k | Verzweigen wenn H-Carry Flag gesetzt ist | Wenn (H=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRHC | k | Verzweigen wenn H-Carry Flag gelöscht ist | Wenn (H=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRTS | k | Verzweigen wenn T-Flag gesetzt ist | Wenn (T=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRTC | k | Verzweigen wenn T-Flag gelöscht ist | Wenn (T=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRVS | k | Verzweigen wenn Overflow-Flag (V) gesetzt ist | Wenn (V=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRVC | k | Verzweigen wenn Overflow-Flag (V) gelöscht ist | Wenn (V=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRIE | k | Verzweigen wenn Interrupt freigegeben | Wenn (I=1) dann PC ← PC + k + 1 | keines | 1 / 2 |
BRID | k | Verzweigen wenn Interrupt gesperrt | Wenn (I=0) dann PC ← PC + k + 1 | keines | 1 / 2 |
Mnemonik | Operanden | Beschreibung | Operation | Flags | Takte |
---|---|---|---|---|---|
SBI | A, b (3) | Bit in I/O-Register setzen | I/O(A, b) ← 1 | keines | 2 |
CBI | A, b (3) | Bit in I/O-Register löschen | I/O(A, b) ← 0 | keines | 2 |
LSL | Rd | Logisches Schieben nach Links | Rd(n+1) ← Rd(n), Rd(0) ← 0 | Z, C, N, V, H | 1 |
LSR | Rd | Logisches Schieben nach Rechts | Rd(n) ← Rd(n+1), Rd(7) ← 0 | Z, C, N, V | 1 |
ROL | Rd | Nach Links rotieren durch Carry | Rd(0) ← C, Rd(n+1) ← Rd(n), C ← Rd(7) | Z, C, N, V, H | 1 |
ROR | Rd | Nach Rechts rotieren durch Carry | Rd(7) ← C, Rd(n) ← Rd(n+1), C ← Rd(0) | Z, C, N, V | 1 |
ASR | Rd | Arithmetisches Schieben nach Rechts | Rd(n) ← Rd(n+1), n = 0...6 | Z, C, N, V | 1 |
SWAP | Rd | Nibbles vertauschen | Rd(3..0) ← Rd (7..4), Rd(7..4) ← Rd(3..0) | keines | 1 |
BSET | s | Flag im SREG setzen | SREG(s) ← 1 | SREG(s) | 1 |
BCLR | s | Flag im SREG löschen | SREG(s) ← 0 | SREG(s) | 1 |
BST | Rr, b | Bit von Register nach T speichern | T ← Rr(b) | T | 1 |
BLD | Rd, b | Bit von T nach Register laden | Rd(b) ← T | keines | 1 |
SEC | Carry setzen | C ← 1 | C | 1 | |
CLC | Carry löschen | C ← 0 | C | 1 | |
SEN | Negativ-Flag N setzen | N ← 1 | N | 1 | |
CLN | Negativ-Flag N löschen | N ← 0 | N | 1 | |
SEZ | Zero-Flag setzen | Z ← 1 | Z | 1 | |
CLZ | Zero-Flag löschen | Z ← 0 | Z | 1 | |
SEI | Globale Interrupt-Freigabe | I ← 1 | I | 1 | |
CLI | Globale Interrupt-Sperre | I ← 0 | I | 1 | |
SES | Vorzeichen Test-Flag setzen | S ← 1 | S | 1 | |
CLS | Vorzeichen Test-Flag löschen | S ← 0 | S | 1 | |
SEV | Zweierkomplement-Overflow setzen | V ← 1 | V | 1 | |
CLV | Zweierkomplement-Overflow löschen | V ← 0 | V | 1 | |
SET | T in SREG setzen | T ← 1 | T | 1 | |
CLT | T in SREG löschen | T ← 0 | T | 1 | |
SEH | Half-Carry-Flag in SREG setzen | H ← 1 | H | 1 | |
CLH | Half-Carry-Flag in SREG löschen | H ← 0 | H | 1 |