Atmel AVR utasításkészlet
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ú egycsipes 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,[1] nyolcbites architektúrán. Ezt a mikrovezérlőkben történő felhasználás és a Harvard-architektúra indokolta.
Regiszterek
[szerkesztés]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): ez egy 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
[szerkeszté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, amelyek 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 az 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
[szerkesztés]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 csak 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
[szerkesztés]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
számtani | bit és egyéb | adatmozgatás | ugrás | elágazás | eljáráshívás |
---|---|---|---|---|---|
ADD Rd, Rr ADC Rd, Rr COM Rd MUL Rd, Rr |
BSET s BCLR s |
MOV Rd, Rr MOVW Rd+1:Rd, Rr+1:Rr |
RJMP δP12 IJMP |
CPSE Rd, Rr
|
RCALL δP12 ICALL |
Utasításkészletek a különböző modellekben
[szerkesztés]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.
család | tagok | számtani | elágazás | adatmozgatás | bitműveletek |
---|---|---|---|---|---|
Minimal Core, minimális mag-kiépítés |
AT90S1200 ATtiny11 ATtiny12 ATtiny15 ATtiny28 |
ADD ADC SUB SUBI SBC SBCI AND ANDI OR ORI EOR COM NEG SBR CBR INC DEC TST CLR SER |
RJMP RCALL RET RETI CPSE CP CPC CPI SBRC SBRS SBIC SBIS BRBS BRBC BREQ BRNE BRCS BRCC BRSH BRLO BRMI BRPL BRGE BRLT BRHS BRHC BRTS BRTC BRVS BRVC BRIE BRID |
LD ST MOV LDI IN OUT LPM (hiányzik az AT90S1200-ből) |
SBI CBI LSL LSR ROL ROR ASR SWAP BSET BCLR BST BLD SEC CLC SEN CLN SEZ CLZ SEI CLI SES CLS SEV CLV SET CLT SEH CLH NOP SLEEP WDR |
Classic Core, klasszikus mag, max. 8K programméret |
AT90S2313 AT90S2323 ATtiny22 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90C8534 AT90S8535 ATtiny26 |
új utasítások: ADIW SBIW |
új utasítások: IJMP ICALL |
új utasítások: LD (9 mód) LDD LDS ST (9 mód) STD STS PUSH POP |
(nincs új utasítás) |
Classic Core, klasszikus mag, max. 128K-ig |
ATmega103 ATmega603 AT43USB320 AT76C711 |
(nincs új utasítás) | új utasítások: JMP CALL |
új utasítások: ELPM |
(nincs új utasítás) |
Enhanced Core, továbbfejlesztett mag, max. 8K programméret |
ATmega8 ATmega83 ATmega85 ATmega8515 |
új utasítások: MUL MULS MULSU FMUL FMULS FMULSU |
(nincs új utasítás) | új utasítások: MOVW LPM (3 mód) SPM |
(nincs új utasítás) |
Enhanced Core, továbbfejlesztett mag, max. 128K programméret |
ATmega16 ATmega161 ATmega163 ATmega32 ATmega323 ATmega64 ATmega128 AT43USB355 AT94 (FPSLIC) AT90CAN sorozat AT90PWM sorozat ATmega48 ATmega88 ATmega168 ATmega162 ATtiny13 ATtiny25 ATtiny45 ATtiny85 ATtiny2313 ATmega164 ATmega324 ATmega328 ATmega644 ATmega165 ATmega169 ATmega325 ATmega3250 ATmega645 ATmega6450 ATmega406 |
(nincs új utasítás) | (nincs új utasítás) | (nincs új utasítás) | új utasítások: BREAK |
Enhanced Core, max. 4M programméret |
ATmega640 ATmega1280 ATmega1281 ATmega2560 ATmega2561 |
(nincs új utasítás) | új utasítások: EIJMP EICALL |
(nincs új utasítás) | (nincs új utasítás) |
XMEGA mag | ATxmega sorozat | új utasítások: DES[2][3] |
(nincs új utasítás) | új utasítások: (második kiadású magok - AU,B,C jelű egységek) XCH LAS LAC LAT |
(nincs új utasítás) |
Redukált mag | ATtiny10 ATtiny9 ATtiny5 ATtiny4 |
(megegyezik a minimális maggal, kivéve a redukált CPU regiszterkészlet) | (megegyezik a klasszikus maggal max. 8K-ig, kivéve a redukált CPU regiszterkészlet) | megegyezik a klasszikus maggal max. 8K-ig, a következő kivételekkel: LPM (eltávolítva) LDD (eltávolítva) STD (eltávolítva) LD (eléri a programmemóriát is) LDS (különböző bitminták) STS (különböző bitminták) Redukált CPU regiszterkészlet |
(megegyezik a továbbfejlesztett maggal max. 128K-ig, kivéve a redukált CPU regiszterkészlet) |
Utasításkódolás
[szerkesztés]A bitek jelölése:
- rrrrr = forrásregiszter
- rrrr = forrás-regiszterpár
- ddddd = célregiszter
- dddd = cél-regiszterpár
- hhhh = magas regiszter, R16–R31
- pp = regiszterpár, W, X, Y vagy Z
- y = Y/Z regiszterpár bit (0=Z, 1=Y)
- s = tárolás/betöltés bit (0=betölt,load, 1=tárol,store)
- c = eljáráshívás/ugrás (0=ugrás,jump, 1=hívás,call)
- aaaaaa = I/O terület cím
- aaaaa = I/O terület cím (csak az első 32)
- bbb = bit szám
- B = bit érték
- kkkkkk = 6 bites előjel nélküli állandó
- KKKKKKKK = 8 bites állandó, elosztott mezőkben
Az Atmel AVR sok elosztott mezőt használ, amelyekben a bitek nem folyamatosan helyezkednek el az utasításszóban. A legszélsőségesebb példák erre a betöltő/tároló utasítások 6 bites eltolással, amelyekben a 6 bites eltolás értéke három külön darabban található.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | utasítás |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | d d d d | r r r r | MOVW – regiszterpár mozgatása | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | d d d | r r r | Előjeles és tört szorzás (csak R16–R23) | |||||||
0 | 0 | 0 | 0 | 0 | 1 | r | d d d d d | r r r r | Kétoperandusú utasítások: CPC, SBC, ADD, CPSE, CP, SUB. ADC, AND, EOR, OR, MOV | |||||||
0 | 0 | 0 | 0 | 1 | ||||||||||||
0 | 0 | 0 | 1 | |||||||||||||
0 | 0 | 1 | 0 | |||||||||||||
0 | 0 | 1 | 1 | K K K K | h h h h | K K K K | Regiszter utasítások közvetlen értékkel (register-immediate): CPI, SBCI, SUBI, ORI, ANDI | |||||||||
0 | 1 | |||||||||||||||
1 | 0 | k | 0 | k k | s | d d d d d | y | k k k | LDD/STD a Z+k vagy Y+k címre | |||||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d d | LD/ST egyéb | ||||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 0 | Egyoperandusú utasítások (COM, NEG, SWAP, stb.) | |||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B̅ | b b b | 1 | 0 | 0 | 0 | SEx/CLx – állapotregiszter bit törlése, beállítása | ||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | Egyéb utasítások (RET, RETI, SLEEP, stb.) | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | c | 0 | 0 | 0 | 1 | 0 | 0 | 1 | Közvetet (indirect) ugrás/hívás a Z vagy EIND:Z címmel | |
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d d | 1 | 0 | 1 | 0 | DEC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | k k k k | 1 | 0 | 1 | 1 | DES k-adik kör[2][3] | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | k k k k k | 1 | 1 | c | k | JMP/CALL abs22 | ||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | k k | p p | k k k k | ADIW/SBIW Rp,uimm6 | ||||||
1 | 0 | 0 | 1 | 1 | 0 | B | a a a a a | b b b | I/O címterület bitműveletek | |||||||
1 | 0 | 0 | 1 | 1 | 1 | r | d d d d d | r r r r | MUL – szorzás, előjel nélküli: R1:R0 = Rr×Rd | |||||||
1 | 0 | k | 0 | k k | s | d d d d d | y | k k k | Lásd <kód>10k0</kód> fent (LDD/STD) | |||||||
1 | 0 | 1 | 1 | s | a a | d d d d d | a a a a | OUT/IN az I/O területen | ||||||||
1 | 1 | 0 | c | 12 bites előjeles eltolás (ofszet) | Relatív ugrás/eljáráshívás a PC ± 2×simm12 címmel | |||||||||||
1 | 1 | 1 | 0 | K K K K | h h h h | K K K K | LDI Rh,K | |||||||||
1 | 1 | 1 | 1 | 0 | B̅ | 7 bites előjeles eltolás (ofszet) | b b b | Feltételes elágazás az állapotregiszter bitje szerint | ||||||||
1 | 1 | 1 | 1 | 1 | 0 | s | d d d d d | 0 | b b b | BLD/BST – regiszterbit a STATUS.T-be | ||||||
1 | 1 | 1 | 1 | 1 | 1 | B | d d d d d | 0 | b b b | SBRC/SBRS – szökkenés (egy utasítás átugrása), ha a regiszter bitje egyenlő B-vel |
Jegyzetek
[szerkesztés]- ↑ 13 címzési mód: ATMEL® 8-bit AVR® Instruction Set (angol nyelven) (pdf) pp. 3..9. Atmel, 2002
- ↑ a b Az XMEGA processzor beépített hardveres DES gyorsítóutasítása, amely az algoritmus egy körét hajtja végre; az R0-R15 regisztereket használja.
- ↑ a b AVR1317: Using the XMEGA built-in DES accelerator (angol nyelven) (pdf) pp. 5/7. Atmel, 2008. (Hozzáférés: 2014)
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben az Atmel AVR instruction set című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Források
[szerkesztés]- ATMEL® 8-bit AVR® Instruction Set (angol nyelven) (pdf) pp. 1–149. Atmel, 2002. (Hozzáférés: 2014)
- Alf-Egil Bogen, Vegard Wollan: AVR Enhanced RISC Microcontrollers (angol nyelven) (pdf) pp. 3. ATMEL Corporation, 1997. december 17. (Hozzáférés: 2014)
További információk
[szerkesztés]- Wikibooks: "Embedded Systems/Atmel AVR", angolul
- GNU Development Environment Archiválva 2005. július 14-i dátummal a Wayback Machine-ben
- Programming the AVR microcontroller with GCC by Guido Socher
- A GNU Development Environment for the AVR Microcontroller Archiválva 2005. július 14-i dátummal a Wayback Machine-ben by Rich Neswold
- AVR opciók a GCC-AVR-ben
- Atmel AVR utasításkészlet, PDF (149 oldal), angolul