Arithmetische und logische Befehle
Datentransport Befehle
MCU Steuerbefehle
Verzweigungsbefehle
Bit- und Bittest-Befehle
Arithmetische und logische 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 |
Datentransport - Befehle| 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 |
MCU - Steuerbefehle| 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 |
Verzweigungs - Befehle| 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 |
Bit - Befehle und Bit-Test - Befehle| 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 |