Instrukční soubor AVR-8bit
Seznam použitých symbolů
| Rd | osmibitový cílový registr číslo d |
| Rr | osmibitový zdrojový registr číslo r |
| SREG | stavový registr |
| R(d+1):R(d) | dvojice cílových registrů spojených do jednoho šestnáctibitového slova. Např. R31:R30, R1:R0 |
| R(r+1):R(r) | dvojice zdrojových registrů spojených do jednoho šestnáctibitového slova. Např. R31:R30, R1:R0 |
| X | šestnáctibitový registr sestavený z registrů R27:R26 |
| Y | šestnáctibitový registr sestavený z registrů R29:R28 |
| Z | šestnáctibitový registr sestavený z registrů R31:R30 |
| Rd.(3..0) | bity 0 až 3 z registru Rd |
| Rd.(7..4) | bity 7 až 4 z registru Rd |
| Rr.b | bit b ze zdrojového registru číslo r |
| K | přímá konstanta (je součástí instrukce) |
| k | přímá adresa (je součástí instrukce) |
| q | posunutí – displacement (je součástí instrukce) |
| SP | ukazatel zásobníku (Stack Pointer) |
| PC | čítač programu (Program Counter) |
| SREG.s | bit s ze stavového registru |
| C | příznakový bit v SREG (Carry Flag) |
| Z | příznakový bit v SREG (Zero Flag – indikuje nulový výsledek) |
| N | příznakový bit v SREG (Negative Flag – indikuje záporné číslo) |
| V | příznakový bit v SREG (Overflow Flag – indikuje přetečení u operací se znaménkem) |
| S | příznakový bit v SREG (indikuje N ⊕ V) |
| H | příznakový bit v SREG (Half Carry Flag – indikuje přenos mezi bity 3 a 4) |
| T | příznakový bit v SREG (Transfer bit – pro instrukce BLD, BST) |
| I | příznakový bit v SREG (Global Interrupt Enable/Disable Flag – globální povolení/zakázání přerušení) |
| ↕ | instrukce příznak mění |
| − | instrukce příznak nemění |
| ↕ s=x | instrukce příznak mění jen pokud s=x |
| 0 | příznak je nastaven na nulu (platí pouze pro pole příznaků) |
| 1 | příznak je nastaven na jedničku (platí pouze pro pole příznaků) |
| data[addr] | slabika datové paměti na adrese addr |
| code[addr] | slabika programové paměti na adrese addr |
| port[P] | vstupně/výstupní registr číslo P (port[P] ≡ data[P+32]) |
| port[P].b | bit b vstupně/výstupního registru číslo P |
| stack[addr] | slabika zásobníkové paměti na adrese addr |
| stack[SP+1] | vrchol zásobníku |
| ∨ | logický součet (OR) |
| Λ | logický součin (AND) |
| ⊕ | non-ekvivalence (XOR) |
| ~ | negace (NOT) |
| ← | přiřazení (R1←R0 znamená, že obsah registru R0 se zkopíruje do registru R1 a obsah registru R0 se nezmění) |
| ↔ | výměna obsahu (např. R1↔R0 znamená, že obsah registru R0 se přesune do registru R1 a obsah registru R1 se současně přesune do R0) |
| << | posun vlevo (a << b znamená posun a o b bitů vlevo) |
| 1/2/3 | alternativy v počtu taktů potřebných na vykonání instrukce v závislosti na podmínce. |
Aritmetické a logické instrukce
| Instrukce | Popis | Příznaky (SREG) | Počet taktů | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| I | T | H | S | V | N | Z | C | |||
| ADD Rd, Rr | Rd←Rd + Rr | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| ADC Rd, Rr | Rd←Rd + Rr + C | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| ADIW Rd, K | R(d+1):Rd←R(d+1):Rd + K | − | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | 2 |
| SUB Rd, Rr | Rd←Rd – Rr | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| SUBI Rd, K | Rd←Rd – K | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| SBC Rd, Rr | Rd←Rd – Rr – C | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| SBCI Rd, K | Rd←Rd – K – C | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| SBIW Rd, K | R(d+1):Rd←R(d+1):Rd – K | − | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | 2 |
| AND Rd, Rr | Rd←Rd Λ Rr | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| ANDI Rd, K | Rd←Rd Λ K | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| OR Rd, Rr | Rd←Rd ∨ Rr | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| ORI Rd, K | Rd←Rd ∨ K | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| EOR Rd, Rr | Rd←Rd ⊕ Rr | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| COM Rd | Rd← | − | − | − | ↕ | 0 | ↕ | ↕ | 1 | 1 |
| NEG Rd | Rd← 0 – Rd | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| SBR Rd, K | Rd←Rd ∨ K | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| CBR Rd, K | Rd←Rd Λ | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| INC Rd | Rd←Rd + 1 | − | − | − | ↕ | ↕ | ↕ | ↕ | − | 1 |
| DEC Rd | Rd←Rd – 1 | − | − | − | ↕ | ↕ | ↕ | ↕ | − | 1 |
| TST Rd | Rd←Rd Λ Rd | − | − | − | ↕ | 0 | ↕ | ↕ | − | 1 |
| CLR Rd | Rd←Rd ⊕ Rd | − | − | − | 0 | 0 | 0 | 1 | − | 1 |
| SER Rd | Rd←255 | − | − | − | − | − | − | − | − | 1 |
| CP Rd, Rr | Rd–Rr | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| CPC Rd, Rr | Rd – Rr – C | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| CPI Rd, K | Rd – K | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| MUL Rd, Rr | R1:R0←Rd×Rr (Rd a Rr bez znaménka) | − | − | − | − | − | − | ↕ | ↕ | 2 |
| MULS Rd, Rr | R1:R0←Rd×Rr (Rd a Rr se znaménkem) | − | − | − | − | − | − | ↕ | ↕ | 2 |
| MULSU Rd, Rr | R1:R0←Rd×Rr (Rd se znaménkem a Rr bez znaménka) | − | − | − | − | − | − | ↕ | ↕ | 2 |
| FMUL Rd, Rr | R1:R0←(Rd×Rr)<<1 | − | − | − | − | − | − | ↕ | ↕ | 2 |
| FMULS Rd, Rr | R1:R0←(Rd×Rr)<<1 (Rd a Rr se znaménkem) | − | − | − | − | − | − | ↕ | ↕ | 2 |
| FMULSU Rd, Rr | R1:R0←(Rd×Rr)<<1 (Rd se znaménkem a Rr bez znaménka) | − | − | − | − | − | − | ↕ | ↕ | 2 |
Přesuny a load–store instrukce
| Instrukce | Popis | Příznaky (SREG) | Počet taktů | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| I | T | H | S | V | N | Z | C | |||
| MOV Rd, Rr | Rd←Rr | − | − | − | − | − | − | − | − | 1 |
| MOVW Rd, Rr | R(d+1):Rd←R(r+1):Rr | − | − | − | − | − | − | − | − | 1 |
| LDI Rd, K | Rd←K | − | − | − | − | − | − | − | − | 1 |
| LDS Rd, k | Rd←data[k] | − | − | − | − | − | − | − | − | 2 |
| LD Rd, X | Rd←data[X] | − | − | − | − | − | − | − | − | 2 |
| LD Rd, X+ | Rd←data[X], X←X+1 | − | − | − | − | − | − | − | − | 2 |
| LD Rd, –X | X←X–1, Rd←data[X] | − | − | − | − | − | − | − | − | 2 |
| LD Rd, Y | Rd←data[Y] | − | − | − | − | − | − | − | − | 2 |
| LD Rd, Y+ | Rd←data[Y], Y←Y+1 | − | − | − | − | − | − | − | − | 2 |
| LD Rd, –Y | Y←Y–1, Rd←data[Y] | − | − | − | − | − | − | − | − | 2 |
| LDD Rd, Y+q | Rd←data[Y+q] | − | − | − | − | − | − | − | − | 2 |
| LD Rd, Z | Rd←data[Z] | − | − | − | − | − | − | − | − | 2 |
| LD Rd, Z+ | Rd←data[Z], Z←Z+1 | − | − | − | − | − | − | − | − | 2 |
| LD Rd, –Z | Z←Z–1, Rd←data[Z] | − | − | − | − | − | − | − | − | 2 |
| LDD Rd, Z+q | Rd←data[Z+q] | − | − | − | − | − | − | − | − | 2 |
| STS k, Rr | data[k]←Rr | − | − | − | − | − | − | − | − | 2 |
| ST X, Rr | data[X]←Rr | − | − | − | − | − | − | − | − | 2 |
| ST X+, Rr | data[X]←Rr, X←X+1 | − | − | − | − | − | − | − | − | 2 |
| ST –X, Rr | X←X–1, data[X]←Rr | − | − | − | − | − | − | − | − | 2 |
| ST Y, Rr | data[Y]←Rr | − | − | − | − | − | − | − | − | 2 |
| ST Y+, Rr | data[Y]←Rr, Y←Y+1 | − | − | − | − | − | − | − | − | 2 |
| ST –Y, Rr | Y←Y–1, data[Y]←Rr | − | − | − | − | − | − | − | − | 2 |
| STD Y+q, Rr | data[Y+q]←Rr | − | − | − | − | − | − | − | − | 2 |
| ST Z, Rr | data[Z]←Rr | − | − | − | − | − | − | − | − | 2 |
| ST Z+, Rr | data[Z]←Rr, Z←Z+1 | − | − | − | − | − | − | − | − | 2 |
| ST –Z, Rr | Z←Z–1, data[Z]←Rr | − | − | − | − | − | − | − | − | 2 |
| STD Z+q, Rr | data[Z+q]←Rr | − | − | − | − | − | − | − | − | 2 |
| LPM | R0←code[Z] | − | − | − | − | − | − | − | − | 3 |
| LPM Rd, Z | Rd←code[Z] | − | − | − | − | − | − | − | − | 3 |
| LPM Rd, Z+ | Rd←code[Z], Z←Z+1 | − | − | − | − | − | − | − | − | 3 |
| SPM | code[Z] ←R1:R0 | − | − | − | − | − | − | − | − | |
| IN Rd, P | Rd←port[P] | − | − | − | − | − | − | − | − | 1 |
| OUT P, Rd | port[P] ←Rd | − | − | − | − | − | − | − | − | 1 |
| PUSH Rr | stack[SP] ←Rr, SP←SP–1 | − | − | − | − | − | − | − | − | 2 |
| POP Rd | SP←SP+1, Rd← stack[SP] | − | − | − | − | − | − | − | − | 2 |
Skokové instrukce
| Instrukce | Popis | Příznaky (SREG) | Počet taktů | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| I | T | H | S | V | N | Z | C | |||
| RJMP k | Relativní skok (k=–2048 až 2047) + PC←PC k + 1 | − | − | − | − | − | − | − | − | 2 |
| IJMP | Nepřímý skok přes Z registr PC← Z | − | − | − | − | − | − | − | − | 2 |
| JMP k | Absolutní skok PC← k | − | − | − | − | − | − | − | − | 3 |
| RCALL k | Relativní skok do podprogramu(k=–2048 až 2047) + PC←PC k + 1 | − | − | − | − | − | − | − | − | 3 |
| ICALL | Nepřímý skok do podprogramu přes Z registr PC← Z | − | − | − | − | − | − | − | − | 3 |
| CALL k | Absolutní skok do podprogramu PC← k | − | − | − | − | − | − | − | − | 4 |
| RET | Návrat z podprogramu | − | − | − | − | − | − | − | − | 4 |
| RETI | Návrat z obsluhy přerušení | 1 | − | − | − | − | − | − | − | 4 |
| CPSE Rd, Rr | Porovnej a přeskoč následující instrukci pokud je Rd rovno Rr. Jestliže (Rd=Rr), pak PC← PC + 2 nebo 3, jinak PC← PC + 1 | − | − | − | − | − | − | − | − | 1/2/3 |
| SBRC Rr, b | Přeskoč následující instrukci pokud je bit b v registru Rr nulový. Jestliže (Rr.b=0), pak PC← PC + 2 nebo 3, jinak PC← PC + 1 | − | − | − | − | − | − | − | − | 1/2/3 |
| SBRS Rr, b | Přeskoč následující instrukci pokud je bit b v registru Rr roven jedné. Jestliže (Rr.b=1), pak PC← PC + 2 nebo 3, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2/3 |
| SBIC P, b | Přeskoč následující instrukci pokud je bit b ve vstupně/výstupním registru nulový. Jestliže (Port[P].b=0), pak PC← PC + 2 nebo 3, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2/3 |
| SBIS P, b | Přeskoč následující instrukcí pokud je bit b ve vstupně/výstupním registru roven jedné. Jestliže (Port[P].b=1), pak PC← PC + 2 nebo 3, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2/3 |
| BRBS s, k | Relativní skok pokud bit s v SREG registru je roven jedné. Jestliže (SREG.s=1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRBC s, k | Relativní skok pokud bit s v SREG registru je roven nule. Jestliže (SREG.s=0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BREQ k | Relativní skok pokud je rovno. Jestliže (Z=1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRNE k | Relativní skok pokud není rovno. Jestliže (Z=0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRCS k | Relativní skok pokud je přenos C roven jedné. Jestliže (C=1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRCC k | Relativní skok pokud je přenos C roven nule. Jestliže (C=0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRSH k | Relativní skok pokud je větší nebo rovno (bez znaménka). Jestliže (C=0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRLO k | Relativní skok pokud je menší (bez znaménka). Jestliže (C=1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRMI k | Relativní skok pokud je záporné. Jestliže (N=1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRPL k | Relativní skok pokud je kladné. Jestliže (N=0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRGE k | Relativní skok pokud je větší nebo rovno (se znaménkem). Jestliže (N ⊕ V =0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRLT k | Relativní skok pokud je menší (se znaménkem). Jestliže (N ⊕ V = 1), pak PC← PC + k + 1 jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRHS k | Relativní skok pokud je H rovno jedné. Jestliže (H = 1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRHC k | Relativní skok pokud je H rovno nule. Jestliže (H = 0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRTS k | Relativní skok pokud je T rovno jedné. Jestliže (T = 1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRTC k | Relativní skok pokud je T rovno nule. Jestliže (T = 0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRVS k | Relativní skok pokud je overflow V rovno jedné. Jestliže (V = 1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRVC k | Relativní skok pokud je overflow V rovno nule. Jestliže (V = 0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRIE k | Relativní skok pokud je povoleno přerušení. Jestliže (I = 1), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
| BRID k | Relativní skok pokud zakázáno přerušení. Jestliže (I = 0), pak PC← PC + k + 1, jinak PC← PC + 1. | − | − | − | − | − | − | − | − | 1/2 |
Bitové a testovací instrukce
| Instrukce | Popis | Příznaky (SREG) | Počet taktů | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| I | T | H | S | V | N | Z | C | |||
| LSL Rd | Logický posuv vlevo | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| LSR Rd | Logický posuv vpravo | − | − | − | ↕ | ↕ | 0 | ↕ | ↕ | 1 |
| ROL Rd | Rotace vlevo přes C ![]() | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| ROR Rd | Rotace vpravo přes C ![]() | − | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| ASR Rd | Aritmetický posuv vpravo | − | − | − | ↕ | ↕ | ↕ | ↕ | ↕ | 1 |
| SWAP Rd | Výměna dolní a horní čtveřice bitů Rd(3..0) ↔ Rd(7..4) | − | − | − | − | − | − | − | − | 1 |
| BSET s | Nastavení bitu s v SREG na 1 SREG.s←1 | s=7↕ | s=6↕ | s=5↕ | s=4↕ | s=3↕ | s=2↕ | s=1↕ | s=0↕ | 1 |
| BCLR s | Nastavení bitu s v SREG na 0 SREG.s←0 | s=7↕ | s=6↕ | s=5↕ | s=4↕ | s=3↕ | s=2↕ | s=1↕ | s=0↕ | 1 |
| SBI P, b | Nastavení bitu b ve vstupně/výstupním registru P na 1 port[P].b←1 | − | − | − | − | − | − | − | − | 2 |
| CBI P, b | Nastaví bit b v I/O registru P na 0 port[P].b←0 | − | − | − | − | − | − | − | − | 2 |
| BST Rr, b | Uloží bit b z registru Rr do bitu T v registru SREG T←Rr.b | − | ↕ | − | − | − | − | − | − | 1 |
| BLD Rd. b | Nastaví bit b v registru Rd podle bitu T v registru SREG Rd.b←T | − | − | − | − | − | − | − | − | 1 |
| SEI | I←1 | 1 | − | − | − | − | − | − | − | 1 |
| CLI | I←0 | 0 | − | − | − | − | − | − | − | 1 |
| SET | T←1 | − | 1 | − | − | − | − | − | − | 1 |
| CLT | T←0 | − | 0 | − | − | − | − | − | − | 1 |
| SEH | H←1 | − | − | 1 | − | − | − | − | − | 1 |
| CLH | H←0 | − | − | 0 | − | − | − | − | − | 1 |
| SES | S←1 | − | − | − | 1 | − | − | − | − | 1 |
| CLS | S←0 | − | − | − | 0 | − | − | − | − | 1 |
| SEV | V←1 | − | − | − | − | 1 | − | − | − | 1 |
| CLV | V←0 | − | − | − | − | 0 | − | − | − | 1 |
| SEN | N←1 | − | − | − | − | − | 1 | − | − | 1 |
| CLN | N←0 | − | − | − | − | − | 0 | − | − | 1 |
| SEZ | Z←1 | − | − | − | − | − | − | 1 | − | 1 |
| CLZ | Z←0 | − | − | − | − | − | − | 0 | − | 1 |
| SEC | C←1 | − | − | − | − | − | − | − | 1 | 1 |
| CLC | C←0 | − | − | − | − | − | − | − | 0 | 1 |
Speciální instrukce
| Příznaky (SREG) | Počet taktů | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| I | T | H | S | V | N | Z | C | |||
| NOP | Prázdná operace | − | − | − | − | − | − | − | − | 1 |
| SLEEP | Přechod do režimu nízké spotřeby | − | − | − | − | − | − | − | − | 1 |
| WDR | Nulování watchdogu | − | − | − | − | − | − | − | − | 1 |
| BREAK | Ladící instrukce | − | − | − | − | − | − | − | − | 1 |

