Az Atmel AVR utasításkészlet az Atmel AVR mikrovezérlők gépi nyelve. Az AVR maga egy 8 bites RISC elvű, módosított Harvard-architektúrájú egychipes mikrovezérlő-család, amelyet az Atmel cég fejlesztett ki 1996-ban. Az AVR az első mikrovezérlők egyike, amelyben lapkára integrált flashmemóriát alkalmaztak a programok tárolására. Érdekes, hogy a processzor tervezése során nem követték szorosan a RISC tervezési elveket, például szokatlanul sok – 13 – és összetett címzési módot valósítottak meg,13 címzési mód: nyolcbites architektúrán. Ezt a mikrovezérlőkben történő felhasználás és a Harvard-architektúra indokolta.

Regiszterek A processzornak 32 8 bites általános célú regisztere van, amiket R0–R31-gyel jelölnek. Minden számtani és logikai művelet csak ezekkel a regiszterekkel végezhető; kizárólag a betöltő és tároló (load / store) utasítások képesek a RAM-ot elérni. Korlátozott számú utasítás képes 16 bites regiszterpárokon működni. A pár alacsonyabb számú, páros számmal jelölt regiszterei hordozzák az alacsonyabb helyértékű biteket. Az utolsó három regiszterpárt a processzor mutatóregiszterekként használja a memóriacímzésnél. Ezek külön jelölést is kaptak, az X (R27:R26), Y (R29:R28) és Z (R31:R30) betűkkel jelölik őket. Az Y és Z hat bites pozitív eltolással is használható.

A 8 bites műveletek körében csak az R16–R31 regiszterek használhatók közvetlen értékekkel, vagy a 16 bites ADIW és SBIW utasításokban az R25:R24–R31:R30 regiszterpárok – csak ezek az utasítások engedik meg közvetlen értékek használatát. A MUL (szorzás) művelet egyes változatai csak nyolc regiszterre vannak korlátozva, ezek csak az R16–R23 regisztereket használhatják.

Ezen a 32 általános célú regiszteren kívül a CPU-nak van néhány speciális célú regisztere: PC: 16- vagy 22 bites programszámláló SP: 8- vagy 16 bites veremmutató SREG: 8 bites állapotregiszter RAMPX, RAMPY, RAMPZ, RAMPD és EIND: 8 bites szegmensregiszterek, amelyek hozzáfűzhetők a 16 bites címekhez, ezáltal 24 bites címet alkotva; csak a nagyobb címterű változatokban állnak rendelkezésre

Az állapotregiszter bitjei a következők: C átvitelbit, összeadásnál és kivonásnál is Z zéró bit – nulla-jelzőbit, értéke 1, ha egy művelet eredménye nulla N negatív jelzőbit – a megelőző számtani művelet eredményének legmagasabb helyértékű bitje V túlcsordulás jelzőbit – értéke 1, ha a megelőző műveletben kettes komplemensű túlcsordulás keletkezett S előjelbit. Az AVR-nél egyedüli módon ez mindig az N⊕V (N XOR V) értéke, és az összehasonlítás valódi előjelét mutatja H félátvitel (half carry, segédátvitel): belső átvitelbit a 4. bitről, az összeadásoknál keletkezik, a BCD aritmetika használja T bit copy – különleges bit-betöltő és -tároló utasítások használják I megszakítás-jelzőbit – értéke 1, ha a megszakítások engedélyezettek.

