====== AVR-Assembler ====== ===== Befehlsübersicht ===== ^ Befehl ^ Art ^ Typ ^ 1. Operand ^ 2. Operand ^ Ziel ^ kurze Beschreibung ^ Beispiel ^ | ADC | Byte | rechnen |r0-31 | r0-31 | 1. Operand | addiert 2 Register + Carry | adc r3,r1 | | ADD | Byte | rechnen | r0-31 | r0-31 | 1. Operand | addiert 2 Register ohne Carry | add r1,r2 | | ADIW | Wort | rechnen | r24,26,28,30 | Konst. 0-63 | 1. Operand | addiert Wort mit Konstante (0-63) | adiw r25:24,1 ; addiere 1 zu r25:r24 | | AND | Byte | Logik | r0-31 | r0-31 | 1. Operand | bitweise UND von 2 Registern | and r2, r16 | | ANDI | Byte | Logik | r16-31 | Konst. 0-255 | 1. Operand | bitweise UND mit Konstante | andi r17,$0F | | @#FF8888: ASR | Byte (S) | rechnen | r0-31 | | 1. Operand, Carry | Vorzeichenbeghaftete Variable /2 teilen | asr r16 | | @#FFFFCC: BCLR | Bit | Logik | Konst. 0-7 | | SREG | einzelnes Bit in SREG löschen | bclr 7; Disable interrupts | | @#FFFFCC: BLD | Bit | Logik | r0-31,b0-7 | | r0-31,b0-7 | Lade T-Flag in Register,Bit | bld r0, 4 | | @#CCCCFF: BRBC | Bit | Abfrage | 0-7 | Sprungmarke (-64-+63) | | Springt zu Sprungmarke, wenn Bit in SREG = 0 | brbc 1,noteq | | @#CCCCFF: BRBS | Bit | Abfrage | 0-7 | Sprungmarke (-64-+63) | | Springt zu Sprungmarke, wenn Bit in SREG = 1 | brbs 6, bitset | | @#CCCCFF: BRCC | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Carry = 0 | brcc nocarry | | @#CCCCFF: BRCS | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Carry = 1 | brcs carry | | @#FF8888: BREAK | | Debug | | | | hält CPU an (zum Debuggen) | | | @#CCFFCC: BREQ | Byte | Vergleich | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn gleich (Z=1) | breq equal | | @#FF8888: BRGE | Byte (S) | Vergleich | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn größer oder gleich (vorzeichenbehaftete Variable) (S=0)| brge greateq | | @#CCCCFF: BRHC | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Half Carry = 0 | brhc hclear | | @#CCCCFF: BRHS | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Half Carry = 1 | brhs hset | | @#CCCCFF: BRID | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Global Interrupts deaktiviert | brid intdis | | @#CCCCFF: BRIE | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Global Interrupts aktiviert | brie inten | | @#CCFFCC: BRLO | Byte | Vergleich | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn kleiner | brlo loop | | @#FF8888: BRLT | Byte (S) | Vergleich | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn kleiner (Vorzeichenbehaftet) | brlt less | | @#FF8888: BRMI | Byte (S) | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Negativ | brmi negative | | @#CCFFCC: BRNE | Byte | Vergleich | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn ungleich | brne loop | | @#FF8888: BRPL | Byte (S) | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Positiv | brpl positive | | @#CCFFCC: BRSH | Byte | Vergleich | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn gleich oder größer| brsh highsm | | @#CCCCFF: BRTC | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn T-Flag = 0 | brtc tclear | | @#CCCCFF: BRTS | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn T-Flag = 1 | brts tset | | @#CCCCFF: BRVC | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Overflow = 0 | brvc noover | | @#CCCCFF: BRVS | Bit | Abfrage | Sprungmarke (-64-+63) | | | Springt zu Sprungmarke, wenn Overflow = 1 | brvs overfl | | @#CCCCFF: BSET | Bit | Logik | 0-7 | | SREG | einzelnes Bit in SREG setzen | bset 6 ; setze T flag | | @#CCCCFF: BST | Bit | Logik | r0-31,b0-7 | | T-Flag | Lade Bit aus Register in T-Flag | bst r1,2 ; speichere bit 2 von r1 in T flag | | CALL | | Unter-\\ programm-\\ aufruf | Sprungmarke (0-64k) | | | Unterprogrammaufruf (lang) | call check ; rufe Unterprogramm auf | | CBI | Bit | Ausgabe | r0-31,b0-7 | | IO-Pin | Pin ausschalten | cbi $12, 7 ; nulle bit 7 in Port D | | CBR | Byte | Logik | r16-31 | Konst. 0-255 | 1. Operand | Bits in Register löschen (logisches AND)| cbr r18, 1 ; nulle bit 0 in r18 | | @#CCCCFF: CLC | Bit | Logik | | | Carry-Flag | lösche Carry-Flag (=0) | clc | | @#CCCCFF: CLH | Bit | Logik | | | HalfCarry-Flag | lösche HalfCarry-Flag (=0) | clh | | CLI | Bit | Logik | | | GIE | Interrupts global deaktivieren | cli | | @#CCCCFF: CLN | Bit | Logik | | | Negativ-Flag = 0 | lösche Negativ-Flag in SREG | cln | | CLR | Byte | Logik | r0-31 | | 1. Operand | leere Register (=0) | clr r18 | | @#CCCCFF: CLS | Bit | Logik | | | Signed-Flag = 0 | lösche Signed-Flag in SREG | cls | | CLT | Bit | Logik | | | T-Flag = 0 | lösche T-Flag in SREG | clt | | @#CCCCFF: CLV | Bit | Logik | | | Overflow-Flag = 0 | lösche Overflow-Flag in SREG | clv | | @#CCCCFF: CLZ | Bit | Logik | | | Zero-Flag = 0 | lösche Zero-Flag in SREG | clz | | COM | Byte | Logik | r0-31 | | 1. Operand | Einer Komplement | com r4 | | CP | Byte | Vergleich | r0-31 | r0-31 | SREG | Vergleich; hiernach können alle relativen Sprüng(BR*) ausgeführt werde cp r4,r19 | | CPC | Wort | Vergleich | r0-31 | r0-31 | SREG | Vergleich unter Beachtung des Carry-Bit | cp r2,r0 ; vergleiche low byte;cpc r3,r1 ; vergleiche high byte;brne noteq ; springe wenn ungleich | | CPI | Byte | Vergleich | r16-31 | Konst. 0-255 | SREG | Vergleich mit Konstante | cpi r19,3 ; vergleiche r19 mit 3 | | CPSE | Byte | Vergleich | r0-31 | r0-31 | | Vergleicht 2 Register, überspringt nächsten Befehl, wenn gleic(=) | cpse r4,r0 ; vergleiche r4 mit r0 | | DEC | Byte | Zählen | r0-31 | | 1. Operand | -1 | dec r17 | | @#FF8888: DES | 8Byte | Encrypt | Konst. 0-15 | | | Verschlüsseln? | | @#FF8888: EICALL | | | | | | vermutlich bei 8Bit-AVRs nicht verfügbar| | | @#FF8888: EIJMP | | | | | | vermutlich bei 8Bit-AVRs nicht verfügbar| | | @#FF8888: ELPM | | | | | | vermutlich bei 8Bit-AVRs nicht verfügbar| | | EOR | Byte | Logik | r0-31 | r0-31 | 1. Operand | logisches EOR | eor r0,r22 | | FMUL | Bytes | rechnen | r16-23 | r16-23 | r1:r0 | multipliziert 2 Register und schibt Ergebnis 1 nach Links | | | @#FF8888: FMULS | Bytes (S) | rechnen | r16-23 | r16-23 | r1:r0 | multipliziert 2 Register (vorzeichenbehaftet) und schibt Ergebnis 1 nach Links | | | @#FF8888: FMULSU | Bytes (S) | rechnen | r16-23 | r16-23 | r1:r0 | multipliziert 2 Register (1 vorzeichenbehaftet, 1 nicht vorzeichenbehaftet) und schibt Ergebnis 1 nach Links | | | @#FF8888: ICALL | | Unter-\\ programm-\\ aufruf | Z-Pointer | | | Unterprogrammaufruf mit Z-Pointer (vermutlich bei 8Bit-AVRs nicht verfügbar)| icall ; Call routine pointed to by r31:r30 | | @#FF8888: IJMP | | Sprung | Z-Pointer | | | indirekter Sprung mit Z-Pointer (vermutlich bei 8Bit-AVRs nicht verfügbar) | ijmp | | IN | Byte | Eingabe | r0-31 | A0-63 | 1. Operand | I/O (Ports, Timer, Konfig-Regsiter, etc) in Register laden | in r25,$16 ; lese Port B | | INC | Byte | Zählen | r0-31 | | 1. Operand | +1 | inc r17 | | JMP | | Sprung | Sprungmarke (0-4M) | | | Sprung an Sprungmarke (lang) | jmp farplc | | LD | Byte | laden | r0-31 | Pointer (X,Y,Z) | 1. Operand | lade Byte von Pointeradresse in Register | ld r0,X; ld r0,X+; ld r0,-X | | LDI | Byte | laden | r16-31 | Konst. 0-255 | 1. Operand | lade Konstante in Register | ldi r30,$F0 | | LDS | Byte | laden | r0-31 | Konst. 0-65535 | 1. Operand | lade aus gesamtem Speicherbereich in Register | | | LPM | Byte | laden | r0-31 | Z-Pointer | 1. Operand | lade mit Z-Pointer Daten aus Programmspeicher | ldi ZH, high(Table_1<<1) ; Initialize Z pointer;ldi ZL, low(Table_1<<1);lpm r16, Z ; Load constant from program | | LSL | Byte | Logik | r0-31 | | 1. Operand | schiebt Bits in Register um 1 nach links, Bit7 fällt in C-Flag, Bit0 wird 0| lsl r0 ; Multipliziere r0 mit 2 | | LSR | Byte | Logik | r0-31 | | 1. Operand | schiebt Bits in Register um 1 nach rechts, Bit0 fällt in C-Flag, Bit7 wird 0| lsr r0 ; teile r0 durch 2 | | MOV | Byte | kopieren | r0-31 | r0-31 | 1. Operand | kopiert Register | mov r16,r0 ; kopiere r0 nach r16 | | MOVW | Wort | kopieren | dr {0,2,...,30} | dr {0,2,...,30} | 1. Operand | kopiert Registerpaar | movw r17:16,r1:r0 ; Copy r1:r0 to r17:r16 | | MUL | Bytes | rechnen | r0-31 | r0-31 | r1:r0 | multipliziert 2 Bytes ohne Vorzeichen, Ergebnis in r1:r0 | mul r5,r4 ; multipliziere ohne Vorzeichen r5 and r4 | | @#FF8888: MULS | Bytes (S) | rechnen | r0-31 | r0-31 | r1:r0 | multipliziert 2 Bytes mit Vorzeichen, Ergebnis in r1:r0 | muls r5,r4 ; multipliziere mit Vorzeichen r5 and r4 | | @#FF8888: MULSU | Bytes (S) | rechnen | r0-31 | r0-31 | r1:r0 | multipliziert 1 Byte mit Vorzeichen mit einem Byte ohne Vorzeichen, Ergebnis in r1:r0 | | | @#FF8888: NEG | Bytes | Logik | r0-31 | | 1. Operand | Zweierkompliment | | | NOP | | | | | | warte 1 Takt | nop ; tue nichts | | OR | Bytes | Logik | r0-31 | r0-31 | 1. Operand | Logisches OR mit Register | or r15,r16 ; bitweises OR | | ORI | Bytes | Logik | r0-31 | Konst. 0-255 | 1. Operand | Logisches OR mit Konstante | or r15,$25 ; bitweises OR | | OUT | Bytes | Ausgabe | A0-63 | r0-31 | 1. Operand | Ausgabe des Registerinhalts auf IO (Ports, Timer, Konfig-Regsiter, etc) | out $18,r16 ; r16 auf PORTB ausgeben | | POP | Bytes | kopieren | r0-31 | | | Byte aus Stack in Register laden | push r13 ; Save r13 on the stack;...;pop r13 ; Restore r13 | | PUSH | Bytes | kopieren | r0-31 | | STACK | Byte in Stack sichern | push r13 ; Save r13 on the stack;...;pop r13 ; Restore r13 | | RCALL | | Unter-\\ programm-\\ aufruf | Sprungmarke (-2k-+2k) | | | Unterprogrammaufruf (kurz) | rcall routine | | RET | | Unter-\\ programm-\\ aufruf | | | | Rückkehr aus Unterprogramm (muss am Ende eines Unterprogramms stehen, welches mit (r)call aufgerufen wird)| ret ; zurück | | RETI | | Unter-\\ programm-\\ aufruf | | | | Rückkehr aus Interrupt (muss am Ende der Interrupt-Routine stehen)| reti ; weiter im Programm | | RJMP | | Sprung | Sprungmarke (-2k-+2k) | | | Sprung an Sprungmarke (kurz) | rjmp woanders | | ROL | Byte | Logik | r0-31 | | 1. Operand | schiebt Bits in Register 1 nach links durch Carry (Carry in Bit0, Bit7 in Carry) | rol r19 | | ROR | Byte | Logik | r0-31 | | 1. Operand | schiebt Bits in Register 1 nach rechts durch Carry (Carry in Bit7, Bit0 in Carry) | ror r19 | | SBC | Byte | rechnen | r0-31 | r0-31 | 1. Operand | Subtraktion mit Carry | sub r2,r0 ; Subtract low byte;sbc r3,r1 ; Subtract with carry high byte | | SBR | Byte | Logik | r16-31 | Konst. 0-255 | 1. Operand | Bits in Register setzen (logisches ORI) | sbr r18, 1 ; setze bit 0 in r18 | | SBRC | Bit | Vergleich | r0-31,b0-7 | | | überspringe nächsten Befehl, wenn Bit in Register = | sbrc r0,7 ; springe, wenn bit7 in r0 =0 ist | | SBRS | Bit | Vergleich | r0-31,b0-7 | | | überspringe nächsten Befehl, wenn Bit in Register = | sbrc r0,7 ; springe, wenn bit7 in r0 =1 ist | | @#CCCCFF: SEC | Bit | Logik | | | | Setze Carry-Flag | sec ; setze Carry-Flag | | @#CCCCFF: SEH | Bit | Logik | | | | Setze HalfCarry-Flag | seh ; setze HalfCarry-Flag | | SBI | Bit | Ausgabe | A0-31,b0-7 | | 1. Operand | setze Bit in I/O-Register | sbi PORTB,0 ; schalte pin0 von PORTB ein | | SBCI | Byte | rechnen | r16-31 | Konst. 0-255 | 1. Operand | substrahiere Konstante mit Carry (von Register) | subi r16,$23 ; substrahiere LOW-Byte; sbci r17,$4F ; Substrahiere mit Carry HIGH-Byte | | SBIC | Bit | Vergleich | A0-31,b0-7 | | | überspringe nächsten Befehl, wenn Bit in I/O-Register = | sbic $1C,1 ; überspringe nächsten Befehl, wenn EEWE = 0 | | SBIS | Bit | Vergleich | A0-31,b0-7 | | | überspringe nächsten Befehl, wenn Bit in I/O-Register = | sbic PORTB,0 ; überspringe nächsten Befehl, wenn PORTB,0 = 1 | | SBIW | Wort | rechnen | r24,26,28,30 | Konst. 0-63 | 1. Operand | substrahiere Konstante von Wort | sbiw YH:YL,63 ; Subtrahiere 63 vom Y Pointer(r29:r28) | | SEI | Bit | Logik | | | GIE | setze globales Interrupt-Flag | sei ; Interrupts erlauben | | @#CCCCFF: SEN | Bit | Logik | | | | setze Negativ-Flag | | | SER | Byte | Logik | r16-31 | | 1. Operand | setze alle Bits im Register | ser r17 ; r17 = 255 | | @#CCCCFF: SES | Bit | Logik | | | | setze Signed-Flag | | | @#CCCCFF: SET | Bit | Logik | | | | setze T-Flag | | | @#CCCCFF: SEV | Bit | Logik | | | | setze Overflow-Flag | | | @#CCCCFF: SEZ | Bit | Logik | | | | setze Zero-Flag | | | @#FFFFCC: SLEEP | | | | | | versetzt µC in Schlaf-Modus | | | @#FF8888: SPM | Byte | speichern | | | | Daten in Programmspeicher schreiben | | | ST | Byte | sichern | r0-31 | | SRAM | Daten mit Pointer in SRAM speichern | st X,r17; stX+,r17; st-X,r17 | | STS | Byte | sichern | r16-31 | Konst. 0-65535 | data SPace / SRAM | Register in SRAM speichern | sts 64,r1 ; speichere r1 in SRAM-Adresse 64 | | SUB | Byte | rechnen | r0-31 | r0-31 | 1. Operand | subtrahiere ohne Carry | sub r13,r12 ; substrahiere r12 von r13 | | SUBI | Byte | rechnen | r0-31 | Konst. 0-255 | 1. Operand | subtrahiere Konstante von Register | subi r13,$11 ; substrahiere $11 von r13 | | SWAP | Byte | Logik | r0-31 | | 1. Operand | tausche oberes und unteres Nibble vom Register | swap r13 | | TST | Byte | Vergleich | r0-31 | | | Teste auf Null oder Minus | tst r0 ; teste r0; breq zero ; springe, wenn r0=0 | | WDR | | Reset | | | Watchdog | Watchdog Timer zurücksetzen | wdr ; reset watchdog timer |