Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy
Wałaszek |
©2023 mgr Jerzy Wałaszek
|
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
SPIS TREŚCI |
Podrozdziały |
SREG: | Rejestr Stanu |
C: | Znacznik przeniesienia (ang. Carry Flag). |
Z: | Znacznik zera (ang. Zero Flag). |
N: | Znacznik wyniku ujemnego (ang. Negative Flag). |
V: | Znacznik nadmiaru dla liczb w kodzie U2 (ang. Overflow Flag). |
S: | Znacznik znaku, równy N
![]() |
H: | Znacznik przeniesienia połówkowego (ang. Half Carry Flag). |
T: | Bit przenoszony, używany przez instrukcje BLD (ang. Bit Load, odczyt bitu) i BST (ang. Bit Store, zapis bitu) (ang. Transfer Bit). |
I: | Znacznik globalnego włączenia/wyłączenia przerwań (ang. Global Interrupt Enable/Disable Flag). |
Rd: | Rejestr docelowy (i źródłowy) w zestawie rejestrów. |
Rr: | Rejestr źródłowy w zestawie rejestrów |
R: | Wynik po wykonaniu instrukcji |
K: | Dane stałe |
k: | Adres stały |
b: | Bit w zestawie rejestrów lub w rejestrze I/O (pole 3-bitowe) |
s: | Bit w rejestrze stanu (pole 3-bitowe) |
X,Y,Z | Rejestr adresowania pośredniego
(ang. Indirect Address Register) (X=R27:R26, Y=R29:R28 i Z=R31:R30) |
A: | Adres komórki I/O |
q: | Przesunięcie dla adresowania bezpośredniego (pole 6-bitowe) |
Rejestry połączone z rejestrami X, Y i Z umożliwiające pośrednie adresowanie całej przestrzeni danych na mikrokontrolerach posiadających przestrzeń danych większą od 64KB oraz umożliwiających pobieranie danych z przestrzeni programu o rozmiarze większym niż 64KB
Rejestr połączony z rejestrem Z umożliwiający bezpośrednie adresowanie całej przestrzeni danych na mikrokontrolerach posiadających przestrzeń danych większą niż 64KB.
Rejestr połączony ze słowem instrukcji umożliwiający pośredni skok i wywołania funkcji w całej przestrzeni programu na mikrokontrolerach posiadających przestrzeń programu większą niż 64KB.
Stos przechowuje adresy powrotne z podprogramów oraz
zawartość umieszczonych na nim rejestrów.
SP: Wskaźnik stosu (ang. Stack Pointer)
X | : | Znacznik zmieniony przez instrukcję |
0 | : | Znacznik wyzerowany przez instrukcję |
1 | : | Znacznik ustawiony przez instrukcję |
– | : | Znacznik niezmieniony przez instrukcję |
Uwaga: Nie wszystkie mikrokontrolery AVR obsługują opisane tutaj tryby adresowania. W takich przypadkach musisz przeanalizować listę instrukcji konkretnego mikrokontrolera, który chcesz programować.
Argument instrukcji zawarty jest w rejestrze d (Rd).
Argumenty instrukcji znajdują się w rejestrach r (Rr) i d (Rd). Wynik jest zapisywany w rejestrze d (Rd).
Adres argumentu zawarty jest w 6 bitach słowa instrukcji. Pole Rr/Rd określa rejestr docelowy lub źródłowy.
Uwaga: | Niektóre złożone mikrokontrolery AVR posiadają więcej modułów peryferyjnych niż można obsłużyć za pomocą zarezerwowanych 64 adresów, które może adresować instrukcja w trybie bezpośredniego we/wy. Rozszerzona pamięć we/wy od adresu 64 do 255 może być osiągnięta jedynie przez adresowanie danych, nie przez adresowanie we/wy. |
16-bitowy adres danych zawarty jest w 16 najmłodszych bitach instrukcji, której kod składa się z 2 słów, czyli z 32 bitów. Pole Rd/Rr określa rejestr docelowy lub źródłowy.
Adres argumentu w przestrzeni danych jest sumą adresu zawartego w rejestrze Y lub Z z zawartością 6-bitowego pola q w słowie instrukcji. Pole Rd/Rr określa rejestr docelowy lub źródłowy.
Adresem argumentu w przestrzeni danych jest zawartość rejestru X, Y lub. W mikrokontrolerach AVR bez pamięci SRAM, tryb pośredni adresowania danych (ang. Data Indirect Addressing) jest nazywany trybem pośrednim adresowania rejestrów (ang. Register Indirect Addressing). Pośrednie adresowanie rejestrów jest podzbiorem pośredniego adresowania danych, ponieważ obszar danych o adresach od 0 do 31 zawiera zestaw rejestrów.
Predekremantacja oznacza wcześniejsze zmniejszenie o 1.
Rejestr X, Y lub Z jest zmniejszany o 1 przed operacją. Adresem argumentu w przestrzeni danych jest zmniejszona zawartość rejestru X, Y lub Z.
Postinkrementacja oznacza późniejsze zwiększenie o 1.
Rejestr X, Y lub Z jest zwiększany o 1 po wykonaniu operacji. Adresem argumentu jest zawartość rejestru X, Y lub Z przed wykonaniem zwiększenia o 1.
Tryb ten odnosi się do instrukcji LPM, ELPM i SPM. Adres bajtu stałej jest określany przez zawartość rejestru Z. Pamięć programu zorganizowana jest w słowa 16-bitowe, zatem każda jej komórka składa się z dwóch bajtów: dolnego (ang. Less Significant Byte, LSB) oraz górnego (ang. More Significant Byte, MSB). 15 starszych bitów rejestru Z stanowi adres komórki ze stałą, czyli adres słowa 16-bitowego. Dla instrukcji LPM najmłodszy bit rejestru Z wybiera dolny bajt stałej, jeśli jest wyzerowany, lub górny bajt stałej, jeśli jest ustawiony na 1. Dla instrukcji SPM najmłodszy bit rejestru Z powinien być wyzerowany. Jeśli jest użyta instrukcja ELPM, to rejestr RAMPZ zostanie wykorzystany do powiększenia rejestru Z.
Ten tryb dotyczy instrukcji LPM Z+ i ELPM Z+. Adres bajtu stałej jest określony przez zawartość rejestru Z. Starsze 15 bitów wybierają adres słowa w pamięci programu. Najmłodszy bit rejestru Z wybiera dolny bajt stałej, jeśli jest wyzerowany, lub górny bajt stałej, jeśli jest ustawiony na 1. W instrukcji ELPM Z+ stosowany jest rejestr RAMPZ do powiększenia rejestru Z.
Tryb ten dotyczy rozkazów JMP i CALL. 6 bitowe pole najmłodszych bitów ze starszego słowa instrukcji zostaje połączone z 16 bitami młodszego słowa instrukcji i 22-bitowy adres jest wpisywany do rejestru licznika rozkazów. W efekcie mikroprocesor jako następną wykona instrukcję leżącą w pamięci programu pod tym 22-bitowym adresem.
Tryb ten dotyczy instrukcji IJMP i ICALL. Zawartość rejestru Z trafia do licznika programu i mikrokontroler wykonuje jako następną instrukcję wskazaną przez ten adres.
Tryb dotyczy instrukcji RJMP i
RCALL. Pole k jest zwiększane o 1 i
dodawane do aktualnej zawartości licznika rozkazów, a wynik
zostaje umieszczony w liczniku rozkazów. W efekcie
mikrokontroler wykona instrukcję spod adresu
Test | Warunek | Mnemonik | Test odwrotny | Warunek | Mnemonik | Komentarz |
Rd > Rr | Z![]() ![]() |
BRLT (1) | Rd ≤ Rr | Z![]() ![]() |
BRGE (1) | Liczby ze znakiem |
Rd ≥ Rr | (N![]() |
BRGE | Rd < Rr | (N![]() |
BRLT | Liczby ze znakiem |
Rd = Rr | Z = 1 | BREQ | Rd ≠ Rr | Z = 0 | BRNE | Liczby ze znakiem |
Rd ≤ Rr | Z![]() ![]() |
BRGE (1) | Rd > Rr | Z![]() ![]() |
BRLT (1) | Liczby ze znakiem |
Rd < Rr | (N![]() |
BRLT | Rd ≥ Rr | (N![]() |
BRGE | Liczby ze znakiem |
Rd > Rr | C![]() |
BRLO (1) | Rd ≤ Rr | C![]() |
BRSH (1) | Liczby bez znaku |
Rd ≥ Rr | C = 0 | BRSH/BRCC | Rd < Rr | C = 1 | BRLO/BRCS | Liczby bez znaku |
Rd = Rr | Z = 1 | BREQ | Rd ≠ Rr | Z = 0 | BRNE | Liczby bez znaku |
Rd ≤ Rr | C![]() |
BRSH (1) | Rd > Rr | C![]() |
BRLO (1) | Liczby bez znaku |
Rd < Rr | C = 1 | BRLO/BRCS | Rd ≥ Rr | C = 0 | BRSH/BRCC | Liczby bez znaku |
Przeniesienie | C = 1 | BRCS | Brak przeniesienia | C = 0 | BRCC | Proste sprawdzenie znacznika |
Ujemny | N = 1 | BRMI | Dodatni | N = 0 | BRPL | Proste sprawdzenie znacznika |
Nadmiar | V = 1 | BRVS | Brak nadmiaru | V = 0 | BRVC | Proste sprawdzenie znacznika |
Zero | Z = 1 | BREQ | Różny od zera | Z = 0 | BRNE | Proste sprawdzenie znacznika |
Uwaga: | (1) Wymień miejscami Rd i Rr w operacji porównania przed testem, np. CP Rd,Rr → CP Rr,Rd |
Mnemonik | Argumenty | Opis | Działanie | Znaczniki | Liczba cykli |
Instrukcje Arytmetyczne i Logiczne | |||||
ADD | Rd, Rr | Add without Carry – Dodawanie bez przeniesienia | Rd ← Rd + Rr | Z,C,N,V,S,H | 1 |
ADC | Rd, Rr | Add with Carry – Dodawanie z przeniesieniem | Rd ← Rd + Rr + C | Z,C,N,V,S,H | 1 |
ADIW | Rd, K | Add Immediate to Word – Dodawanie stałej do słowa | Rd+1:Rd ← Rd+1:Rd + K | Z,C,N,V,S | 2(1) |
SUB | Rd, Rr | Subtract without Carry – Odejmowanie bez przeniesienia | Rd ← Rd - Rr | Z,C,N,V,S,H | 1 |
SUBI | Rd, K | Subtract Immediate – Odejmowanie stałej | Rd ← Rd - K | Z,C,N,V,S,H | 1 |
SBC | Rd, Rr | Subtract with Carry – Odejmowanie z przeniesieniem | Rd ← Rd - Rr - C | Z,C,N,V,S,H | 1 |
SBCI | Rd, K | Subtract Immediate with Carry – Odejmowanie stałej z przeniesieniem | Rd ← Rd - K - C | Z,C,N,V,S,H | 1 |
SBIW | Rd, K | Subtract Immediate from Word – Odejmowanie stałej od słowa | Rd+1:Rd ← Rd+1:Rd - K | Z,C,N,V,S | 2(1) |
AND | Rd, Rr | Logical AND – Logiczne I (koniunkcja) | Rd ← Rd
![]() |
Z,N,V,S | 1 |
ANDI | Rd, K | Logical AND with Immediate – Logiczne I ze stałą | Rd ← Rd
![]() |
Z,N,V,S | 1 |
OR | Rd, Rr | Logical OR – Logiczne LUB (alternatywa) | Rd ← Rd
![]() |
Z,N,V,S | 1 |
ORI | Rd, K | Logical OR with Immediate – Logiczne LUB ze stałą | Rd ← Rd
![]() |
Z,N,V,S | 1 |
EOR | Rd, Rr | Exclusive OR – Suma symetryczna | Rd ← Rd
![]() |
Z,N,V,S | 1 |
COM | Rd | One's Complement – Negacja bitowa U1 | Rd ← 0xFF - Rd | Z,C,N,V,S | 1 |
NEG | Rd | Two's Complement – Negacja arytmetyczna U2 | Rd ← 0x00 - Rd | Z,C,N,V,S,H | 1 |
SBR | Rd, K | Set Bit(s) in Register – Ustawienie bitów w rejestrze | Rd ← Rd
![]() |
Z,N,V,S | 1 |
CBR | Rd, K | Clear Bit(s) in Register – Zerowanie bitów w rejestrze | Rd ← Rd
![]() |
Z,N,V,S | 1 |
INC | Rd | Increment – Zwiększanie o 1 | Rd ← Rd + 1 | Z,N,V,S | 1 |
DEC | Rd | Decrement – Zmniejszanie o 1 | Rd ← Rd - 1 | Z,N,V,S | 1 |
TST | Rd | Test for Zero or Minus – Test na zero lub liczbę ujemną | Rd ← Rd
![]() |
Z,N,V,S | 1 |
CLR | Rd | Clear Register – Zerowanie wszystkich bitów w rejestrze | Rd ← Rd
![]() |
Z,N,V,S | 1 |
SER | Rd | Set Register – Ustawienie wszystkich bitów w rejestrze | Rd ← 0xFF | żaden | 1 |
MUL | Rd, Rr | Multiply Unsigned – Mnożenie liczb bez znaku | R1:R0 ← Rd × Rr (UU) | Z,C | 2(1) |
MULS | Rd, Rr | Multiply Signed – Mnożenie liczb ze znakiem | R1:R0 ← Rd × Rr (SS) | Z,C | 2(1) |
MULSU | Rd, Rr | Multiply Signed with Unsigned – Mnożenie liczby ze znakiem przez liczbę bez znaku | R1:R0 ← Rd × Rr (SU) | Z,C | 2(1) |
FMUL | Rd, Rr | Fractional Multiply Unsigned – Ułamkowe mnożenie liczb bez znaku | R1:R0 ← (Rd × Rr)<<1 (UU) | Z,C | 2(1) |
FMULS | Rd, Rr | Fractional Multiply Signed – Ułamkowe mnożenie liczb ze znakiem | R1:R0 ← (Rd × Rr)<<1 (SS) | Z,C | 2(1) |
FMULSU | Rd, Rr | Fractional Multiply Signed with Unsigned – Ułamkowe mnożenie liczby ze znakiem przez liczbę bez znaku | R1:R0 ← (Rd × Rr)<<1 (SU) | Z,C | 2(1) |
Instrukcje Rozgałęzień | |||||
RJMP | k | Relative Jump – Skok względny | PC ← PC + k + 1 | żaden | 2 |
IJMP | Indirect Jump to (Z) – Skok pośredni pod adres w rejestrze Z | PC(15:0) ← Z, PC(21:16) ← 0 | żaden | 2(1) | |
EIJMP | Extended Indirect Jump to (Z) – Rozszerzony skok pośredni pod adres w rejestrze Z | PC(15:0) ← Z, PC(21:16) ← EIND | żaden | 2(1) | |
JMP | k | Jump – Skok | PC ← k | żaden | 3(1) |
RCALL | k | Relative Call Subroutine – Względne wywołanie podprogramu | PC ← PC + k + 1 | żaden | 3 / 4(4) |
ICALL | Indirect Call to (Z) – Pośrednie wywołanie podprogramu o adresie w rejestrze Z | PC(15:0) ← Z, PC(21:16) ← 0 | żaden | 3 / 4(1)(4) | |
EICALL | Extended Indirect Call to (Z) – Rozszerzone pośrednie wywołanie podprogramu o adresie w rejestrze Z | PC(15:0) ← Z, PC(21:16) ← EIND | żaden | 4(1)(4) | |
CALL | k | Call Subroutine – Wywołanie podprogramu | PC ← k | żaden | 4 / 5(1)(4) |
RET | Subroutine Return – Powrót z podprogramu | PC ← STACK | żaden | 4 / 5(4) | |
RETI | Interrupt Return – Powrót z przerwania | PC ← STACK | I | 4 / 5(4) | |
CPSE | Rd, Rr | Compare, Skip if Equal – Porównanie z pominięciem następnej instrukcji, jeśli argumenty równe | jeśli (Rd = Rr), to PC ← PC + 2 lub 3 | żaden | 1 / 2 / 3 |
CP | Rd, Rr | Compare – Porównanie | Rd - Rr | Z,C,N,V,S,H | 1 |
CPC | Rd, Rr | Compare with Carry – Porównanie z przeniesieniem | Rd - Rr - C | Z,C,N,V,S,H | 1 |
CPI | Rd, K | Compare with Immediate – Porównanie ze stałą | Rd - K | Z,C,N,V,S,H | 1 |
SBRC | Rr, b | Skip if Bit in Register Cleared – Pominięcie następnej instrukcji, jeśli bit w rejestrze w stanie 0 | jeśli (Rr(b)=0), to PC ← PC + 2 lub 3 | żaden | 1 / 2 / 3 |
SBRS | Rr, b | Skip if Bit in Register Set – Pominięcie następnej instrukcji, jeśli bit w rejestrze w stanie 1 | jeśli (Rr(b)=1), to PC ← PC + 2 lub 3 | żaden | 1 / 2 / 3 |
SBIC | A, b | Skip if Bit in I/O Register Cleared – Pominięcie następnej instrukcji, jeśli bit w rejestrze we/wy w stanie 0 | jeśli (I/O(A,b)=0), to PC ← PC + 2 lub 3 | żaden | 1 / 2 / 3 |
SBIS | A, b | Skip if Bit in I/O Register Set – Pominięcie następnej instrukcji, jeśli bit w rejestrze we/wy w stanie 1 | jeśli (I/O(A,b)=1), to PC ← PC + 2 lub 3 | żaden | 1 / 2 / 3 |
BRBS | s, k | Branch if Status Flag Set – Skok warunkowy, jeśli znacznik stanu ustawiony | jeśli (SREG(s) = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRBC | s, k | Branch if Status Flag Cleared – Skok warunkowy, jeśli znacznik stanu wyzerowany | jeśli (SREG(s) = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BREQ | k | Branch if Equal – Skok warunkowy, jeśli równe | jeśli (Z = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRNE | k | Branch if Not Equal – Skok warunkowy, jeśli różne | jeśli (Z = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRCS | k | Branch if Carry Set – Skok warunkowy, jeśli jest przeniesienie | jeśli (C = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRCC | k | Branch if Carry Cleared – Skok warunkowy, jeśli nie ma przeniesienia | jeśli (C = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRSH | k | Branch if Same or Higher – Skok względny, jeśli takie same lub wyższe | jeśli (C = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRLO | k | Branch if Lower – Skok warunkowy, jeśli niższe | jeśli (C = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRMI | k | Branch if Minus – Skok warunkowy przy minusie | jeśli (N = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRPL | k | Branch if Plus – Skok warunkowy przy plusie | jeśli (N = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRGE | k | Branch if Greater or Equal, Signed – Skok warunkowy, jeśli większe lub równe, liczby ze znakiem | jeśli (N
![]() |
żaden | 1 / 2 |
BRLT | k | Branch if Less Than, Signed – Skok warunkowy, jeśli mniejsze, liczby ze znakiem | jeśli (N
![]() |
żaden | 1 / 2 |
BRHS | k | Branch if Half Carry Flag Set – Skok warunkowy, jeśli przeniesienie połówkowe ustawione | jeśli (H = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRHC | k | Branch if Half Carry Flag Cleared – Skok warunkowy, jeśli przeniesienie połówkowe wyzerowane | jeśli (H = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRTS | k | Branch if T Flag Set – Skok warunkowy, jeśli znacznik T ustawiony | jeśli (T = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRTC | k | Branch if T Flag Cleared – Skok warunkowy, jeśli znacznik T wyzerowany | jeśli (T = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRVS | k | Branch if Overflow Flag is Set – Skok warunkowy, jeśli znacznik nadmiaru V ustawiony | jeśli (V = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRVC | k | Branch if Overflow Flag is Cleared – Skok warunkowy, jeśli znacznik nadmiaru V wyzerowany | jeśli (V = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRIE | k | Branch if Interrupt Enabled – Skok warunkowy przy uaktywnionych przerwaniach | jeśli ( I = 1), to PC ← PC + k + 1 | żaden | 1 / 2 |
BRID | k | Branch if Interrupt Disabled – Skok warunkowy przy przerwaniach zablokowanych | jeśli ( I = 0), to PC ← PC + k + 1 | żaden | 1 / 2 |
Instrukcje Przesyłu Danych | |||||
MOV | Rd, Rr | Copy Register – Kopiowanie rejestru | Rd ← Rr | żaden | 1 |
MOVW | Rd, Rr | Copy Register Pair – Kopiowanie pary rejestrów | Rd+1:Rd ← Rr+1:Rr | żaden | 1(1) |
LDI | Rd, K | Load Immediate – Ładowanie stałej | Rd ← K | żaden | 1 |
LDS | Rd, k | Load Direct from data space – Ładowanie bezpośrednie z przestrzeni danych | Rd ← (k) | żaden | 2(1)(4) |
LD | Rd, X | Load Indirect – Ładowanie pośrednie | Rd ← (X) | żaden | 2(2)(4) |
LD | Rd, X+ | Load Indirect and Post-Increment – Ładowanie pośrednie z postinkrementacją | Rd ← (X), X ← X + 1 | żaden | 2(2)(4) |
LD | Rd, -X | Load Indirect and Pre-Decrement – Ładowanie pośrednie z predekrementacją | X ← X - 1, Rd ← (X) | żaden | 2(2)(4) |
LD | Rd, Y | Load Indirect – Ładowanie pośrednie | Rd ← (Y) | żaden | 2(2)(4) |
LD | Rd, Y+ | Load Indirect and Post-Increment – Ładowanie pośrednie z postinkrementacją | Rd ← (Y), Y ← Y + 1 | żaden | 2(2)(4) |
LD | Rd, -Y | Load Indirect and Pre-Decrement – Ładowanie pośrednie z predekrementacją | Y ← Y - 1, Rd ← (Y) | żaden | 2(2)(4) |
LDD | Rd,Y+q | Load Indirect with Displacement – Ładowanie pośrednie z przesunięciem | Rd ← (Y + q) | żaden | 2(1)(4) |
LD | Rd, Z | Load Indirect – Ładowanie pośrednie | Rd ← (Z) | żaden | 2(2)(4) |
LD | Rd, Z+ | Load Indirect and Post-Increment – Ładowanie pośrednie z postinkrementacją | Rd ← (Z), Z ← Z+1 | żaden | 2(2)(4) |
LD | Rd, -Z | Load Indirect and Pre-Decrement – Ładowanie pośrednie z predekrementacją | Z ← Z - 1, Rd ← (Z) | żaden | 2(2)(4) |
LDD | Rd, Z+q | Load Indirect with Displacement – Ładowanie pośrednie z przesunięciem | Rd ← (Z + q) | żaden | 2(1)(4) |
STS | k, Rr | Store Direct to data space – Zapis bezpośredni w przestrzeni danych | (k) ← Rd | żaden | 2(1)(4) |
ST | X, Rr | Store Indirect – Zapis pośredni z indeksem X | (X) ← Rr | żaden | 2(2)(4) |
ST | X+, Rr | Store Indirect and Post-Increment – Zapis pośredni z postinkrementacją z indeksem X | (X) ← Rr, X ← X + 1 | żaden | 2(2)(4) |
ST | -X, Rr | Store Indirect and Pre-Decrement – Zapis pośredni z predekrementacją z indeksem X | X ← X - 1, (X) ← Rr | żaden | 2(2)(4) |
ST | Y, Rr | Store Indirect – Zapis pośredni z indeksem Y | (Y) ← Rr | żaden | 2(2)(4) |
ST | Y+, Rr | Store Indirect and Post-Increment – Zapis pośredni z postinkrementacją z indeksem Y | (Y) ← Rr, Y ← Y + 1 | żaden | 2(2)(4) |
ST | -Y, Rr | Store Indirect and Pre-Decrement – Zapis pośredni z predekrementacją z indeksem Y | Y ← Y - 1, (Y) ← Rr | żaden | 2(2)(4) |
STD | Y+q,Rr | Store Indirect with Displacement – Zapis pośredni z przesunięciem z indeksem Y | (Y + q) ← Rr | żaden | 2(1)(4) |
ST | Z, Rr | Store Indirect – Zapis pośredni z indeksem Z | (Z) ← Rr | żaden | 2(2)(4) |
ST | Z+, Rr | Store Indirect and Post-Increment – Zapis pośredni z postinkrementacją z indeksem Z | (Z) ← Rr, Z ← Z + 1 | żaden | 2(2)(4) |
ST | -Z, Rr | Store Indirect and Pre-Decrement – Zapis pośredni z predekrementacją z indeksem Z | Z ← Z - 1, (Z) ← Rr | żaden | 2(2)(4) |
STD | Z+q,Rr | Store Indirect with Displacement – Zapis pośredni z przesunięciem z indeksem Z | (Z + q) ← Rr | żaden | 2(1)(4) |
LPM | Load Program Memory – Ładowanie z pamięci programu | R0 ← (Z) | żaden | 3(3) | |
LPM | Rd, Z | Load Program Memory – Ładowanie z pamięci programu | Rd ← (Z) | żaden | 3(3) |
LPM | Rd, Z+ | Load Program Memory and Post-Increment – Ładowanie z pamięci programu z postinkrementacją | Rd ← (Z), Z ← Z + 1 | żaden | 3(3) |
ELPM | Extended Load Program Memory – Rozszerzone ładowanie z pamięci programu | R0 ← (RAMPZ:Z) | żaden | 3(1) | |
ELPM | Rd, Z | Extended Load Program Memory – Rozszerzone ładowanie z pamięci programu | Rd ← (RAMPZ:Z) | żaden | 3(1) |
ELPM | Rd, Z+ | Extended Load Program Memory and Post-Increment – Rozszerzone ładowanie z pamięci programu z postinkrementacją | Rd ← (RAMPZ:Z), Z ← Z + 1 | żaden | 3(1) |
SPM | Store Program Memory – Zapis w pamięci programu | (Z) ← R1:R0 | żaden | -(1) | |
IN | Rd, A | In From I/O Location – Odczyt z komórki we/wy | Rd ← I/O(A) | żaden | 1 |
OUT | A, Rr | Out To I/O Location – Zapis do komórki we/wy | I/O(A) ← Rr | żaden | 1 |
PUSH | Rr | Push Register on Stack – Zapis rejestru na stos | STACK ← Rr | żaden | 2(1) |
POP | Rd | Pop Register from Stack – Pobranie rejestru ze stosu | Rd ← STACK | żaden | 2(1) |
Instrukcje Operacji na Bitach oraz Testowania Bitów | |||||
LSL | Rd | Logical Shift Left – Logiczne przesunięcie w lewo | Rd(n+1)←Rd(n),Rd(0) ← 0,C←Rd(7), n=0..6 | Z,C,N,V,H | 1 |
LSR | Rd | Logical Shift Right – Logiczne przesunięcie w prawo | Rd(n)←Rd(n+1),Rd(7) ← 0,C←Rd(0), n=0..6 | Z,C,N,V | 1 |
ROL | Rd | Rotate Left Through Carry – Obrót w lewo poprzez przeniesienie | Rd(0)←C,Rd(n+1) ← Rd(n),C←Rd(7), n=0..6 | Z,C,N,V,H | 1 |
ROR | Rd | Rotate Right Through Carry – Obrót w prawo poprzez przeniesienie | Rd(7)←C,Rd(n)←Rd(n+1),C ← Rd(0), n=0..6 | Z,C,N,V | 1 |
ASR | Rd | Arithmetic Shift Right – Arytmetyczne przesunięcie w prawo | Rd(n) ← Rd(n+1), n=0..6 | Z,C,N,V | 1 |
SWAP | Rd | Swap Nibbles – Wymiana 4 górnych bitów z 4 dolnymi | Rd(3..0) ↔ Rd(7..4) | żaden | 1 |
BSET | s | Flag Set – Ustawienie znacznika w rejestrze stanu SREG | SREG(s) ← 1 | SREG(s) | 1 |
BCLR | s | Flag Clear – Zerowanie znacznika w rejestrze stanu SREG | SREG(s) ← 0 | SREG(s) | 1 |
SBI | A, b | Set Bit in I/O Register – Ustawienie bitu w rejestrze we/wy | I/O(A, b) ← 1 | żaden | 2 |
CBI | A, b | Clear Bit in I/O Register – Zerowanie bitu w rejestrze we/wy | I/O(A, b) ← 0 | żaden | 2 |
BST | Rr, b | Bit Store from Register to T – Zapis bitu z rejestru w T | T ← Rr(b) | T | 1 |
BLD | Rd, b | Bit load from T to Register – Załadowanie bitu z T do rejestru | Rd(b) ← T | żaden | 1 |
SEC | Set Carry – Ustawienie przeniesienia | C ← 1 | C | 1 | |
CLC | Clear Carry – Zerowanie przeniesienia | C ← 0 | C | 1 | |
SEN | Set Negative Flag – Ustawienie znacznika wyniku ujemnego | N ← 1 | N | 1 | |
CLN | Clear Negative Flag – Zerowanie znacznika wyniku ujemnego | N ← 0 | N | 1 | |
SEZ | Set Zero Flag – Ustawienie znacznika zera | Z ← 1 | Z | 1 | |
CLZ | Clear Zero Flag – Zerowanie znacznika zera | Z ← 0 | Z | 1 | |
SEI | Global Interrupt Enable – Globalne włączenie przerwań | I ← 1 | I | 1 | |
CLI | Global Interrupt Disable – Globalne wyłączenie przerwań | I ← 0 | I | 1 | |
SES | Set Signed Test Flag – Ustawienie znacznika znaku wyniku | S ← 1 | S | 1 | |
CLS | Clear Signed Test Flag – Zerowanie znacznika znakowego | S ← 0 | S | 1 | |
SEV | Set Two’s Complement Overflow – Ustawienie znacznika nadmiaru U2 | V ← 1 | V | 1 | |
CLV | Clear Two’s Complement Overflow – Zerowanie znacznika nadmiaru U2 | V ← 0 | V | 1 | |
SET | Set T in SREG – Ustawienie bitu T w rejestrze stanu | T ← 1 | T | 1 | |
CLT | Clear T in SREG – Zerowanie bitu T w rejestrze stanu | T ← 0 | T | 1 | |
SEH | Set Half Carry Flag in SREG – Ustawienie znacznika przeniesienia połówkowego w rejestrze stanu | H ← 1 | H | 1 | |
CLH | Clear Half Carry Flag in SREG – Zerowanie znacznika przeniesienia połówkowego w rejestrze stanu | H ← 0 | H | 1 | |
Instrukcje Sterujące Mikrokontrolerem | |||||
BREAK | Break – Przerwanie wykonywania programu (zobacz na opis BREAK) | żaden | 1(1) | ||
NOP | No Operation – Operacja pusta | żaden | 1 | ||
SLEEP | Sleep – Wejście w tryb uśpienia (zobacz na opis Sleep) | żaden | 1 | ||
WDR | Watchdog Reset – Reset licznika zegarowego (zobacz na opis WDR) | żaden | 1 |
Uwagi: | 1.Ta instrukcja nie jest dostępna na wszystkich mikrokontrolerach AVR. Zobacz do danych technicznych konkretnego mikrokontrolera. |
2. Nie wszystkie warianty tej instrukcji są dostępne na wszystkich mikrokontrolerach AVR. Zobacz do danych technicznych konkretnego mikrokontrolera. | |
3. Nie wszystkie warianty instrukcji LPM są dostępne na wszystkich mikrokontrolerach AVR. Zobacz do danych technicznych konkretnego mikrokontrolera. Instrukcja LPM nie jest wcale zaimplementowana na AT90S1200. | |
4. Liczba cykli przy dostępie do pamięci danych zakłada dostępy do pamięci wewnętrznej i nie jest prawidłowa dla dostępów poprzez interfejs pamięci zewnętrznej RAM. Dla LD, ST, LDS, STS, PUSH, POP dodaj jeden cykl plus jeszcze jeden dla każdego stanu oczekiwania. Dla CALL, ICALL, EICALL, RCALL, RET, RETI w mikrokontrolerach z 16-bitowym licznikiem rozkazów PC, dodaj trzy cykle plus dwa cykle dla każdego stanu oczekiwania Dla CALL, ICALL, EICALL, RCALL, RET, RETI w mikrokontrolerach z 22-bitowym licznikiem rozkazów PC, dodaj pięć cykli plus trzy cykle dla każdego stanu oczekiwania. |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.