Címzés A következő címterek állnak rendelkezésre: az általános célú regiszterek sorszámukkal címezhetők (0–31), azonban azok az utasítások, melyek csak a regiszterkészlet egy részén működnek, nem hordozzák a teljes 5 bites értéket a be-/kimeneti regisztereknek van egy dedikált 6 bites címtartományuk, amelynek alsó része bit-címezhető; egyes processzorokban ezen a címtartományon kívüli I/O regiszterek is használhatók, ezeket „kiterjesztett I/O” regisztereknek hívják és kizárólag memóriába leképzett be-/kimenetként elérhetők az adat-címtartományban az adat-címtartományba beletartozik a 32 általános célú regiszter (a regiszterek le vannak képezve a címezhető adatmemória-tartományba); az összes be-/kimeneti regiszter, a be-/kimeneti címtéren keresztül elérhető I/O regisztereket is beleértve; és a teljes RAM; ez közvetlenül vagy közvetett (indirekt) módon címezhető az X, Y és Z mutatóregiszterekkel, szükség esetén a RAMPX, RAMPY és RAMPZ prefixekkel kiegészítve a programmemóriának (flashmemória) külön címtartománya van, 16 bites szavakként címezhető, a processzor innen tölti be a programutasításokat a konstans adatok felhozatala céljából a programmemória bájtonként címezhető a Z mutatóregiszter segítségével, amely szükség esetén a RAMPZ prefixet kaphatja egyes eszközökben az EEPROM a memóriába van leképezve; más eszközökben pedig közvetlenül nem címezhető, hanem csak cím- és vezérlési be-/kimeneti regisztereken keresztül elérhető az általános célú regiszterek, az állapotregiszter és néhány be-/kimeneti regiszter bitenként címezhető, ahol a 0. bit a legalacsonyabb, a 7. bit pedig a legmagasabb helyiértékű

Az első 64 be-/kimeneti regiszter elérhető mind az I/O címterületen, mind az adatterület címtartományán keresztül. Ezek tehát két különböző címmel rendelkeznek. Ezt a kettősséget úgy jelölik, hogy kiírják mindkét címet, ahol az első cím az I/O cím, a második pedig az adatcím zárójelben: "0x00 (0x20)" ... "0x3F (0x5F)".

A speciális célú regiszterek, a PC kivételével mind megcímezhetők I/O regiszterekként is. Példák: SREG (0x3F (0x5F)), SP (0x3E:0x3D (0x5E:0x5D)), EIND (0x3C (0x5C)) vagy RAMPZ (0x3B (0x5B)).

A tipikus ATmega memóriatérkép az alábbihoz hasonló elrendezésű lehet: adatcím I/O cím tartalom 0x0000 – 0x001f R0 – R31 regiszterek 0x0020 – 0x003f 0x00 – 0x1f I/O regiszterek (bitenként címezhető) 0x0040 – 0x005f 0x20 – 0x3f I/O regiszterek (nem bitenként címezhető) 0x0060 – 0x00ff kiterjesztett I/O regiszterek (kizárólag memóriába leképzett I/O céljára) 0x0100 – RAMEND belső SRAM ahol a RAMEND az utolsó elérhető RAM cím. Egyes modellekben, amelyekből hiányzik a kiterjesztett I/O, a memória a 0x0060 címen kezdődhet. Az utasítások időzítése A számtani műveletek csak az R0-R31 regisztereken végezhetők, ezek operandusa nem lehet memóriarekesz, végrehajtásuk egy órajelciklus alatt történik, kivéve a szorzás és a szó-szélességű összeadás (ADIW és SBIW) utasításokat, amelyek végrehajtása két órajelciklus alatt történik.

A RAM és a be-/kimeneti címtér kizárólag regisztereken keresztül elérhető: csak regiszterbe való adatbetöltés vagy onnan való kiolvasás által kezelhető. Közvetett címzés lehetséges, opcionális utólagos növelő (postincrement), előzetesen csökkentő (predecrement) vagy állandó eltolással használt címzési módokkal, ami az X, Y, és Z regisztereken keresztül történhet. Minden RAM-hozzáférés két órajelciklust vesz igénybe. A regiszterek közötti adatmozgatás és a be-/kimenet egy ciklus alatt történik. Nyolc vagy tizenhat bites adat mozgatása a regiszterek között, vagy állandó betöltése regiszterbe szintén egy ciklust igényel. A programmemória (LPM) olvasása három ciklus alatt történik. Utasításlista Minden utasítás 16 bites, kivéve azokat, amelyek 16 vagy 22 bites címet tartalmaznak, ezek két szót foglalnak el (a processzor 8 bites, 8 bit egy bájt, egy szó 16 bites).

