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:

  1. C Noś flagę . To jest flaga pożyczania na odejmowaniach. Instrukcje INC i DEC nie modyfikują flagi przenoszenia, więc mogą być używane do zapętlania wielobajtowych operacji arytmetycznych.
  2. Flaga Z Zero . Ustaw na 1, gdy wynik arytmetyczny wynosi zero.
  3. N Flaga ujemna . Ustaw na kopię najbardziej znaczącego bitu wyniku arytmetycznego.
  4. V Flaga przepełnienia . Ustaw w przypadku przepełnienia uzupełnienia do dwóch.
  5. Flaga znaku S. Unikalne dla AVR, jest to zawsze N⊕V i pokazuje prawdziwy znak porównania.
  6. H Flaga do połowy nośna . Jest to wewnętrzne przeniesienie z dodawania i służy do obsługi BCD .
  7. Kopia T-bitowa. Z tego bitu korzystają specjalne instrukcje ładowania bitów i przechowywania bitów.
  8. 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
Zestaw instrukcji AVR
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:

  1. „Klasyczny” rdzeń ma tylko zerowy argument instrukcji LPM , co odpowiada LPM r0,Z .
  2. „Klasyczny plus” dodaje instrukcję MOVW do przenoszenia par rejestrów oraz bardziej ogólną formę instrukcji LPM ( LPM Rd,Z i LPM Rd,Z+ ), które pozwalają na dowolny rejestr docelowy i automatyczne zwiększanie wskaźnika Z.
  3. „Ulepszone” rdzenie dodają instrukcje mnożenia.
  4. 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.
  5. 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:

  1. 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.
  2. Modele z > 8 KiB pamięci ROM dodają 2-wyrazowe (22-bitowe) instrukcje JUMP i CALL . (Niektóre wczesne modele mają erratę , jeśli po instrukcji pomijania następuje instrukcja składająca się z dwóch słów).
  3. Modele z > 64 KiB pamięci ROM dodają instrukcję ELPM i odpowiedni rejestr RAMPZ. Instrukcje LPM rozszerzają o zero adres ROM w Z; Instrukcje ELPM poprzedzają rejestr RAMPZ dla wysokich bitów. To nie to samo, co bardziej ogólna LPM ; 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.
  4. (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. (Poprzednie IJMP i ICALL używają Z o rozszerzeniu zerowym).
  5. (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
  • AT90S1200
  • ATtiny11
  • ATtiny12
  • ATtiny15
  • ATtiny28
  • DODAĆ
  • ADC
  • POD
  • SUBI
  • SBC
  • SBCI
  • I
  • I JA
  • LUB
  • LUB JA
  • EOR
  • KOM
  • NEG
  • SBR
  • CBR
  • INC
  • grudzień
  • TST
  • CLR
  • SER
  • RJMP
  • ODWOŁAJ
  • GNIĆ
  • RETI
  • CPSE
  • CP
  • CPC
  • CPI
  • SBRC
  • SBRS
  • SBIC
  • SBIS
  • BRBS
  • BRBC
  • BREK
  • BRNE
  • BRCS
  • BRCC
  • BRSH
  • BRLO
  • BRMI
  • BRPL
  • BRGE
  • BRLT
  • BRHS
  • BRHC
  • BRTS
  • BRTC
  • BRVS
  • BRVC
  • SER BRIE
  • BRYT
  • LD
  • Św
  • MOV
  • LDI
  • W
  • NA ZEWNĄTRZ
  • LPM (nie w AT90S1200)
  • SBI
  • CBI
  • LSL
  • LSR
  • ROL
  • ROR
  • ASR
  • ZAMIENIAĆ
  • BSET
  • BCLR
  • BST
  • BLD
  • SEK
  • CLC
  • SEN
  • CLN
  • SSE
  • CLZ
  • SEI
  • CLI
  • SES
  • CLS
  • SEV
  • CLV
  • USTAWIĆ
  • CLT
  • SEH
  • CLH
  • NIE
  • SPAĆ
  • WDR
Klasyczny rdzeń do 8K Przestrzeń programowa („AVR2”)
  • AT90S2313
  • AT90S2323
  • ATtiny22
  • AT90S2333
  • AT90S2343
  • AT90S4414
  • AT90S4433
  • AT90S4434
  • AT90S8515
  • AT90C8534
  • AT90S8535
  • ATtiny26
nowe instrukcje:
  • ADIW
  • SBIW
nowe instrukcje:
  • IJMP
  • ODBIERZ
nowe instrukcje:
  • LD (obecnie 9 trybów)
  • LDD
  • LSR
  • ST (9 trybów)
  • STD
  • STS
  • NACISKAĆ
  • MUZYKA POP
(nic nowego)
AVR2 z instrukcjami MOVW i LPM („AVR2.5”)
  • ATa5272
  • ATtiny13/a
  • ATtiny2313/a
  • ATtiny24/a
  • ATtiny25
  • ATtiny261/a
  • ATtiny4313
  • ATtiny43u
  • ATtiny44/a
  • ATtiny45
  • ATtiny461/a
  • ATtiny48
  • ATtiny828
  • ATtiny84/a
  • ATtiny85
  • ATtiny861/a
  • ATtiny87
  • ATtiny88
(nic nowego) (nic nowego) nowe instrukcje:
  • MOVW
  • l/min (Rx, Z[+])
  • SPM
(nic nowego)
Klasyczny rdzeń do 128 000 („AVR3”)
  • ATmega103
  • ATmega603
  • AT43USB320
  • AT76C711
(nic nowego) nowe instrukcje:
  • JMP
  • DZWONIĆ
nowe instrukcje:
  • ELPM (w „AVR3.1”)
(nic nowego)
Ulepszony rdzeń do 8K („AVR4”)
  • ATmega8
  • ATmega83
  • ATmega85
  • ATmega8515
nowe instrukcje:
  • MUL
  • MUL
  • MULSU
  • FMUL
  • FMULS
  • FMUSU
(nic nowego) nowe instrukcje:
  • MOVW
  • LPM (3 tryby)
  • SPM
(nic nowego)
Ulepszony rdzeń do 128K („AVR5”, „AVR5.1”)
  • ATmega16
  • ATmega161
  • ATmega163
  • ATmega32
  • ATmega323
  • ATmega64
  • ATmega128
  • AT43USB355
  • AT94 (FPSLIC)
  • Seria AT90CAN
  • Seria AT90PWM
  • ATmega48
  • ATmega88
  • ATmega168
  • ATmega162
  • ATmega164
  • ATmega324
  • ATmega328
  • ATmega644
  • ATmega165
  • ATmega169
  • ATmega325
  • ATmega3250
  • ATmega645
  • ATmega6450
  • ATmega406
(nic nowego) nowa instrukcja:
  • ELPMX („AVR5.1”)
(nic nowego) nowe instrukcje:
  • PRZERWA
Ulepszony rdzeń do 4M („AVR5” i „AVR6”)
  • ATmega640
  • ATmega1280
  • ATmega1281
  • ATmega2560
  • ATmega2561
(nic nowego) nowe instrukcje:
  • EIJMP
  • EICALL
(nic nowego) (nic nowego)
Rdzeń XMEGA („avrxmega” 2-6) Seria ATxmega nowe instrukcje:
  • DES
(nic nowego) nowa instrukcja (z drugiej rewizji krzemu - części AU,B,C)
  • XCH
  • LAS
  • GUMILAKA
  • łac
(nic nowego)
Zredukowany rdzeń AVRtiny („avrtiny10”)
  • ATtiny40
  • ATtiny20
  • ATtiny10
  • ATtiny9
  • ATtiny5
  • ATtiny4
(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:
l/min (REMOVED)
LDD (REMOVED)
STD (REMOVED)
LD (również uzyskuje dostęp do pamięci programu)
STS LDS (dostęp jest ograniczony do pierwszych 128 bajtów SRAM)
Zredukowany zestaw rejestrów procesora a
(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.

Omówienie zestawu instrukcji Atmel AVR

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