37.   Befehlsübersicht

Arithmetische und logische Befehle
MnemonikBeschreibungFunktionFlagsT.Kode/Emul.
ADD Rd,Rr Addiert zwei Register Rd ← Rd + Rr Z,C,N,V,S,H 1 000011rd ddddrrrr
ADC Rd,Rr Addiert Carry und zwei Register Rd ← Rd + Rr + C Z,C,N,V,S,H 1 000111rd ddddrrrr
ADIW Rd,K Addiert eine Konstante zu einem Registerpaar Rd+1:Rd ← Rd+1:Rd + K Z,C,N,V,S 2 10010110 KKddKKKK
SUB Rd,Rr Subtrahiert zwei Register Rd ← Rd - Rr Z,C,N,V,S,H 1 000110rd ddddrrrr
SUBI Rd,K Subtrahiert eine Konstante vom Register Rd ← Rd - K Z,C,N,V,S,H 1 0101KKKK ddddKKKK
SBC Rd,Rr Subtrahiert Carry und Register vom Register Rd ← Rd - Rr - C Z,C,N,V,S,H 1 000010rd ddddrrrr
SBCI Rd,K Subtrahiert eine Konstante und Carry vom Register Rd ← Rd - K - C Z,C,N,V,S,H 1 0100KKKK ddddKKKK
SBIW Rd,K Subtrahiert eine Konstante von einem Registerpaar Rd+1:Rd ← Rd+1:Rd - K Z,C,N,V,S 2 10010111 KKddKKKK
AND Rd,Rr Logische UND-Verknüpfung zweier Register Rd ← Rd • Rr Z,N,V,S 1 001000rd ddddrrrr
ANDI Rd,K Logische UND-Verknüpfung Register mit Konstante Rd ← Rd • K Z,N,V,S 1 0111KKKK ddddKKKK
OR Rd,Rr Logische ODER-Verknüpfung zweier Register Rd ← Rd ∨ Rr Z,N,V,S 1 001010rd ddddrrrr
ORI Rd,K Logische ODER-Verknüpfung Register mit Konstante Rd ← Rd ∨ K Z,N,V,S 1 0110KKKK ddddKKKK
EOR Rd,Rr Logische XOR-Verknüpfung zweier Register Rd ← Rd ⊕ Rr Z,N,V,S 1 001001rd ddddrrrr
COM Rd Einerkomplement des Registers Rd ← FFh - Rd Z,C,N,V,S 1 1001010d dddd0000
NEG Rd Zweierkomplement des Registers Rd ← 00h - Rd Z,C,N,V,S,H 1 1001010d dddd0001
SBR Rd,K Setzt Bit(s) in Register Rd ← Rd ∨ K Z,N,V,S 1 OR Rd,K
CBR Rd,K Löscht Bit(s) in Register Rd ← Rd • (FFh - K) Z,N,V,S 1 AND Rd,~K
INC Rd Inkrementieren Register Rd ← Rd + 1 Z,N,V,S 1 1001010d dddd0011
DEC Rd Dekrementieren Register Rd ← Rd - 1 Z,N,V,S 1 1001010d dddd1010
TST Rr Test ob Register Null oder negativ Rr ? Z,N,V,S 1 AND Rr,Rr
CLR Rd Löschen Register Rd ← 0 Z,N,V,S 1 EOR Rd,Rd
SER Rd Setzen des Registers Rd ← FFh keines 1 LDI Rd,0xFF
MUL Rd,Rr Multipliziert Rd und Rr, ohne Vorzeichen R1:R0 ← Rd × Rr Z,C 2 100111rd ddddrrrr
MULS Rd,Rr Multipliziert Rd und Rr, mit Vorzeichen R1:R0 ← Rd × Rr Z,C 2 00000010 ddddrrrr
MULSU Rd,Rr Multipliziert Rd und Rr, mit / ohne Vorzeichen R1:R0 ← Rd × Rr Z,C 2 00000011 0ddd0rrr
FMUL Rd,Rr Multipliziert Rd und Rr, gebrochene Zahlen ohne Vorzeichen R1:R0 ← (Rd×Rr)≪1 Z,C 2 00000011 0ddd1rrr
FMULS Rd,Rr Multipliziert Rd und Rr, gebrochene Zahlen mit Vorzeichen R1:R0 ← (Rd×Rr)≪1 Z,C 2 00000011 1ddd0rrr
FMULSU Rd,Rr Multipliziert Rd und Rr, gebrochene Zahlen mit / ohne Vorzeichen R1:R0 ← (Rd×Rr)≪1 Z,C 2 00000011 1ddd1rrr
Datentransport-Befehle
MnemonikBeschreibungFunktionFlagsT.Kode/Emul.
MOV Rd,Rr Kopiert von Register nach Register Rd ← Rr keines 1 001011rd ddddrrrr
MOVW Rd,Rr Kopiert von Registerpaar nach Registerpaar Rd+1:Rd ← Rr+1:Rr keines 1 00000001 ddddrrrr
LDI Rd,K Register mit Konstante laden Rd ← K keines 1 1110KKKK ddddKKKK
LDS Rd,k Register mit Konstante aus Datenspeicher laden Rd ← (k) keines 2 1001000d dddd0000
kkkkkkkk kkkkkkkk
LD Rd,z Register indirekt laden Rd ← (z) keines 2 1001000d ddddzz00
LD Rd,z+ Register indirekt laden, Zeiger inkrementieren Rd ← (z), z ← z + 1 keines 2 1001000d ddddzz01
LD Rd,-z Zeiger dekrementieren, Register indirekt laden z ← z - 1, Rd ← (z) keines 2 1001000d ddddzz10
LDD Rd,z+q Register indirekt mit Offset laden Rd ← (Y + q) keines 2 10q0qq0d ddddzqqq
STS k,Rr Register in Datenspeicher speichern (k) ← Rr keines 2 1001001d dddd0000
kkkkkkkk kkkkkkkk
ST z,Rr Register indirekt speichern (z) ← Rr keines 2 1000001r rrrrzz00
ST z+,Rr Register indirekt speichern, Zeiger inkrementieren (z) ← Rr, X ← X + 1 keines 2 1001001r rrrrzz01
ST -z,Rr Zeiger dekrementieren, Register indirekt speichern X ← X - 1, (X) ← Rr keines 2 1001001r rrrrzz10
STD z+q,Rr Register indirekt mit Offset speichern (Y + q) ← Rr keines 2 10q0qq1r rrrrzqqq
LPM Laden aus dem Programmspeicher in R0 R0 ← (Z) keines 3 10010101 11001000
LPM Rd,Z Laden aus dem Programmspeicher in Rd Rd ← (Z) keines 3 1001000d dddd0100
LPM Rd,Z+ Laden aus dem Programmspeicher in Rd, Z inkrementieren Rd ← (Z), Z ← Z + 1 keines 3 1001000d dddd0101
ELPM Laden aus dem erweiterten Programmspeicher in R0 R0 ← (RAMPZ:Z) keines 3 10010101 11011000
ELPM Rd,Z Laden aus dem erweiterten Programmspeicher in Rd Rd ← (RAMPZ:Z) keines 3 1001000d dddd0110
ELPM Rd,Z+ Laden aus dem erweiterten Programmspeicher in Rd, Z inkrementieren Rd ← (RAMPZ:Z), Z ← Z + 1 keines 3 1001000d dddd0111
SPM In den Programmspeicher speichern (Z) ← R1:R0 keines - 10010101 11101000
IN Rd,A I/O-Adresse lesen Rd ← (A+0x20) keines 1 10110AAd ddddAAAA
OUT A,Rr I/O-Adresse beschreiben (A+0x20) ← Rr keines 1 10111AAr rrrrAAAA
PUSH Rr Sichert Rr in den Stack (SP) ← Rr, SP ← SP - 1 keines 2 1001001d dddd1111
POP Rd Holt Stackspitze in Rd SP ← SP + 1, Rd ← (SP) keines 2 1001000d dddd1111
MCU-Steuerbefehle
MnemonikBeschreibungFunktionFlagsT.Kode/Emul.
BREAK Unterbrechung siehe Beschreibung der Break-Funktion keines 1 10010101 10011000
NOP Leerbefehl keine Operation keines 1 00000000 00000000
SLEEP Übergang in den Sleep-Modus siehe Beschreibung der Sleep-Funktion keines 1 10010101 10001000
WDR Watchdog-Reset siehe Beschreibung Watchdog-Zeitgeber keines 1 10010101 10101000
Verzweigungsbefehle
MnemonikBeschreibungFunktionFlagsT.Kode/Emul.
RJMP k Relativer Sprung PC ← PC + k + 1 keines 2 1100kkkk kkkkkkkk
IJMP Indirekter Sprung zu (Z) PC(15:0) ← Z, PC(21:16) ← 0 keines 2 10010100 00001001
EIJMP Erweiterter indirekter Sprung zu (Z) PC(15:0) ← Z, PC(21:16) ← EIND keines 2 10010100 00011001
JMP k Direkter Sprung PC ← k keines 3 1001010k kkkk110k
kkkkkkkk kkkkkkkk
RCALL k Relativer Unterprogramm-Aufruf PUSH PC, PC ← PC + k + 1 keines 3/4 1101kkkk kkkkkkkk
ICALL Indirekter Unterprogramm-Aufruf PUSH PC, PC(15:0) ← Z, PC(21:16) ← 0 keines 3/4 10010101 00001001
EICALL Erweiterter indirekter Unterprogramm-Aufruf PUSH PC, PC(15:0) ← Z, PC(21:16) ← EIND keines 4 10010101 00011001
CALL k Direkter Unterprogramm-Aufruf PUSH PC, PC ← k keines 4 1001010k kkkk111k
kkkkkkkk kkkkkkkk
RET Rückkehr aus Unterprogramm POP PC keines 4 10010101 00001000
RETI Rückkehr aus Interrupt-Routine POP PC, I ← 1 I 4 10010101 00011000
CPSE Rd,Rr Vergleichen, überspringen wenn gleich Wenn (Rd=Rr) dann PC ← PC + 2 oder 3 keines 1/2/3 000100rd ddddrrrr
CP Rd,Rr Vergleichen Rd - Rr ? Z,N,S,V,C,H 1 000101rd ddddrrrr
CPC Rd,Rr Register vergleichen mit Carry Rd - Rr - C ? Z,N,S,V,C,H 1 000001rd ddddrrrr
CPI Rd,K Vergleiche Register mit Konstante Rd - K ? Z,N,S,V,C,H 1 0011KKKK ddddKKKK
SBRC Rr,b Überspringen, wenn Bit in Register gelöscht Wenn (Rr(b)=0) dann PC ← PC + 2 oder 3 keines 1/2/3 1111110r rrrr0bbb
SBRS Rr,b Überspringen, wenn Bit in Register gesetzt Wenn (Rr(b)=1) dann PC ← PC + 2 oder 3 keines 1/2/3 1111111r rrrr0bbb
SBIC A,b Überspringen, wenn Bit in I/O-Register gelöscht Wenn (A[b]=0) dann PC ← PC + 2 oder 3 keines 1/2/3 10011001 AAAAAbbb
SBIS A,b Überspringen, wenn Bit in I/O-Register gesetzt Wenn (A[b]=1) dann PC ← PC + 2 oder 3 keines 1/2/3 10011011 AAAAAbbb
BRBS s,k Verzweigen, wenn Statusbit s gesetzt ist. Wenn (SREG[s]=1) dann PC ← PC + k + 1 keines 1/2 111100kk kkkkksss
BRBC s,k Verzweigen, wenn Statusbit s gelöscht ist. Wenn (SREG[s]=0) dann PC ← PC + k + 1 keines 1/2 111101kk kkkkksss
BREQ k Verzweigen wenn gleich Wenn (Z=1) dann PC ← PC + k + 1 keines 1/2 BRBS 1,k
BRNE k Verzweigen wenn nicht gleich Wenn (Z=0) dann PC ← PC + k + 1 keines 1/2 BRBC 1,k
BRCS k Verzweigen wenn Carry gesetzt ist. Wenn (C=1) dann PC ← PC + k + 1 keines 1/2 BRBS 0,k
BRCC k Verzweigen wenn Carry gelöscht ist. Wenn (C=0) dann PC ← PC + k + 1 keines 1/2 BRBC 0,k
BRSH k Verzweigen wenn gleich oder größer Wenn (C=0) dann PC ← PC + k + 1 keines 1/2 BRBC 0,k
BRLO k Verzweigen wenn kleiner Wenn (C=1) dann PC ← PC + k + 1 keines 1/2 BRBS 0,k
BRMI k Verzweigen wenn Minus Wenn (N=1) dann PC ← PC + k + 1 keines 1/2 BRBS 2,k
BRPL k Verzweigen wenn Plus Wenn (N=0) dann PC ← PC + k + 1 keines 1/2 BRBC 2,k
BRGE k Verzweigen wenn größer oder gleich, vorzeichenbehaftet Wenn (N ⊕ V = 0) dann PC ← PC + k + 1 keines 1/2 BRBC 4,k
BRLT k Verzweigen wenn kleiner als, vorzeichenbehaftet Wenn (N ⊕ V = 1) dann PC ← PC + k + 1 keines 1/2 BRBS 4,k
BRHS k Verzweigen wenn H-Carry Flag gesetzt ist Wenn (H=1) dann PC ← PC + k + 1 keines 1/2 BRBS 5,k
BRHC k Verzweigen wenn H-Carry Flag gelöscht ist Wenn (H=0) dann PC ← PC + k + 1 keines 1/2 BRBC 5,k
BRTS k Verzweigen wenn T-Flag gesetzt ist Wenn (T=1) dann PC ← PC + k + 1 keines 1/2 BRBS 6,k
BRTC k Verzweigen wenn T-Flag gelöscht ist Wenn (T=0) dann PC ← PC + k + 1 keines 1/2 BRBC 6,k
BRVS k Verzweigen wenn Overflow-Flag (V) gesetzt ist Wenn (V=1) dann PC ← PC + k + 1 keines 1/2 BRBS 3,k
BRVC k Verzweigen wenn Overflow-Flag (V) gelöscht ist Wenn (V=0) dann PC ← PC + k + 1 keines 1/2 BRBC 3,k
BRIE k Verzweigen wenn Interrupt freigegeben Wenn (I=1) dann PC ← PC + k + 1 keines 1/2 BRBS 7,k
BRID k Verzweigen wenn Interrupt gesperrt Wenn (I=0) dann PC ← PC + k + 1 keines 1/2 BRBC 7,k
Bit-Befehle
MnemonikBeschreibungFunktionFlagsT.Kode/Emul.
SBI A,b Bit in I/O-Register setzen [A+0x20] |= 1≪b keines 2 10011010 AAAAAbbb
CBI A,b Bit in I/O-Register löschen [A+0x20] &=~ 1≪b keines 2 10011000 AAAAAbbb
LSL Rd Logisches Linksschieben Rd(n+1) ← Rd(n), Rd(0) ← 0 Z,C,N,V,H 1 ADD Rd,Rd
LSR Rd Logisches Rechtsschieben Rd(n) ← Rd(n+1), Rd(7) ← 0 Z,C,N,V 1 1001010d dddd0110
ROL Rd Links rotieren durch Carry Rd(0) ← C, Rd(n+1) ← Rd(n), C ← Rd(7) Z,C,N,V,H 1 ADC Rd,Rd
ROR Rd Rechts rotieren durch Carry Rd(7) ← C, Rd(n) ← Rd(n+1), C ← Rd(0) Z,C,N,V 1 1001010d dddd0111
ASR Rd Arithmetisches Rechtsschieben Rd(n) ← Rd(n+1), n = 0...6 Z,C,N,V 1 1001010d dddd0101
SWAP Rd Nibbles vertauschen Rd(3..0) ← Rd (7..4), Rd(7..4) ← Rd(3..0) keines 1 1001010d dddd0010
BSET s Flag im SREG setzen SREG(s) ← 1 SREG(s) 1 10010100 0sss1000
BCLR s Flag im SREG löschen SREG(s) ← 0 SREG(s) 1 10010100 1sss1000
BST Rr,b Bit von Register nach T speichern T ← Rr(b) T 1 1111101d dddd0bbb
BLD Rd,b Bit von T nach Register laden Rd(b) ← T keines 1 1111100d dddd0bbb
SEC Carry setzen C ← 1 C 1 BSET 0
CLC Carry löschen C ← 0 C 1 BCLR 0
SEZ Zero-Flag setzen Z ← 1 Z 1 BSET 1
CLZ Zero-Flag löschen Z ← 0 Z 1 BCLR 1
SEN Negativ-Flag N setzen N ← 1 N 1 BSET 2
CLN Negativ-Flag N löschen N ← 0 N 1 BCLR 2
SEV Zweierkomplement-Überlauf setzen V ← 1 V 1 BSET 3
CLV Zweierkomplement-Overflow löschen V ← 0 V 1 BCLR 3
SES Vorzeichen Test-Flag setzen S ← 1 S 1 BSET 4
CLS Vorzeichen Test-Flag löschen S ← 0 S 1 BCLR 4
SEH Half-Carry-Flag setzen H ← 1 H 1 BSET 5
CLH Half-Carry-Flag löschen H ← 0 H 1 BCLR 5
SET T setzen T ← 1 T 1 BSET 6
CLT T löschen T ← 0 T 1 BCLR 6
SEI Globale Interrupt-Freigabe I ← 1 I 1 BSET 7
CLI Globale Interrupt-Sperre I ← 0 I 1 BCLR 7
Erläuterungen:
  1. T. = Anzahl CPU-Takte
  2. 8-Bit-Befehle mit Direktoperand sowie MULS sind auf die Register R16..R31 beschränkt
  3. 16-Bit-Arithmetikbefehle sind auf die Registerpaare R25:R24, R27:R26 (X), R29:R28 (Y) und R31:R30 (Z) beschränkt
  4. Offsets (zur Zeigermanipulation) sind auf 0..63 beschränkt
  5. Erweiterte MUL-Befehle sind auf die Register R16..R23 als Operanden beschränkt
  6. 16-Bit-Befehle funktionieren nur mit geraden Registern, MOVW mit R0..R30.
  7. Zeigerregister sind X, Y oder Z für LD und ST, hingegen nur Y oder Z für LDD und STD. Einfache Controller lassen nur Z zu. Alle indirekten Operationen verhalten sich undefiniert, wenn ein Register des Zeigerregisterpaars als Operand verwendet wird
  8. Bitweise I/O-Operationen gibt es nur im „unteren“ I/O-Bereich 0x00..0x1F (entsprechend Speicheradresse 0x20..0x3F)