A feltételes elágazásoknak két típusa van: ugrás címre és szökkenés (átugrás, skip). A feltételes elágazások (BRxx) ellenőrizhetik az ALU állapotjelző bitjeit és a kiértékelés eredményeképpen elugorhatnak a megadott címre (a végrehajtás a megadott címen folytatódik). A szökkenések (SBxx) ellenőrzik egy regiszter vagy I/O-regiszter tetszőleges bitjének állapotát és átugorhatják a következő utasítást, ha a kiértékelés eredménye igaz.

Jelölések a lenti táblázatban: s – bitszám az állapotregiszterben (0 = C, 1 = Z, stb., lásd fent a listát a regisztereknél) b – bitszám egy általános célú vagy be-/kimeneti regiszterben (0 = legalacsonyabb helyiértékű, 7 = legmagasabb helyiértékű bit) K6 – 6 bites közvetlen előjel nélküli állandó (értékkészlete: 0–63) K8 – 8 bites közvetlen állandó; mivel ez csak 8 bites műveletekben fordul elő, az előjele lényegtelen IO5 – 5 bites I/O cím, amely lefedi az I/O címtartomány egy részét, azaz az alsó részt; értékkészlete: 0-31. IO6 – 6 bites I/O cím, amely lefedi a teljes I/O címtartományt; értékkészlete: 0–63. D16 – 16 bites adatcím, tartománya 64 KiB; a 64 KiB-nál nagyobb címtartományú típusokban ehhez járul (ennek prefixe) a RAMPD szegmensregiszter P22 – 22 bites programcím, címtartománya 222 16 bites szó (azaz 8 MiB) δD6 – 6 bites előjel nélküli eltolás az Y vagy Z mutatóban tárolt adatcímhez képest δP7 és δP12 – 7 vagy 12 bites előjeles eltolás a programszámlálóban tárolt programcímhez képest

+ Az AVR utasításkészlet számtani bit és egyéb adatmozgatás ugrás elágazás eljáráshívás ADD Rd, Rr ADC Rd, Rr ADIW Rd+1:Rd, K6

SUB Rd, Rr SUBI Rd, K8 SBC Rd, Rr SBCI Rd, K8 SBIW Rd+1:Rd, K6

INC Rd DEC Rd

AND Rd, Rr ANDI Rd, K8 OR Rd, Rr ORI Rd, K8 EOR Rd, Rr

COM Rd NEG Rd CP Rd, Rr CPC Rd, Rr CPI Rd, K8 SWAP Rd

LSR Rd

ROR Rd ASR Rd

MUL Rd, Rr MULS Rd, Rr MULSU Rd, Rr FMUL Rd, Rr FMULS Rd, Rr FMULSU Rd, Rr BSET s BCLR s SBI IO5, b CBI IO5, b BST Rd, b BLD Rd, b

NOP BREAK SLEEP WDR MOV Rd, Rr MOVW Rd+1:Rd, Rr+1:Rr

IN Rd, IO6 OUT IO6, Rr

PUSH Rr POP Rr

LDI Rd, K8 LDS Rd, D16

LD Rd, X LD Rd, -X LD Rd, X+

LDD Rd, Y+δD6 LD Rd, -Y LD Rd, Y+

LDD Rd, Z+δD6 LD Rd, -Z LD Rd, Z+

STS D16, Rr

ST X, Rr ST -X, Rr ST X+, Rr

STD Y+δD6, Rr ST -Y, Rr ST Y+, Rr

STD Z+δD6, Rr ST -Z, Rr ST Z+, Rr

LPM LPM Rd, Z LPM Rd, Z+ ELPM ELPM Rd, Z ELPM Rd, Z+

SPM RJMP δP12 IJMP EIJMP JMP P22 CPSE Rd, Rr

SBRC Rr, b SBRS Rr, b

SBIC IO5, b SBIS IO5, b

BRBC s, δP7 BRBS s, δP7 RCALL δP12 ICALL EICALL CALL P22

RET RETI

Utasításkészletek a különböző modellekben Az Atmel AVR vezérlők különböző modelljei nem rendelkeznek feltétlenül a teljes utasításkészlettel. Ez főleg a szorzó utasításokat, kiterjesztett betöltő/ugró/eljáráshívó utasításokat, távoli ugrásokat és a teljesítményt (fogyasztást) szabályzó utasításokat érinti.