Atmel AVR utasításkészlet

A Wikipédiából, a szabad enciklopédiából

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:

  1. C átvitelbit, összeadásnál és kivonásnál is
  2. Z zéró bit – nulla-jelzőbit, értéke 1, ha egy művelet eredménye nulla
  3. N negatív jelzőbit – a megelőző számtani művelet eredményének legmagasabb helyértékű bitje
  4. V túlcsordulás jelzőbit – értéke 1, ha a megelőző műveletben kettes komplemensű túlcsordulás keletkezett
  5. 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
  6. 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
  7. T bit copy – különleges bit-betöltő és -tároló utasítások használják
  8. 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
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[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.

Eltérések az utasításkészletben
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ó.

Az Atmel AVR utasításkészlet áttekintése
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 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 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]

  1. 13 címzési mód: ATMEL® 8-bit AVR® Instruction Set (angol nyelven) (pdf) pp. 3..9. Atmel, 2002
  2. 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.
  3. 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]

További információk[szerkesztés]

Kapcsolódó szócikkek[szerkesztés]