Zestaw instrukcji Atmel AVR
Zestaw instrukcji Atmel AVR jest językiem maszynowym dla Atmel AVR , zmodyfikowanego jednoukładowego 8-bitowego mikrokontrolera RISC o architekturze Harvarda, który został opracowany przez firmę Atmel w 1996 roku. AVR był jedną z pierwszych rodzin mikrokontrolerów wykorzystujących wbudowaną pamięć flash do przechowywanie programu.
Rejestry procesora
Istnieją 32 8-bitowe rejestry ogólnego przeznaczenia, R0 – R31. Wszystkie operacje arytmetyczne i logiczne działają na tych rejestrach; tylko instrukcje ładowania i przechowywania mają dostęp do pamięci RAM.
Ograniczona liczba instrukcji działa na 16-bitowych parach rejestrów. Rejestr o niższym numerze pary zawiera najmniej znaczące bity i musi być parzysty. Ostatnie trzy pary rejestrów są używane jako rejestry wskaźnikowe do adresowania pamięci. Są one znane jako X (R27:R26), Y (R29:R28) i Z (R31:R30). Tryby adresowania postinkrementacyjnego i predekrementacyjnego są obsługiwane we wszystkich trzech trybach. Y i Z obsługują również sześciobitowe przemieszczenie dodatnie.
Instrukcje dopuszczające natychmiastową wartość są ograniczone do rejestrów R16–R31 (operacje 8-bitowe) lub do par rejestrów R25:R24–R31:R30 (operacje 16-bitowe ADIW i SBIW). Niektóre warianty operacji MUL są ograniczone do ośmiu rejestrów, od R16 do R23.
Rejestry specjalnego przeznaczenia
Oprócz tych 32 rejestrów ogólnego przeznaczenia, procesor ma kilka rejestrów specjalnego przeznaczenia:
- PC: 16- lub 22-bitowy licznik programów
- SP: 8- lub 16-bitowy wskaźnik stosu
- SREG: 8-bitowy rejestr stanu
- RAMPX, RAMPY, RAMPZ, RAMPD i EIND: 8-bitowe rejestry segmentowe, które są dołączane do adresów 16-bitowych w celu utworzenia adresów 24-bitowych; dostępne tylko w częściach z dużymi przestrzeniami adresowymi.
Bity stanu
Bity rejestru stanu to:
- C Noś flagę . To jest flaga pożyczania na odejmowaniach. Instrukcje INC i
DEC
nie modyfikują flagi przenoszenia, więc mogą być używanedo
zapętlania wielobajtowych operacji arytmetycznych. - Flaga Z Zero . Ustaw na 1, gdy wynik arytmetyczny wynosi zero.
- N Flaga ujemna . Ustaw na kopię najbardziej znaczącego bitu wyniku arytmetycznego.
- V Flaga przepełnienia . Ustaw w przypadku przepełnienia uzupełnienia do dwóch.
- Flaga znaku S. Unikalne dla AVR, jest to zawsze N⊕V i pokazuje prawdziwy znak porównania.
- H Flaga do połowy nośna . Jest to wewnętrzne przeniesienie z dodawania i służy do obsługi BCD .
- Kopia T-bitowa. Z tego bitu korzystają specjalne instrukcje ładowania bitów i przechowywania bitów.
- Flaga przerwania . Ustaw, kiedy przerwania są włączone.
Adresowanie
Dostępne są następujące przestrzenie adresowe:
- Rejestry ogólnego przeznaczenia są adresowane za pomocą ich numerów (0–31), chociaż pełny numer 5-bitowy nie jest przechowywany w instrukcjach, które mogą działać tylko na podzbiorze tych rejestrów.
- Rejestry we / wy mają dedykowaną 6-bitową przestrzeń adresową, której dolna połowa jest adresowalna bitowo; niektóre części mają rejestry we/wy poza tą przestrzenią adresową, które nazywane są „rozszerzonymi we/wy” i są dostępne tylko jako we/wy mapowane w pamięci w przestrzeni adresowej danych.
- Przestrzeń adresowa danych odwzorowuje 32 rejestry ogólnego przeznaczenia, wszystkie rejestry we/wy (w tym te dostępne również poprzez przestrzeń adresową we/wy) oraz pamięć RAM; można go adresować bezpośrednio lub pośrednio przez rejestry wskaźników X, Y i Z, poprzedzone w razie potrzeby odpowiednio przez RAMPX, RAMPY i RAMPZ.
- Pamięć programu ( flash ) ma wydzieloną przestrzeń adresową, adresowaną jako 16-bitowe słowa na potrzeby pobierania instrukcji
- W celu pobierania stałych danych pamięć programu jest adresowana bajtowo przez rejestr wskaźnika Z, poprzedzony, jeśli to konieczne, przez RAMPZ.
- pamięć EEPROM jest mapowana w pamięci; w innych nie jest adresowalny bezpośrednio i zamiast tego jest dostępny za pośrednictwem adresów, danych i rejestrów kontrolnych we / wy.
- Rejestry ogólnego przeznaczenia, rejestr stanu i niektóre rejestry we/wy są adresowalne bitowo, przy czym bit 0 jest najmniej znaczący, a bit 7 najbardziej znaczący.
Pierwsze 64 rejestry I/O są dostępne zarówno poprzez I/O, jak i przestrzeń adresową danych. Mają zatem dwa różne adresy. Są one zwykle zapisywane jako „ 0x00 ( 0x20 )” do „ 0x3F ( 0x5F )”, gdzie pierwsza pozycja to adres we/wy, a druga, w nawiasach, adres danych.
Rejestry specjalnego przeznaczenia CPU, z wyjątkiem PC, mogą być dostępne jako rejestry I/O. Niektóre rejestry (RAMPX, RAMPY) mogą nie być obecne na maszynach z pamięcią adresowalną mniejszą niż 64 KiB .
Rejestr | Adres wejścia/wyjścia | Adres danych |
---|---|---|
SREG | 0x3F | 0x5F |
Sp | 0x3E : 0x3D | 0x5E : 0x5D |
EIND | 0x3C | 0x5C |
RAMPZ | 0x3B | 0x5B |
RAMPY | 0x3A | 0x5A |
RAMPX | 0x39 | 0x59 |
RAMPD | 0x38 | 0x58 |
Typowa mapa pamięci ATmegi może wyglądać następująco:
Adres danych | Adres wejścia/wyjścia | Zawartość |
---|---|---|
0x0000 – 0x001F | Rejestry R0 – R31 | |
0x0020 – 0x003F | 0x00 – 0x1F | Rejestry we/wy (adresowalne bitowo) |
0x0040 – 0x005F | 0x20 – 0x3F | Rejestry we/wy (nie adresowalne bitowo) |
0x0060 – 0x00FF | Rozszerzone rejestry we/wy (tylko we/wy mapowane w pamięci) | |
0x0100 – RAMEND | Wewnętrzna pamięć SRAM |
gdzie RAMEND to ostatni adres pamięci RAM. W częściach pozbawionych rozszerzonych wejść/wyjść pamięć RAM zaczynałaby się od 0x0060 .
Czas instrukcji
Operacje arytmetyczne działają na rejestrach R0 – R31, ale nie bezpośrednio na pamięci RAM i zajmują jeden cykl zegara, z wyjątkiem mnożenia i dodawania całego słowa (ADIW i SBIW), które zajmują dwa cykle.
Dostęp do pamięci RAM i przestrzeni we/wy można uzyskać tylko poprzez kopiowanie do lub z rejestrów. Dostęp pośredni (w tym opcjonalnie postinkrementacja, predekrementacja lub stałe przemieszczenie) jest możliwy przez rejestry X, Y i Z. Cały dostęp do pamięci RAM zajmuje dwa cykle zegara. Poruszanie się między rejestrami i wejściami/wyjściami to jeden cykl. Przenoszenie ośmio- lub szesnastobitowych danych między rejestrami lub stałej do rejestru to również jeden cykl. Odczyt pamięci programu (LPM) trwa trzy cykle.
Lista instrukcji
Instrukcje to jedno 16-bitowe słowo, z wyjątkiem tych zawierających 16-bitowy lub 22-bitowy adres, które wymagają dwóch słów.
Istnieją dwa typy rozgałęzień warunkowych: skoki do adresu i pominięcia. Gałęzie warunkowe (BRxx) mogą testować flagę ALU i przeskakiwać do określonego adresu. Pomijanie (SBxx) testuje dowolny bit w rejestrze lub we/wy i pomija następną instrukcję, jeśli test był prawdziwy.
W następującym:
- Rd i Rr to rejestry z zakresu R0–R31
- Rdh i Rrh to rejestry z zakresu R16–R31 (wysoka połowa)
- Rdq i Rrq to rejestry z zakresu R16–R23 (jedna czwarta pliku rejestru)
- Rp jest parą rejestrów R25:R24, R27:R26 (X), R29:R28 (Y) lub R31:R30 (Z)
- XYZ jest rejestrem wskaźnikowym, X, Y lub Z
- YZ jest rejestrem wskaźnikowym, Y lub Z
- s to numer bitu w rejestrze stanu (0 = C, 1 = Z itd., patrz lista powyżej)
- b to numer bitu w rejestrze ogólnego przeznaczenia lub rejestrze I/O (0 = najmniej znaczący, 7 = najbardziej znaczący)
- K6 to 6-bitowa natychmiastowa stała bez znaku (zakres: 0–63)
- K8 jest 8-bitową stałą natychmiastową; ponieważ jest używany tylko w operacjach 8-bitowych, jego podpis jest nieistotny
- IO5 to 5-bitowy adres I/O obejmujący adresowalną bitowo część przestrzeni adresowej I/O, tj. dolną połowę (zakres: 0–31)
- IO6 to 6-bitowy adres we/wy obejmujący pełną przestrzeń adresową we/wy (zakres: 0–63)
- D16 to 16-bitowy adres danych obejmujący 64 KiB ; w częściach z więcej niż 64 KiB miejsca na dane zawartość rejestru segmentowego RAMPD jest dodawana na początku
- P22 to 22-bitowy adres programu obejmujący 2 22 16-bitowe słowa (tj. 8 MiB )
- S7 i S12 to 7-bitowe (odpowiednio 12-bitowe) przesunięcia ze znakiem , w jednostkach słów, względem adresu programu zapisanego w liczniku programu
Arytmetyka | Bit i inni | Przenosić | Skok | Oddział | Dzwonić |
---|---|---|---|---|---|
ADD Rd , Rr ADC Rd , Rr ADIW Rp + 1 : Rp , K6 SUB Rd , Rr SUBI Rdh , K8 SBC Rd , Rr SBCI Rdh , K8 SBIW Rp + 1 : Rp , K6 INC Rd DEC Rd AND Rd , Rr ANDI Rdh , K8 OR Rd , Rr ORI Rdh , K8
COM Rd NEG Rd CP Rd , Rr CPC Rd , Rr CPI Rdh , K8 SWAP Rd
LSR Rd ROR Rd ASR Rd
MUL Rd , Rr MULS Rdh , Rrh MULSU Rdq , Rrq FMUL Rdq , Rrq FMULS Rdq , Rrq FMULSU Rdq , Rrq
|
BSET s BCLR s SBI IO5 , b CBI IO5 , b BST Rd , b BLD Rd , b NOP PRZERWA SLEEP WDR
|
MOV Rd , Rr MOVW Rd + 1 : Rd , Rr + 1 : Rr IN Rd , IO6 OUT IO6 , Rr PUSH Rr POP Rr LDI Rdh , K8 LDS Rd , D16 LD Rd , X LDD Rd , YZ + K6 LD Rd , - XYZ LD Rd , XYZ + STS D16 , Rr ST X , Rr STD YZ + K6 , Rr ST - XYZ , Rr ST XYZ + , Rr LPM LPM Rd , Z LPM Rd , Z + ELPM ELPM Rd , Z ELPM Rd , Z + SPM
|
RJMP S12 IJMP EIJMP JMP P22
|
CPSE Rd , Rr SBRC Rr , b SBRS Rr , b SBIC IO5 , b SBIS IO5 , b BRBC s , S7 BRBS s , S7
|
RCALL S12 ICALL EICALL ZADZWOŃ P22 RET RETI
|
Dziedziczenie zestawu instrukcji
Nie wszystkie instrukcje są zaimplementowane we wszystkich kontrolerach Atmel AVR . Tak jest w przypadku instrukcji wykonujących mnożenia, rozszerzone ładowanie/skoki/wywołania, skoki w dal i sterowanie mocą.
Instrukcje opcjonalne można podzielić na trzy kategorie:
- podstawowe funkcje procesora (obliczeniowe), dodane do bardziej wydajnych rdzeni procesora
- funkcje adresowania pamięci, dodane we wszystkich modelach z pamięcią wystarczająco dużą, aby ich wymagać
- opcjonalne funkcje, kilka urządzeń peryferyjnych, które mogą być obecne w danym modelu lub nie.
Podczas gdy procesory wyższej klasy mają zwykle zarówno bardziej wydajne rdzenie, jak i więcej pamięci, obecność jednego nie gwarantuje obecności drugiego.
Instrukcje rdzenia procesora
Począwszy od oryginalnego „klasycznego” rdzenia, ulepszenia są podzielone na następujące poziomy, z których każdy obejmuje wszystkie poprzednie:
- „Klasyczny” rdzeń ma tylko zerowy argument instrukcji
LPM
, co odpowiadaLPM r0,Z
. - „Klasyczny plus” dodaje instrukcję
MOVW
do przenoszenia par rejestrów oraz bardziej ogólną formę instrukcji LPM (LPM Rd,Z
iLPM Rd,Z+
), które pozwalają na dowolny rejestr docelowy i automatyczne zwiększanie wskaźnika Z. - „Ulepszone” rdzenie dodają instrukcje mnożenia.
-
same w sobie nie dodają nowych instrukcji , ale wprowadzają kilka istotnych zmian:
- Mapa pamięci zostaje zreorganizowana, eliminując mapowanie pamięci pliku rejestru procesora (więc porty I/O zaczynają się od adresu RAM 0) i rozszerzając zakres portów I/O. Teraz pierwsze 4K to rejestry funkcji specjalnych, drugie 4K to flashowanie danych, a normalna pamięć RAM zaczyna się od 8K.
- Nie jest konieczne jawne wyłączanie przerwań przed dostosowaniem rejestrów wskaźnika stosu (SPL i SPH); każdy zapis do SPL automatycznie wyłącza przerwania na 4 cykle zegara, aby dać czas na aktualizację SPH.
- Inne rejestry wielobajtowe są wyposażone w rejestry cienia, aby umożliwić atomowy odczyt i zapis. Kiedy odczytywany jest bajt najniższego rzędu, bajty wyższego rzędu są kopiowane do rejestrów cienia, więc późniejsze ich odczytanie tworzy migawkę rejestru w momencie pierwszego odczytu. Zapisy do bajtów niższego rzędu są buforowane do momentu zapisania bajtu najwyższego rzędu, na podstawie którego cały rejestr wielobajtowy jest aktualizowany atomowo.
- Późniejsze rdzenie XMEGA (w szczególności modele B, C i AU, takie jak ATxmega16A4U , ale nie wcześniejsze modele A, D i E, takie jak ATxmega16D4) dodają cztery atomowe instrukcje odczytu, modyfikacji i zapisu : wymianę (
XCH
), ładowanie -i-ustaw, załaduj i wyczyść oraz załaduj i przełącz. Pomagają one w koordynacji z bezpośrednim dostępem do pamięci , w szczególności z kontrolerem USB .
Mniej wydajne niż „klasyczne” rdzenie procesora to dwa podzbiory: rdzeń „AVR1” i „mały AVR”. Co mylące, procesory marki „ATtiny” mają różne rdzenie, w tym AVR1 (ATtiny11, ATtiny28), classic (ATtiny22, ATtiny26), classic+ (ATtiny24) i AVRtiny (ATtiny20, ATtiny40).
Podzbiór AVR1 nie był popularny i od 2000 roku nie wprowadzono żadnych nowych modeli. Pomija całą pamięć RAM z wyjątkiem 32 rejestrów mapowanych pod adresem 0–31 i portów we / wy pod adresami 32–95. Stos jest zastępowany 3-poziomowym stosem sprzętowym, a PUSH
i POP
są usuwane. Wszystkie operacje 16-bitowe są usuwane, podobnie jak IJMP
, ICALL
oraz wszystkie tryby adresowania ładowania i przechowywania z wyjątkiem pośredniego przez Z.
Drugą, bardziej udaną próbą podzielenia zestawu instrukcji AVR na podzbiory jest rdzeń „mały AVR”.
Najważniejszą zmianą jest to, że rdzeń AVRtiny pomija rejestry R0 – R15. Rejestry również nie są mapowane w pamięci, z portami we / wy od 0 do 63 i pamięcią RAM ogólnego przeznaczenia zaczynającą się od adresu 64. 16-bitowe operacje arytmetyczne ( ADIW
, SBIW
) są pomijane, podobnie jak ładowanie / przechowywanie z przesunięciem tryby adresowania ( Y+d
, Z+d
), ale tryby adresowania predekrementacji i postinkrementacji są zachowane. Instrukcja LPM
jest pomijana; zamiast tego pamięć ROM programu jest odwzorowywana na przestrzeń adresową danych i można uzyskać do niej dostęp za pomocą instrukcji normalnego ładowania.
Wreszcie, rdzeń AVRtiny usuwa 2-wyrazowe instrukcje LDS
i STS
do bezpośredniego adresowania pamięci RAM i zamiast tego wykorzystuje przestrzeń opcode poprzednio przypisaną do ładowania/przechowywania z instrukcjami przemieszczenia dla nowych 1-wyrazowych instrukcji LDS
i STS
, które mogą uzyskać dostęp do pierwszych 128 lokalizacje pamięci RAM ogólnego przeznaczenia, adresy od 0x40 do 0xBF. ( IN
i OUT
zapewniają bezpośredni dostęp do przestrzeni I/O od 0 do 0x3F.)
Instrukcje adresowania pamięci
Najmniejsze rdzenie mają ≤256 bajtów przestrzeni adresowej danych (co oznacza ≤128 bajtów pamięci RAM po usunięciu portów we/wy i innych zarezerwowanych adresów) i ≤8192 bajtów (8 KiB) pamięci ROM programu. Mają one tylko 8-bitowy wskaźnik stosu (w SPL) i obsługują tylko 12-bitowe względne instrukcje skoku/wywołania RJMP
/ RCALL
. (Ponieważ licznik programu AVR zlicza 16-bitowe słowa, a nie bajty, 12-bitowe przesunięcie jest wystarczające do zaadresowania 2 13 bajtów pamięci ROM.)
W celu uzyskania dostępu do dostępnych zasobów dostępne są dodatkowe możliwości adresowania pamięci:
- Modele z >256 bajtami przestrzeni adresowej danych (≥256 bajtów RAM) mają 16-bitowy wskaźnik stosu, z wyższą połową w rejestrze SPH.
- Modele z > 8 KiB pamięci ROM dodają 2-wyrazowe (22-bitowe) instrukcje
JUMP
iCALL .
(Niektóre wczesne modele mają erratę , jeśli po instrukcji pomijania następuje instrukcja składająca się z dwóch słów). - Modele z > 64 KiB pamięci ROM dodają instrukcję
ELPM
i odpowiedni rejestr RAMPZ. InstrukcjeLPM
rozszerzają o zero adres ROM w Z; InstrukcjeELPM
poprzedzają rejestr RAMPZ dla wysokich bitów. To nie to samo, co bardziej ogólnaLPM
; istnieją „klasyczne” modele z tylko zerową postaciąELPM
(ATmega103 i at43usb320). Gdy dostępne jest automatyczne zwiększanie (większość modeli), aktualizuje cały 24-bitowy adres, w tym RAMPZ. - (Rzadkie) modele z > 128 KiB pamięci ROM mają 3-bajtowy licznik programu. Wywołania i powroty podprogramów wykorzystują dodatkowy bajt przestrzeni stosu, jest nowy rejestr EIND zapewniający dodatkowe wysokie bity dla pośrednich skoków i wywołań, a także nowe rozszerzone instrukcje EIJMP
i
EICALL,
które używają EIND:Z jako adresu docelowego. (PoprzednieIJMP
iICALL
używają Z o rozszerzeniu zerowym). - (Rzadkie) modele z > 64 KiB przestrzeni adresowej RAM rozszerzają 16-bitowe limity adresowania RAM o rejestry RAMPX, RAMPY, RAMPZ i RAMPD. Zapewniają one dodatkowe wysokie bity dla trybów adresowania, które wykorzystują odpowiednio pary rejestrów X, Y lub Z lub bezpośrednie instrukcje adresowania
LDS
/STS
. W przeciwieństwie do dostępu do pamięci ROM, nie ma odrębnych „rozszerzonych” instrukcji; zamiast tego rejestry RAMP są używane bezwarunkowo.
Opcjonalne instrukcje dotyczące funkcji
Trzy instrukcje są obecne tylko w modelach, które mają odpowiednie wyposażenie sprzętowe
-
SPM
do przechowywania w pamięci flash ROM jest obecny tylko w procesorach z pamięcią flash ROM (większość z nich) -
BREAK
do wywołania debuggera na chipie jest pomijany w niektórych małych modelach bez obsługi debuggera na chipie -
DES
do wykonywania rund Data Encryption Standard jest obecny w modelach XMEGA z obsługą akceleratora DES
Architektury inne niż AVR1 są nazywane zgodnie z konwencją avr-libc.
Rodzina | Członkowie | Arytmetyka | Gałęzie | Transfery | Bit-mądry | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Minimalny rdzeń AVR1 |
|
|
|
|
|
||||||||||||
Klasyczny rdzeń do 8K Przestrzeń programowa („AVR2”) |
|
nowe instrukcje:
|
nowe instrukcje:
|
nowe instrukcje:
|
(nic nowego) | ||||||||||||
AVR2 z instrukcjami MOVW i LPM („AVR2.5”) |
|
(nic nowego) | (nic nowego) | nowe instrukcje:
|
(nic nowego) | ||||||||||||
Klasyczny rdzeń do 128 000 („AVR3”) |
|
(nic nowego) | nowe instrukcje:
|
nowe instrukcje:
|
(nic nowego) | ||||||||||||
Ulepszony rdzeń do 8K („AVR4”) |
|
nowe instrukcje:
|
(nic nowego) | nowe instrukcje:
|
(nic nowego) | ||||||||||||
Ulepszony rdzeń do 128K („AVR5”, „AVR5.1”) | (nic nowego) | nowa instrukcja:
|
(nic nowego) | nowe instrukcje:
|
|||||||||||||
Ulepszony rdzeń do 4M („AVR5” i „AVR6”) |
|
(nic nowego) | nowe instrukcje:
|
(nic nowego) | (nic nowego) | ||||||||||||
Rdzeń XMEGA („avrxmega” 2-6) | Seria ATxmega | nowe instrukcje:
|
(nic nowego) | nowa instrukcja (z drugiej rewizji krzemu - części AU,B,C)
|
(nic nowego) | ||||||||||||
Zredukowany rdzeń AVRtiny („avrtiny10”) |
|
(Identyczny z minimalnym rdzeniem, z wyjątkiem ograniczonego zestawu rejestrów procesora a ) | (Identyczny z klasycznym rdzeniem do 8K, z wyjątkiem zmniejszonego zestawu rejestrów procesora a ) | Identyczny z klasycznym rdzeniem do 8K, z następującymi wyjątkami:
|
(Identyczny jak ulepszony rdzeń do 128 KB, z wyjątkiem zmniejszonego zestawu rejestrów procesora a ) |
a Zredukowany zestaw rejestrów jest ograniczony do R16 do R31.
Kodowanie instrukcji
Przypisanie bitów:
- rrrrr = Rejestr źródłowy
- rrrr = Rejestr źródłowy (R16–R31)
- rrr = Rejestr źródłowy (R16–R23)
- RRRR = Para rejestrów źródłowych (R1:R0–R31:R30)
- dddd = Rejestr docelowy
- dddd = Rejestr docelowy (R16–R31)
- ddd = Rejestr docelowy (R16–R23)
- DDDD = para rejestrów docelowych (R1:R0–R31:R30)
- pp = para rejestrów, W, X, Y lub Z
- y = bit pary rejestrów Y/Z (0=Z, 1=Y)
- u = FMUL(S(U)) ze znakiem 0=podpisany lub 1=bez znaku
- s = Zapisz/ładuj bit (0=ładuj, 1=zapisz)
- c = Wezwanie/skok (0=skok, 1=wezwanie)
- cy = Z przeniesieniem (0=bez przeniesienia, 1=z przeniesieniem)
- e = Rozszerz pośredni adres skoku/wywołania o EIND (0=0:Z, 1=EIND:Z)
- q = rozszerzenie adresu pamięci programu o RAMPZ (0=0:Z, 1=RAMPZ:Z)
- aaaaaa = adres przestrzeni we/wy
- aaaaa = adres przestrzeni we/wy (tylko pierwsze 32)
- bbb = Numer bitu (0–7)
- B = Wartość bitowa (0 lub 1)
- kkkk = 4-bitowa stała bez znaku (kod operacji DES)
- kkkkkk = 6-bitowa stała bez znaku
- KKKKKKKK = 8-bitowa stała
Atmel AVR wykorzystuje wiele podzielonych pól, w których bity nie są ciągłe w słowie instrukcji. Instrukcje ładowania/zapisywania z przesunięciem są najbardziej ekstremalnym przykładem, w którym 6-bitowe przesunięcie jest dzielone na trzy części.
1 5 |
1 4 |
1 3 |
1 2 |
1 1 |
1 0 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Instrukcja |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NIE |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | DDDD | RRRR | MOVW Rd,Rr Przenieś parę rejestrów | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | dddd | wrrrr | MULS Rd, Rr | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ddd | 0 | rrr | MULSU Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ddd | 1 | rrr | FMUL Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ddd | u | rrr | FMULS(U) Rd,Rr | ||||
0 | 0 | kod operacji | R | dddd | wrrrr | Instrukcje 2-argumentowe | ||||||||||
0 | 0 | 0 | c̅y̅ | 0 | 1 | R | dddd | wrrrr | CPC/CP Rd, Rr | |||||||
0 | 0 | 0 | c̅y̅ | 1 | 0 | R | dddd | wrrrr | SBC/SUB Rd, Rr | |||||||
0 | 0 | 0 | cy | 1 | 1 | R | dddd | wrrrr | ADD/ADC Rd,Rr (LSL/ROL Rd, gdy Rd=Rr) | |||||||
0 | 0 | 0 | 1 | 0 | 0 | R | dddd | wrrrr | CPSE Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 0 | R | dddd | wrrrr | I Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 1 | R | dddd | wrrrr | EOR Rd, Rr | |||||||
0 | 0 | 1 | 0 | 1 | 0 | R | dddd | wrrrr | LUB Rd, Rr | |||||||
0 | 0 | 1 | 0 | 1 | 1 | R | dddd | wrrrr | MOV Rd, Rr | |||||||
0 | 0 | 1 | 1 | KKKK | dddd | KKKK | CPI Rd, K | |||||||||
0 | 1 | opc | KKKK | dddd | KKKK | Operacje natychmiastowe w rejestrze | ||||||||||
0 | 1 | 0 | c̅y̅ | KKKK | dddd | KKKK | SBCI/SUBI Rd, K | |||||||||
0 | 1 | 1 | 0 | KKKK | dddd | KKKK |
ORI Rd,K SBR Rd,K |
|||||||||
0 | 1 | 1 | 1 | KKKK | dddd | KKKK |
ANDI Rd,K CBR Rd,K |
|||||||||
1 | 0 | k | 0 | kk | S | dddd | y | kkk | LDD/STD Rd do Z+k lub Y+k | |||||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | kod operacji | Operacje ładowania/przechowywania | |||||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | 0 | 0 | 0 | 0 | LDS rd,i/STS i,rd | ||||
16-bitowy natychmiastowy adres SRAM i | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | y | 0 | 0 | 1 | LD/ST Rd do Z+/Y+ | ||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | y | 0 | 1 | 0 | LD/ST Rd do −Z/−Y | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | dddd | 0 | 1 | Q | 0 | LPM/ELPM Rd,Z | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | dddd | 0 | 1 | Q | 1 | LPM/ELPM Rd,Z+ | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | dddd | 0 | 1 | 0 | 0 | XCH Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | dddd | 0 | 1 | 0 | 1 | LAS Z, ul | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | dddd | 0 | 1 | 1 | 0 | LAC Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | dddd | 0 | 1 | 1 | 1 | LAT Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | 1 | 1 | 0 | 0 | LD/ST Rd do X | ||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | 1 | 1 | 0 | 1 | LD/ST Rd do X+ | ||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | 1 | 1 | 1 | 0 | LD/ST Rd do -X | ||||
1 | 0 | 0 | 1 | 0 | 0 | S | dddd | 1 | 1 | 1 | 1 | POP/PUSH ul | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | kod operacji | Instrukcje jednoargumentowe: | ||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 0 | 0 | 0 | COM Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 0 | 0 | 1 | NEG Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 0 | 1 | 0 | SWAP Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 0 | 1 | 1 | INC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 1 | 0 | 0 | (skryty) | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 1 | 0 | 1 | ASR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 1 | 1 | 0 | LSR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 0 | 1 | 1 | 1 | ROR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B | bbb | 1 | 0 | 0 | 0 | SEx/CLx Kasowanie/ustawianie rejestru stanu | ||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | kod operacji | 1 | 0 | 0 | 0 | Instrukcje z operandem zerowym | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | GNIĆ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | RETI |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | X | 1 | 0 | 0 | 0 | (skryty) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | X | X | 1 | 0 | 0 | 0 | (skryty) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | SPAĆ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | PRZERWA |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | WDR |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | (skryty) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | Q | 1 | 0 | 0 | 0 | LPM/ELPM |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | SPM |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | SPM Z+ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | C | 0 | 0 | 0 | mi | 1 | 0 | 0 | 1 | Pośredni skok/wezwanie do Z lub EIND:Z |
1 | 0 | 0 | 1 | 0 | 1 | 0 | dddd | 1 | 0 | 1 | 0 | DEC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | kkkk | 1 | 0 | 1 | 1 | DES okrągły k | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | kkkkk | 1 | 1 | C | k | JMP/CALL abs22 | ||||
kkkkkkkkkkkkkkkk | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | kk | str | kkkk | ADIW Rp,uimm6 | |||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | kk | str | kkkk | SBIW Rp,uimm6 | |||||
1 | 0 | 0 | 1 | 1 | 0 | B | 0 | aaaa | bbb | CBI/SBI a,b (wyczyść/ustaw bit I/O) | ||||||
1 | 0 | 0 | 1 | 1 | 0 | B | 1 | aaaa | bbb | SBIC/SBIS a, b (test bitów we/wy) | ||||||
1 | 0 | 0 | 1 | 1 | 1 | R | dddd | wrrrr | MUL, bez znaku: R1:R0 = Rr × Rd | |||||||
1 | 0 | 1 | 1 | S | aa | dddd | aaaa | IN/OUT do przestrzeni I/O | ||||||||
1 | 1 | 0 | C | 12-bitowe przesunięcie ze znakiem | RJMP/RCALL do PC + simm12 | |||||||||||
1 | 1 | 1 | 0 | KKKK | dddd | KKKK | LDI Rd, K | |||||||||
1 | 1 | 1 | 1 | 0 | B | 7-bitowe przesunięcie ze znakiem | bbb | Warunkowe rozgałęzienie na bicie rejestru stanu | ||||||||
1 | 1 | 1 | 1 | 1 | 0 | S | dddd | 0 | bbb | Bit rejestru BLD/BST do STATUS.T | ||||||
1 | 1 | 1 | 1 | 1 | 1 | B | dddd | 0 | bbb | SBRC/SBRS pomiń, jeśli bit rejestru jest równy B | ||||||
1 | 1 | 1 | 1 | 1 | X | X | dddd | 1 | bbb | (skryty) |
Linki zewnętrzne
- Środowisko programistyczne GNU:
- Programowanie mikrokontrolera AVR za pomocą GCC autorstwa Guido Sochera
- Środowisko programistyczne GNU dla mikrokontrolera AVR autorstwa Richa Neswolda
- Opcje AVR w GCC-AVR
- Symulator zestawu instrukcji AVR (ATmega32u4 dla plików GCC Intel Hex)
- Dziedziczenie zestawu instrukcji AVR (notatka LLVM), na podstawie tej strony oraz kodu GCC i Binutils