forum
szukaj
literatura
linki
mapa strony
Powrót na stronę główną
ASM IDE
Od czego zacząć? - Co to jest mikrokontroler? -
Kody i liczby
Podstawowe układy logiczne - Budowa i działanie AT90S2313
Zestawy uruchomieniowe -
Kurs BASCOM-AVR w przyk
Kurs C dla AVR w przykładach -
Kurs Asemblera dla AVR w
przykładach -
Gotowe projekty
Mikrokontrolery
na
Kurs BASCOM-AVR
Panuje powszechna opinia, że asembler jest trudny do nauki
niedawna myślałem. Przeciwnicy pisania programów w asemblerze
twierdzą, że przy istniejących językach wysokiego poziomu (BASCOM i
C)), które przyspieszają proces pisania programu, nie jest to uzasadnione
ekonomicznie. Zwolennicy natomiast twierdzą, że tylko w asemblerze da
się napisać zoptymalizowany np. pod względem zależności czasowych
program - pisząc to samo w C czy Bascomie nie zawsze da si
zapanować nad kodem wynikowym. Każdy ma swoje racje. Nie b
tego wątku tutaj rozwijał gdyż wybór zależy od Ciebie, a skoro czytasz
te słowa to znaczy, że temat Cię zainteresował.
Kurs asemblera
Najlepszym argumentem z jakim się spotkałem przemawiaj
nauką asemblera, to ten który przeczytałem na stronie internetowej
http://www.avr-asm-tutorial.net/
:
"Assembler or other languages, that is the question. Why should I learn
another language, if I already learned other programming languages?
The best argument: while you live in France you are able to get through
by speaking english, but you will never feel at home then, and life
remains complicated. You can get through with this, but it is rather
inappropriate. If things need a hurry, you should use the country's
language."
Tak więc wybór zostawiam Tobie
Wprowadzenie do języka asembler
Poniżej widnieje spis elementów języka asembler, z któ
zapoznać przed przystąpieniem do praktycznych ćwiczeń
kliknąć w wybrany odnośnik aby przenieść się do właściwego miejsca.
Co to jest asembler?
Elementy języka asembler
Dyrektywy
Funkcje i operatory w wyrażeniach
Instrukcje asemblera
Lista rozkazów mikrokontrolerów AVR
do
Co to jest asembler?
Aby odpowiedzieć na to pytanie najpierw trzeba odpowiedzie
pytanie, co to jest program dla mikrokontrolera.
[4]
Program jest to ci
instrukcji danego procesora wykonywanych jeden po drugim w
określonej przez programistę kolejności. Ciąg ten zapisany w formie
symbolicznej (czyli z użyciem symbolicznych nazw instrukcji)
stworzony przez programistę nazywa się programem źród
sam program przetworzony przez kompilator do postaci kod
mikroprocesora nazywamy programem binarnym lub programem
wykonywalnym. Ten podział spowodowany jest tym, że mikrokontrolery
Strona 1 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
nie mogą wykonywać programów źródłowych, ponieważ
ciągu zer i jedynek będących kodami instrukcji. Z drugiej strony
człowiek nie może poruszać się w programie binarnym, poniewa
dla niego kompletnie nieczytelny. Stosowany do przetwarzania z zapisu
ź
ródłowego na postać binarną program jest kompilatorem, czyli
programem tłumaczącym jedną postać na drugą. Dla unikni
problemów z interpretacją zapisów w programach stworzony jest
specjalny język programowania. Takim językiem jest asembler (jako
podstawowy i elementarny język programowania). Oprócz asemblera s
stosowane inne języki programowania, wśród których najwi
popularnością cieszy się język C.
Język programowania należy uważać za sformalizowany system regu
służących do opisu czynności jakie ma wykonać program.
Sformalizowanie oznacza jednoznaczne określenie składni j
zdefiniowanie pewnego zbioru słow (w sensie wyrazów) o
określonym znaczeniu.
W programie używa się symbolicznych nazw instrukcji, wskazuje si
poprzez nazwy używane zmienne, miejsca w programie. Ka
(nazwa instrukcji, nazwa zmiennej) występująca w programie musi by
kompilatorowi nazwą znaną (przykładowo wszystkie nazwy
zdefiniowane w opisie języka). Wprowadzenie przez programist
nowych nazw jest związane z jednoznacznym określeniem jej znaczenia.
W pewnych sytuacjach użycie nowej nazwy musi być poprzedzone jej
definicją, która informuje kompilator o jej znaczeniu (przyk
być nazwy zdefiniowane dyrektywami .equ, .def ). W wielu przypadkach
dopuszcza się używanie nowych nazw bez ich wcześniejszego okre
(jak nazw etykiet jako miejsc w programie), które muszą by
w obrębie programu. Kompilator po napotkaniu końca programu
ź
ródłowego sprawdzi, czy wszystkie użyte w programie nazwy s
jednoznacznie określone. Jednoznaczność oznacza, że nie mo
przykładowo w programie umieszczona jakaś etykieta w dw
miejscach.
Proces kompilacji (tłumaczenia z przykładowo języka asemblera na
postać akceptowaną przez mikrokontrolery) może przebiega
sposób (jest kilka programów różnych producentów będących
kompilatorem języka asembler). Kompilator dostarczony przez firm
ATMEL jest programem, który tłumaczy i linkuje program (linkowanie
programu oznacza określenie adresów wszystkich element
występujących w programie). Wynikiem działania tego kompilatora jest
gotowy do uruchomienia program. W innych rozwiązaniach
kompilatorów proces tłumaczenia i linkowania jest rozdzielony.
Kompilator przetwarzając tekst programu generuje postać
skompilowaną (postać, w której instrukcje są zamienione na
odpowiednie kody ale występują jeszcze symboliczne odwo
zmiennych lub procedur). W procesie tworzenia programu dla
mikrokontrolera występuje dodatkowy składnik, jakim jest oddzielny
program do linkowania. Linker składa wszystkie fragmenty cz
skompilowane w jedną całość uzupełniając wszystkie wzajemne
powiązania między występującymi jeszcze nazwami symbolicznymi.
do
Elementy języka asembler
[4]
Program źródłowy napisany w języku asemblera składa si
• instrukcji zapisanych w postaci symbolicznej,
• etykiet,
Strona 2 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
• dyrektyw,
• stałych liczbowych,
• napisów oraz nazw zdefiniowanych przez programistę
Ich format zapisu jest określony i jednoznaczny. Jako nazw
szerokim znaczeniu) należy rozumieć każdy zapis, czyli ci
składający się liter, cyfr oraz znaku podkreślenia "_" zaczynaj
litery lub znaku podkreślenia. Stosuje się je do szeroko poj
rozróżniania wszystkich części składowych programu (nazwy
zmiennych, procedur, etykiet). Liczby to są zapisy składaj
(oraz liter od "a" do "f" w przypadku liczb w zapisie szesnastkowym).
Mogą być one zapisane w systemie dziesiętnym, szesnastkowym (hex)
lub dwójkowym (binarnym). Do rozpoznania systemu zapisu liczb
używane są pewne prefiksy poprzedzające samą liczbę, są
• 0x (zero i x) lub znak $ dla liczb zapisanych szesnastkowo,
• 0b (zero i b) dla liczba zapisywanych dwójkowo.
Jeżeli liczba nie jest poprzedzona żadnym prefiksem okre
system zapisu, to przyjmowane jest, że liczba zapisana w systemie
dziesiętnym. Przykłady liczb:
• 10 – liczba w zapisie dziesiętnym,
• 255 – liczba w zapisie dziesiętnym,
• 0x0A – liczba w zapisie szesnastkowym,
• $FF – liczba w zapisie szesnastkowym,
• 0b11010011 – liczba w zapisie dwójkowym.
Napisy są to stałe tekstowe, które zapisywane są jako ciąg dowolnych
znaków ujęty w apostrofy. Każdy znak z napisu jest zamieniany na
liczbę wynikającą z przyporządkowania znakom określonych kod
liczbowych zgodnie z powszechnie obowiązującą normą ISO.
Komentarz w języku asemblera zaczyna się od znaku ";" (
obowiązuje do końca wiersza. W komentarzu mogą być zawarte
dowolne znaki. Kompilator nie analizuje informacji zawartych w
komentarzu.
[5]
Każda linijka programu może zawierać maksymalnie 120 znak
Każda linijka programu napisanego w asemblerze może mie
poniższych postaci:
[etykieta:] dyrektywa [argumenty] [komentarz]
[etykieta:] instrukcja [argumenty] [komentarz]
komentarz
pusta linia
gdzie [komentarz] ma postać ; [tekst]
Przykłady:
etykieta: .EQU var1
=
100
; var1 przyjmuje wartość 100 (dyrektywa)
.EQU var2
=
200
; var2 przyjmuje wartość 200
test:
rjmp
test
; nieskończona pętla (instrukcja)
; linia komentarza
; inny komentarz
do
Dyrektywy
[4] [5]
Dyrektywy w języku asembler spełniają dwie funkcje: s
zapisami sterującymi pracą kompilatora oraz definiują dodatkowe
rezerwuje zasoby w SRAM
BYTE
Strona 3 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
początek segmentu kodu
CSEG
elementy programu (jak stałe, napisy, makra itp.). Różne kompilatory
przyjmują zapis tych dyrektyw w różnej formie. Przykładowo
kompilator języka asembler związany z programem AVR STUDIO
wymaga zapisu nazwy dyrektywy ze znakiem kropki bezpo
dyrektywą, kompilatory dostarczane przez firmę IAR wymagaj
zapisu. Poniższy opis dotyczy oprogramowania oferowanego przez firm
ATMEL jako oprogramowania bezpłatnego (czyli dyrektywy w zapisie z
kropką, pisownia małymi lub wielkimi literami na ma znaczenia). Z
lewej strony widnieje wykaz dyrektyw z krótkim opisem, pe
każdej dyrektywy znajdziesz w pliku pomocy w AVR Studio
języku angielskim) lub "klikając" w nazwę dyrektywy przejdziesz do
opisu na tej stronie.
BYTE
Dyrektywa BYTE rezerwuje zasoby w pamięci SRAM. Mo
używana jedynie w segmencie danych (
DSEG
). BYTE wymaga jednego
argumentu określającego wielkość rezerwowanych zasobó
zmiennej określonej w etykiecie, która musi poprzedzać dyrektyw
BYTE. Wielkość definiowanej zmiennej może być zapisana w postaci
wyrażenia arytmetycznego (w wyrażeniu mogą wystąpić bezpo
liczby lub
wprowadza stałe 1 bajtowe
DB
nadaje rejestrowi inną nazwę
DEF
określa typ mikrokontrolera
DEVICE
początek segmentu danych
DSEG
wprowadza stałe 2 bajtowe
DW
koniec definicji makroinstrukcji
ENDMACRO
ENDM
definiowanie stałych
EQU
początek segmentu EEPROM
ESEG
koniec kompilacji pliku
EXIT
dołączenie wskazanego pliku
INCLUDE
tworzenie raportu z kompilacji
LIST
raport z kompilacji z makro
LISTMAC
definicja makroinstrukcji
MACRO
wyłączenie raportu z kompilacji
NOLIST
początek adresacji segmentu
ORG
przypisanie wartości wyrażenia
SET
identyfikatory wcześniej zdefiniowanych stałych liczbowych), kt
wartość musi być wyliczalna przez kompilator.
Składnia:
etykieta: .BYTE wyrażenie
Przykład:
.DSEG
RSBufor: .BYTE 16
; rezerwuje 16 bajtów dla RSBufor
CSEG
Dyrektywa CSEG oznacza, że wszystkie dalsze zapisy (instrukcji,
danych włączonych do kodu itp.) dotyczą pamięci programu (pami
FLASH). Miejsce (w sensie adresowym) umieszczenia generowanego
przez kompilator kodu wynika z dyrektywy
ORG
. Kolejne zapisy
powodują automatyczne zwiększanie adresu. Jeżeli w programie nie
wystąpi żadna dyrektywa określająca rodzaj segmentu, to kompilator
wszystko umieści w segmencie CSEG. W obrębie tego segmentu nie
mogą występować dyrektywy przewidziane do deklaracji zmiennych.
Brak wystąpienie dyrektywy
ORG
implikuje adresację od adresu o
wartości 0 (zero). Dyrektywa nie zawiera żadnego argumentu.
Składnia:
.CSEG
Przykład:
.CSEG
Main:
sbi
PORTB,0
; PORTB.0 = 1
DB, DW
Dyrektywy DB i DW rezerwują zasoby w pamięci programu lub pami
EEPROM. Dyrektywy te muszą być poprzedzone etykietą
argumentów, które mogą być w postaci listy wyrażeń (co najmniej jedno
wyrażenie). Etykieta określa adres inicjowanych zasobów pami
Strona 4 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
wyrażenie dla DB to wartość bajtowa, a dla DW dwubajtowa.
Dyrektywa DB wprowadza stałe o strukturze bajtowej (liczby sta
bajtowe oraz napisy), dyrektywa DW wprowadza stałe o strukturze
dwubajtowej (liczby stałe 16-bitowe, adresy zmiennych i etykiet
w programie). W przypadku użycia dyrektywy DB należy pami
obszar wprowadzany tą dyrektywą zostanie uzupełniony bajtem
o wartości zero gdy jego wielkość będzie nieparzysta. W dyrektywach
tych pod symbolem lista wyrażeń należy rozumieć listę wyra
rozdzielonych przecinkami. Długie listy stałych w dyrektywach mo
przenosić do następnego wiersza (pamiętając o tym, by przerwa
parzystej liczbie bajtów) poprzez ponowne użycie tej samej dyrektywy
ale bez etykiety (łącznie z dwukropkiem). W przypadku uż
dyrektywy DW dodatkowego komentarza wymaga kolejno
umieszczonych bajtów. W pierwszej kolejności zapisany jest bajt b
młodszą częścią stałej oraz następnie bajt będący starszą cz
Składnia:
etykieta: .DB lista wyrażeń
Przykłady:
Function: .DB 0x0D,0x0A,"System kontroli.",0x0D,0x0A
.DW "Wersja sprzętu: 1.00",0x0D,0x0A
CodeArr: .DB '0' , '1'
.DW '2' , '3'
w każdym przypadku lista stałych zawiera parzystą liczbę
CmmSrvArr: .DB Cmm0Service
.DW Cmm1Service
.DW Cmm2Service
gdzie wszystkie stałe wypisane przy dyrektywie DW są nazwami etykiet
w programie.
DEF
Dyrektywa DEF pozwala nadać rejestrowi inną nazwę, któ
można używać w instrukcjach - nadal należy pamiętać, że wprowadzona
nazwa tak naprawdę jest rejestrem.
Składnia:
.DEF definiowana nazwa = symbol rejestru
Przykład:
.DEF acc = r16
określa, że nazwa ‘acc’ występująca jako argument w instrukcji jest
rejestrem r16. Taki zabieg znacznie zwiększa czytelność programu.
DEVICE
Dyrektywa DEVICE służy do poinformowania kompilatora na jaki
model mikrokontrolera ma być generowany kod programu. Kompilator
musi znać tą informację, czyli w każdym programie musi wyst
dyrektywa jeden raz. W programie poprzez dyrektywę INCLUDE
dołącza się do programu jeden z plików definiujących środowisko
mikrokontrolera i między innymi zawarta tam jest ta dyrektywa. Te pliki
definiujące dostarcza producent mikrokontrolerów, dla AT90S2313 taki
plik ma nazwę 2313def.inc, a znajduje się w przypadku zainstalowanego
AVR-Studio 4.09 w katalogu C:\Program Files\Atmel\AVR
Tools\AvrAssembler\Appnotes - można sobie pod notatnikiem otworzy
Strona 5 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
taki plik i przeanalizować wszystkie definicje.
Składnia:
.DEVICE symbol mikrokontrolera
Przykład:
.DEVICE AT90S2313
DSEG
Dyrektywa DSEG oznacza, że wszystkie dalsze zapisy definiuj
zmienne. Adres, na jakim zostanie umieszczona zmienna mo
zmieniany dyrektywą ORG. Brak dyrektywy
ORG
w obszarze
przewidzianym na zmienne oznacza, że kompilator zacznie adresowa
od adresu 60 hex. W obrębie segmentu danych nie mogą wyst
zapisy wymuszające określone wartości (np. nie można utworzy
zmiennej, która ma określoną wartość początkową, należy j
jako typową zmienną i w programie zawrzeć instrukcje, kt
tej zmiennej określoną wartość).
Składnia:
.DSEG
Przykład:
.DSEG
var: .BYTE 1
co oznacza zarezerwowanie jednego bajtu pamięci dla zmiennej
ENDMACRO, ENDM
Dyrektywa ENDMACRO lub ENDM oznacza koniec definicji
makroinstrukcji zapoczątkowanej dyrektywą
MACRO
. Nie wymaga
ż
adnych argumentów.
Składnia:
.ENDMACRO
lub
.ENDM
Przykład:
.MACRO ldz
; początek definicji makroinstrukcji
.
;
.
; definicja makroinstrukcji
.
;
.ENDMACRO
; koniec definicji makroinstrukcji
EQU
Dyrektywa służy do definiowania stałych, przydziela ona jakiemu
identyfikatorowi (nazwie) określoną wartość (może to być
która może być później użyta w jakimś wyrażeniu. Tak zdefiniowana
stała nie może być zmieniana czy też redefiniowana.
Składnia:
.EQU nazwa = wyrażenie
Przykład:
.EQU x1 = 'x'
Strona 6 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
.EQU x2 = 145
W powyższych przykładach przyporządkowana jest identyfikatorowi
taka wartość bitowa, która odpowiada małej literze x, w drugim
przypadku identyfikator x2 ma wartość liczbową 145.
ESEG
Dyrektywa ESEG oznacza, że wszystkie dalsze zapisy odnosz
pamięci EEPROM. W segmencie zapoczątkowanym przez dyrektyw
ESEG znajdują się tylko dyrektywy
DB
i
DW
. Adresacja zmiennych jest
określona przez dyrektywę
ORG
(brak specyfikacji ORG w obr
pamięci EEPROM oznacza wartość początkowa równą zero). W tym
segmencie możliwe jest, oprócz powołania do istnienia zmiennej,
nadanie jej określonej wartości początkowej. W strukturze postaci
wynikowej programu (najczęściej w formacie heksadecymalnym) jest
przewidziane na to miejsce i programator (w trakcie programowania
mikrokontrolera) umieści w tej pamięci określone wartości pocz
Nie oznacza to jednak, że program w czasie pracy nie moż
wartości tych zmiennych. Każde następne uruchomienie programu w
zmiennych tych będzie zawierać wartość ostatnio zapisaną
same nigdy nie zmienią swej wartości).
Składnia:
.ESEG
Przykład:
.ESEG
CodeArr: .DB '0' , '1'
EXIT
Dyrektywa EXIT oznacza zakończenie kompilacji z danego pliku.
Podczas normalnej pracy kompilacja trwa do końca pliku je
dołączonym przez dyrektywę
INCLUDE
pliku pojawi się
EXIT to kompilator zakończy kompilację dołączonego pliku i b
kontynuował pracę od linii następnej po dyrektywie
INCLUDE
Składnia:
.EXIT
Przykład:
.EXIT
; koniec kompilacji
INCLUDE
Dyrektywa INCLUDE włącza do kompilacji wskazany plik. Kompilacja
trwa do końca pliku lub do napotkania dyrektywy
EXIT
. Do
przez dyrektywę INCLUDE plik również może zawierać dyrektywy
INCLUDE. Nazwa dołączanego pliku powinna być umieszczona mi
znakami " ".
Składnia:
.INCLUDE "nazwa pliku "
Przykład:
.INCLUDE "2313def.inc"
; dołączenie pliku definiuj
; mikrokontroler AT90S2313
Strona 7 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
LIST
Dyrektywa LIST informuje kompilator o konieczności stworzenia
raportu z kompilacji.
Składnia:
.LIST
Przykład:
.NOLIST
; wyłączenie raportu z kompilacji
.INCLUDE "2313def.inc"
; dołączenie pliku
.LIST
; ponowne załączenie raportu
; z kompilacji
LISTMAC
Dyrektywa LISTMAC informuje kompilator o koniecznoś
do raportu z kompilacji informacji z kompilacji makroinstrukcji.
Składnia:
.LIST
Przykład:
.NOLIST
; wyłączenie raportu z kompilacji
.INCLUDE "2313def.inc"
; dołączenie pliku
.LIST
; ponowne załączenie raportu
.LISTMAC
; dołączenie informacji
; o makroinstrukcji
MACRO
Dyrektywa MACRO oznacza początek definicji makroinstrukcji.
Dyrektywa wymaga argumentu w postaci nazwy makroinstrukcji.
Składnia:
.MACRO nazwa makroinstrukcji
Przykład:
.MACRO ldz
; początek definicji makroinstrukcji
ldi
r30, low(@0)
ldi
r31, high(@0)
.ENDMACRO
; koniec definicji makroinstrukcji
Przy okazji warto zauważyć, że makroinstrukcje mogą zawiera
parametry. Wyjaśnia to pojawienie się w powyższym przyk
tajemniczego zapisu low(@0) czy high(@0). Dla przypomnienia: @0
oznacza pierwszy parametr, @9 oznacza dziesiąty parametr. Liczba
parametrów makroinstrukcji jest limitowana do 10.
NOLIST
Dyrektywa NOLIST informuje kompilator o konieczności wy
raportu z kompilacji.
Składnia:
.NOLIST
Przykład:
.NOLIST
; wyłączenie z raportu z kompilacji
Strona 8 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
.INCLUDE "2313def.inc"
; dołączonego pliku
AT90S2313def.inc
ORG
Dyrektywa ORG służy do określenia miejsca (w sensie adresu), gdzie
kompilator rozpocznie umieszczanie generowanych bajtów (je
dyrektywa ORG jest użyta w obrębie
CSEG
) lub określa pocz
adresacji przyszłych zmiennych (jeżeli dyrektywa jest użyta w obr
DSEG
). Dyrektywa ta wymaga użycia argumentu w postaci wyra
określającego adres. W obrębie segmentu kodu programu dyrektywa
używana jest do "usztywnienia" ściśle określonych miejsc w programie
(głównie do wskazania początków obsługi przerwań, na kt
jest ściśle określona w adresacji programu). W segmencie danych
(DSEG) dyrektywy tej można użyć do "poinformowania" kompilatora
asemblera o użyciu przykładowo dodatkowej pamięci RAM
przyłączonej na zewnątrz (przykładowo mikrokontroler AT90S8515
może obsługiwać zewnętrzną pamięć).
Składnia:
.ORG wyrażenie
gdzie wyrażenie wskazuje adres w pamięci
Przykład:
.DSEG
Int_RAM_Variable1: .BYTE 1
Int_RAM_Variable2: .BYTE 1
.
.
.
.ORG 0x8000
Ext_RAM_Variable1: .BYTE 1
Ext_RAM_Variable2: .BYTE 1
Zgłoszenie dyrektywą DSEG (jeżeli jest pierwsze) oznacza,
zmienne (Int_RAM_Variable1 i kolejne) będą umieszczane w pami
wewnętrznej RAM poczynając od adresu 60 hex. Użycie dyrektywy
ORG spowodowało przestawienie pozycji, na jakiej będą
zmienne na adres 8000 hex. Kompilator będzie nadawał kolejnym
zmiennym adresy z przestrzeni zewnętrznej pamięci RAM. U
zewnętrznych pamięci RAM (dotyczy to wszystkich dołączanych na
zewnątrz pamięci i portów) należy pamiętać, że w przypadku
zbudowania dekodera adresowego o niepełnym dekodowaniu, mo
okazać się, że pewne komórki są umieszczone w przestrzeni adresowej
wielokrotnie.
SET
Dyrektywa SET przypisuje wartość wyrażenia jakiemuś
identyfikatorowi. Identyfikator może być później użyty w jakim
wyrażeniu.
Składnia:
.SET nazwa = wyrażenie
Przykład:
.SET io_offset = 0x23
.SET portA = io_offset + 2
Strona 9 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie do...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
do
Funkcje i operatory w wyrażeniach
[4]
W zapisach instrukcji i dyrektyw języka asembler mog
wyrażenia, które w swoim zapisie mogą używać funkcji.
Wśród dopuszczalnych funkcji są następujące:
• LOW(wyrażenie) - funkcja, której wynikiem jest najm
(bity
od b0 do b7) wartości wyrażenia - przykładowo LOW(0x1234) daje
w wyniku liczbę $34 (zapis szesnastkowy),
• HIGH(wyrażenie) - funkcja, której wynikiem jest drugi bajt (bity od
b8
do b15) wartości wyrażenia - przykładowo HIGH(0x1234) daje
w wyniku liczbę $12,
• BYTE2(wyrażenie) - funkcja tożsama z funkcją HIGH,
• BYTE3(wyrażenie) - funkcja, której wynikiem jest trzeci bajt (bity
od
b16 do b23) wartości wyrażenia - przykładowo BYTE3(0x654321)
daje
w wyniku liczbę $65,
• BYTE4(wyrażenie) - funkcja, której wynikiem jest czwarty bajt (bity
od
b24 do b31) wartości wyrażenia - przykładowo BYTE4(0x87654321
daje w wyniku liczbę $87,
• LWRD(wyrażenie) - funkcja, której wynikiem jest młodsze s
dwubajtowe (bity od b0 do b15) wartości wyrażenia,
• HWRD(wyrażenie) - funkcja, której wynikiem jest starsze s
dwubajtowe (bity od b16 do b31) wartości wyrażenia,
• PAGE(wyrażenie) - funkcja, której wynikiem jest liczba b
kodem
strony (bity od b16 do b21) wartości wyrażenia,
• EXP2(wyrażenie) - funkcja, której wynikiem jest liczba b
odpowiednią potęgą liczby 2 (2 do potęgi wartość wyra
• LOG2(wyrażenie) - funkcja, której wynikiem jest liczba b
częścią
całkowitą logarytmu przy podstawie 2 z wartości wyra
Operatory mogące występować w wyrażeniach:
Symbol
Funkcja
Znaczenie
!
Logiczny operator
negacji
Jednoargumentowy operator
zwracający wartość 1 jeż
wyrażenia jest równa zero; w
przeciwnym wypadku zwracana jest
wartość 0
~
Bitowy operator
negacji
Jednoargumentowy operator
zwracający wartość zanegowan
logicznie (odwrócone wszystkie bity)
-
Operator minus
Jednoargumentowy operator
zwracający wartość z arytmetycznie
zmienionym znakiem
*
Operator mnożenia
Dwuargumentowy operator zwracaj
wartość arytmetycznego iloczynu
Strona 10 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
/
Operator dzielenia
Dwuargumentowy operator zwracaj
wartość arytmetycznego ilorazu (cz
całkowitą)
+
Operator sumowania Dwuargumentowy operator zwracaj
wartość arytmetycznej sumy
-
Operator
odejmowania
Dwuargumentowy operator zwracaj
wartość arytmetycznej róż
<<
Operator
przesunięcia w lewo
Dwuargumentowy operator zwracaj
wartość będącą wynikiem przesuni
w lewo (ilość pozycji o ile nale
przesunąć jest drugim argumentem)
>>
Operator
przesunięcia w
prawo
Dwuargumentowy operator zwracaj
wartość będącą wynikiem przesuni
w prawo (ilość pozycji o ile nale
przesunąć jest drugim argumentem)
<
Operator
porównania
(mniejsze)
Dwuargumentowy operator zwracaj
1 jeżeli wartość wyrażenia po lewej
stronie jest mniejsza niż warto
wyrażenia po prawej stronie; w
przeciwnym wypadku zwracana jest
wartość 0
<=
Operator
porównania
(mniejsze lub
równe)
Dwuargumentowy operator zwracaj
1 jeżeli wartość wyrażenia po lewej
stronie jest mniejsza lub r
wartość wyrażenia po prawej stronie; w
przeciwnym wypadku zwracana jest
wartość 0
>
Operator
porównania
(większe)
Dwuargumentowy operator zwracaj
1 jeżeli wartość wyrażenia po lewej
stronie jest większa niż warto
wyrażenia po prawej stronie; w
przeciwnym wypadku zwracana jest
wartość 0
>=
Operator
porównania
(większe lub równe)
Dwuargumentowy operator zwracaj
1 jeżeli wartość wyrażenia po lewej
stronie jest większa lub r
wartość wyrażenia po prawej stronie; w
przeciwnym wypadku zwracana jest
wartość 0
==
Operator
porównania (równe)
Dwuargumentowy operator zwracaj
1 jeżeli wartość wyrażenia po lewej
stronie jest równa z warto
wyrażenia po prawej stronie; w
przeciwnym wypadku zwracana jest
wartość 0
!=
Operator
porównania (nie
równe)
Dwuargumentowy operator zwracaj
1 jeżeli wartość wyrażenia po lewej
stronie nie jest równa z warto
wyrażenia po prawej stronie; w
przeciwnym wypadku zwracana jest
wartość 0
Strona 11 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
&
Operator logicznego
iloczynu
Dwuargumentowy operator zwracaj
wartość logicznego iloczynu (logiczne
and)
^
Operator logicznej
exclusive or
Dwuargumentowy operator zwracaj
wartość logicznej sumy
⊕
|
Operator logicznej
sumy
Dwuargumentowy operator zwracaj
wartość logicznej sumy (logiczne or)
W ogólnym wypadku w wyrażeniu mogą występować wcze
zdefiniowane stałe oraz zmienna (jedna). Należy pamiętać
zmiennej występującej w wyrażeniu jest jej adres (nie zawarto
Przykłady użycia funkcji:
.equ x1
= exp2(eewe)
; eewe jest stałą o warto
; 1 (zobacz bity rejestru
; sterującego pracą EEPROM)
.equ x2
= 0x02
;
oba powyższe zapisy w sumie dają tę samą wartość;
ldi
r16,low((var<<1)+7+x2)
powyższy zapis oznacza, że do rejestru r16 należy wpisać
młodszą częścią z wyrażenia - adres zmiennej var należy przesun
w lewo o jedną pozycję do tego dodać stałą o wartości 7 i wynik
wyrażenia x2;
ldi
r16,!0xf0
wpisz do rejestru r16 stałą o wartości 0 - wartość wyrażenia !0xf0 jest
równa 0
ldi
r16,~0xf0
wpisz do rejestru r16 stałą o wartości 0x0f - wartość wyra
jest równa 0x0f;
ldi
r16,-1
wpisz do rejestru r16 stałą o wartości 0xff - wartość wyraż
słowa jednobajtowego wynosi 0xff;
ldi
r16,eewe+eemwe
wpisz do rejestru r16 stałą o wartości 3 (wartość eewe=1 i eemwe=2);
ldi
r16,(1<<eewe)+(1<<eemwe)
wpisz do rejestru r16 stałą o wartości 0x06 (wartość (1<<eewe)=0x02
i (1<<eemwe)=0x04 co w sumie daje 0x06);
ldi
r16,(1<<eewe)&(1<<eemwe)
Strona 12 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
wpisz do rejestru r16 stałą o wartości 0 (wartość (1<<eewe)=0x02
i (1<<eemwe)=0x04 co w iloczynie logicznym daje wynik r
do
Instrukcje asemblera
[4]
Instrukcje języka asembler stanowią symboliczny zapis ich kod
wraz z ewentualnymi jej operandami (argumentami).
Instrukcje w ogólnym przypadku mają następujący zapis:
etykieta:
instrukcja
[argumenty]
;komentarz
Gdzie występujące w zapisie elementy mają następujące znaczenie:
• etykieta jest symbolicznym określeniem miejsca w programie
(przykładowo jako miejsca, do którego może być wykonany skok)
kompilator tłumacząc program z języka asembler na posta
przyporządkowuje etykiecie określoną wartość liczbow
adresem, etykieta nie jest obowiązkowym elementem w zapisie
instrukcji,
• instrukcja (wraz z jej ewentualnym lub ewentualnymi operandami)
jest symbolicznym zapisem kodu instrukcji, jaka ma by
miejscu wykonana przez mikrokontroler, w przypadku u
wcześniej zdefiniowanej makroinstrukcji kompilator zamieni j
ciąg,
instrukcji mikrokontrolera zgodnie z jej definicją,
• komentarz jako dowolny ciąg znaków zaczynający się
średnika ";" nie jest analizowany przez kompilator, programista
może
w komentarzu zawrzeć dowolne swoje uwagi lub notatki,
komentarz obowiązuje do końca wiersza.
W instrukcji (łącznie z makroinstrukcją) mogą występowa
przewidziane dla danej instrukcji. W niektórych instrukcjach operandem
jest symboliczne oznaczenie rejestru roboczego (od R0 do R31). Istnieje
grupa instrukcji, w której operand jest symbolicznym odwo
zmiennej. Zmienne są identyfikowane przez swój adres (jako liczba
określająca jej położenie w przestrzeni pamięci RAM). W og
przypadku jako adres zmiennej może być użyte dowolne wyra
arytmetyczne z użyciem jej adresu (tylko jednej zmiennej).
Przykłady:
.dseg
;
variable:
.byte
1
; zmienna o nazwie variable
; o wielkości jednego bajtu o jakimś adresie (obliczonym przez
kompilator)
; wynikającym z wszystkich dotychczas występujących zmiennych oraz
; z ewentualnego użycia dyrektywy .org
.cseg
;
lds
r16,variable
; ta instrukcja spowoduje
; przepisanie bajtu z pamięci RAM o adresie symbolicznym variable
; (kompilator wstawi do generowanego kodu liczbę będąc
rzeczywistym
; adresem zmiennej w pamięci) rejestru o symbolicznej nazwie r16
ldi
r16,low(variable)
; ta instrukcja oznacza wpisanie
Strona 13 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
; do rejestru r16 liczby będącej młodszą częścią adresu zmiennej variable
ldi
r16,high(variable)
; ta instrukcja oznacza wpisanie
; do rejestru r16 liczby będącej starszą częścią adresu zmiennej variable
Teraz pozostało jeszcze zapoznać się z listą rozkazów
mikrokontrolerów AVR i można przystąpić do pisania
pierwszego
programu w asemblerze
.
do
Lista instrukcji (rozkazów) mikrokontrolerów AVR
Przedstawiona tutaj lista instrukcji i komentarz wprowadzaj
zostały opracowane na podstawie materiałów zawartych w karcie
katalogowej AT90S2313 i w książkach "Mikrokontrolery AVR
w praktyce"
[1]
, "Mikrokontrolery rodziny AVR - AT90S2313"
materiałów jakie otrzymałem od Gawła
[4]
. Pełny opis rozkaz
z odpowiednimi przykładami zastosowania można znaleźć
stronach wyżej wymienionej książki J. Dolińskiego "Mikrokontrolery
AVR w praktyce"
[1]
- polecam.
Listę instrukcji języka asembler mikrokontrolerów z rodziny AVR
można podzielić na następujące grupy:
• instrukcje arytmetyczne i logiczne
• instrukcje skoków
• instrukcje przesyłania danych
• instrukcje operacji bitowych
• instrukcje kontroli pracy jednostki centralnej (MCU)
W grupie instrukcji arytmetycznych znajdują się wszystkie instrukcje
dodawania oraz dodawania z przeniesieniem, instrukcje odejmowania
oraz odejmowania z przeniesieniem, instrukcje sumy logicznej
"lub" (ang. or), instrukcje iloczynu logicznego "i" (ang. and)
symbolem &, sumy logicznej "albo" (ang. exclusive or) oznaczanej
symbolem
⊕
, instrukcje negacji logicznej (ang. not) instrukcji mno
arytmetycznego, instrukcje zwiększania i zmniejszania o jeden. W
grupie instrukcji skoków można wyróżnić instrukcje skok
bezwarunkowych oraz skoków warunkowych. Instrukcje skok
bezwarunkowych to takie instrukcje, w których sterowanie w programie
zostaje przeniesione w nowe miejsce bezwarunkowo. Instrukcje skok
warunkowych, to takie instrukcje, w których sterowanie w programie
zostanie przeniesione w nowe miejsce tylko w pewnych ści
określonych warunkach, jeżeli warunek nie jest spełniony wykonanie
programu przechodzi do następnej instrukcji. Do instrukcji skoku nale
jeszcze zaliczyć instrukcje wywołania procedury oraz instrukcje powrotu
z procedury. Specyfiką instrukcji wywołania procedury jest to,
instrukcja przed wykonaniem skoku (lista instrukcji procesor
rodziny AVR nie zawiera instrukcji warunkowego wywoł
procedury) zawsze zapamiętuje miejsce powrotu. Instrukcja powrotu z
procedury jest instrukcją skoku bezwarunkowego do miejsca
zapamiętanego przez instrukcję wywołania. W obrębie grupy instrukcji
przesyłania danych występują instrukcje, których zadaniem jest
przesyłanie zawartości określonych rejestrów do innych rejestr
wymiany danych pomiędzy rejestrami roboczymi i wewnę
RAM oraz zewnętrzną pamięcią RAM (jeżeli dany model
mikrokontrolera ma takie możliwości techniczne). Do instrukcji
operujących na bitach należą instrukcje pozwalające modyfikowa
Znaczenie symboli z tabeli instrukcji
Rejestr źródła lub rejestr przeznaczenia
(R30...R31)
-
Rd
Rejestr źródła (R30...R31)
-
Rs
Rejestr górny (R16...R31)
-
Rh
Rejestr przeznaczenia z zakresu
rejestrów górnych
-
Rhd
Rejestr źródła z zakresu rejestrów
górnych
-
Rhs
Rejestr środkowy (R16...R23)
-
Rm
Rejestr przeznaczenia z zakresu
rejestrów środkowych
-
Rmd
Rejestr źródła z zakresu rejestrów
ś
rodkowych
-
Rms
Para rejestrów
(r24=R25:R24, r27=R27:R26,
r28=R29:R28, r30=R31:R30)
-
RR
Rejestry indeksowe (X=R27:R26,
Y=R29:R28, Z=R31:R30)
-
Rxyz
Rejestry indeksowe z przemieszczeniem
(Y=R29:R28, Z=R31:R30)
-
Ry
Stała wskaźnikowa (0...63)
-
c63
Stała używana jako parametr
określający zakres skoku warunkowego
(-64...63)
-
c127
Stała 8-bitowa (0...255)
-
c255
Stała używana jako parametr
określający zakres skoku względnego (-
512...511)
-
c1024
Stała określająca 16-bitowy adres
(0...65535)
-
adr
Stała określająca względne
przemieszczenie w obrębie ±2k
-
adr2k
Stała określająca 16-bitowy adres
-
adr64k
Stała określająca 16-bitowy adres
(0...$FFFF) w obrębie bieżącego
segmentu
-
adr65635
Stała określająca 22-bitowy adres
(0...$3FFFFF)
-
adr4M
Pozycja bitu (0...7)
-
b
Numer portu (rejestru) należącego do
obszaru we/wy (0...63=$00...$3F)
-
P
Adres portu (rejestru) należącego do
dolnej strony obszaru we/wy
(0...31=$00...$1F)
-
Pl
Dodawanie arytmetyczne
-
+
Odejmowanie arytmetyczne
-
–
Suma logiczna
-
∨∨∨∨
Iloczyn logiczny
-
∧∧∧∧
Strona 14 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
Suma modulo 2 (Ex-OR)
-
⊕
⊕
⊕
⊕
Zawartość 8-bit. rejestru Ri
-
Ri
Zawartość 16-bitowego rejestru
złożonego z rejestrów Rj (starszy) i Ri
(młodszy)
-
Rj:Ri
Komórka pamięci adresowana przez
rejestr Ri
-
(Ri)
Bit b rejestru Ri
-
Ri(b)
Bity od i do j rejestru Rk, np. R1(3...0) -
młodsze 4 bity rejestru R1
-
Rk(j...i)
Implikacja logiczna
(jeżeli a, to b)
-
a => b
Przypisanie b do a
(np. wpisanie wartości b do rejestru a)
-
a
←
←
←
←
b
Flaga ustawiana zgodnie z wynikiem
operacji
-
↔
↔
↔
↔
Flaga zerowana ("0")
-
0
Flaga ustawiana ("1")
-
1
Flaga pozostaje bez zmian
-
–
pojedynczych bitów, instrukcje przesunięć logicznych i cyklicznych. W
grupie instrukcji kontroli pracy mikrokontrolera jest instrukcja pusta,
instrukcja zerowania watchdoga i instrukcje sterujące przej
stanów obniżonego poboru prądu. Przed omówieniem poszczeg
instrukcji niezbędne jest wyjaśnienie kilku istotnych pojęć
takich jest operand instrukcji, czyli określenie zasobu jaki bierze udzia
w wykonaniu instrukcji (przykładowo wskazanie na rejestr z puli
wszystkich rejestrów) lub szeroko rozumiana stała (stała jako adres
skoku, stała jako wartość do wpisania do rejestru).
W tabeli prezentującej instrukcje użyte są symbole operand
znaczenie jest wyjaśnione obok. Skróty te i ich opis pochodz
"Mikrokontrolery AVR w praktyce", zdecydowałem się na to zamiast
użycia przyjętej symboliki w kartach katalogowych gdyż
swoim zapisie od razu przeznaczenie i zasięg działania. Szczeg
uwagę należy zwrócić na przyjęte oznaczenie rejestrów. Wynikaj
ich ograniczonego zasięgu działania. Obok zostały równie
przyjęte zapisy symboliczne używane w opisie rozkazów jak r
oznaczenie zachowania się znaczników (flag) po wykonaniu rozkazu.
Ze względu na to, że działanie rozkazów mikrokontrolera (
silnie związane z jego architekturą, wszystkie wątpliwości nale
wyjaśniać posługując się odpowiednimi kartami katalogowymi dla
danego µC.
W µC można wyróżnić trzy rejestry, które maja wpływ na przebieg
programu, są to:
• 16-bitowy rejestr PC - licznik programu (ang. Program Counter
zawierający adres pamięci programu, spod którego jest pobierany
kod rozkazu wykonywanego w kolejnym kroku,
• 8-bitowy (dla AT90S2313) lub 16-bitowy rejestr wska
SP
(ang. Stack Pointer), zawierający adres pamięci SRAM, pod kt
będzie zapisywany np. adres powrotu z podprogramu (adres
następnego rozkazu po rozkazie wywołania podprogramu),
• 8-bitowy rejestr znaczników (flag) - SREG (ang. Status Register)
zawierający znaczniki mogące mieć wpływ na przebieg programu
(wykorzystywane np. w rozkazach skoków warunkowych).
Ze względu na szczególne znaczenie tych rejestrów w opisie rozkaz
uwzględniony został sposób ich modyfikacji przez poszczeg
rozkazy.
Poniżej przedstawione są w tabelach poszczególne grupy rozkaz
(instrukcji). Na pytanie czy warto się uczyć tej listy rozkaz
odpowiedzieć w dwojaki sposób. Tak, ponieważ wpływa to na pisanie
programów w sposób zapewniający optymalne wykorzystanie zasob
mikrokontrolera. Nie, bo asembler w swojej "czystej" postaci jest coraz
mniej wykorzystywany ustępując językom wysokiego poziomu takim
jak C czy Bascom. Jednak wszystkim, którzy zaczynają swoj
z AVRami polecam zapoznanie się z ich listą rozkazów, poniewa
ułatwia to zrozumienie budowy i działania mikrokontrolera.
W poniższych tabelach wiersze zaznaczone tłem różowym oznaczaj
ż
e opisywany rozkaz nie jest zaimplementowany w AT90S2313 (mo
dotyczyć to także innych mikrokontrolerów), tło szare świadczy o tym,
ż
e dany rozkaz nie jest zaimplementowany we wszystkich
mikrokontrolerach. Szczegółowo jest to wyjaśnione w kartach
katalogowych.
Strona 15 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
Instrukcje arytmetyczne i logiczne
[1][6]
Mnemonika
Operandy
Opis
Operacje
ADD
Rd
,
Rs
Dodaj zawartość dwóch rejestrów
Rd
←
Rd + Rs
Z,C,N,V,H,S
ADC
Rd
,
Rs
Dodaj zawartość dwóch rejestrów
z przeniesieniem
Rd
←
Rd + Rs + C
Z,C,N,V,H,S
ADIW
RR
,
c63
Dodaj bezpośrednio stałą do słowa
RRh:RRl
←
RRh:RRl + c63 Z,C,N,V,S
SUB
Rd
,
Rs
Odejmij zawartość dwóch rejestrów
Rd
←
Rd - Rs
Z,C,N,V,H,S
SUBI
Rh
,
c255
Odejmij stałą od zawartości rejestru
Rh
←
Rh - c255
Z,C,N,V,H,S
SBIW
RR
,
c63
Odejmij bezpośrednio stałą do słowa
RRh:RRl
←
RRh:RRl - c63 Z,C,N,V,S
SBC
Rd
,
Rs
Odejmij zawartość dwóch rejestrów
z przeniesieniem
Rd
←
Rd - Rs - C
Z,C,N,V,H,S
SBCI
Rh
,
c255
Odejmij stałą z przeniesieniem od
zawartości rejestru
Rh
←
Rh - c255 - C
Z,C,N,V,H,S
AND
Rd
,
Rs
Iloczyn logiczny zawartości rejestrów
Rd
←
Rd
∧
Rs
Z,N,V,S
ANDI
Rh
,
c255
Iloczyn logiczny zawartości rejestru i
stałej
Rh
←
Rh
∧
c255
Z,N,V,S
OR
Rd
,
Rs
Suma logiczna zawartości rejestrów
Rd
←
Rd
∨
Rs
Z,N,V,S
ORI
Rh
,
c255
Suma logiczna zawartości rejestru i stałej
Rh
←
Rh
∨
c255
Z,N,V,S
EOR
Rd
,
Rs
Suma Exclusive OR zawartości rejestrów
Rd
←
Rd
⊕
Rs
Z,N,V,S
COM
Rd
Uzupełnienie do jedności (negacja bitów)
Rd
←
$FF - Rd
Z,C,N,V,S
NEG
Rd
Uzupełnienie do dwóch
Rd
←
$00 - Rd
Z,C,N,V,H,S
SBR
Rh
,
c255
Ustaw bity(y) w rejestrze
Rh
←
Rh
∨
c255
Z,N,V,S
CBR
Rh
,
c255
Zeruj bit(y) w rejestrze
Rh
←
Rh
∧
c255
Z,N,V,S
INC
Rd
Zwiększ o 1 zawartość rejestru
Rd
←
Rd + 1
Z,N,V,S
DEC
Rd
Zmniejsz o 1 zawartość rejestru
Rd
←
Rd - 1
Z,N,V,S
TST
Rd
Sprawdź zero lub minus
Rd
←
Rd
∧
Rd
Z,N,V,S
CLR
Rd
Zeruj wszystkie bity rejestru
Rd
←
Rd
⊕
Rd
Z,N,V,S
SER
Rh
Ustaw wszystkie bity rejestru
Rh
←
$FF
MUL
Rd
,
Rs
Mnożenie bez znaku zawartości rejestrów R1:R0
←
Rd · Rs
Z,C
MULS
Rhd
,
Rhs
Mnożenie ze znakiem zawartości
rejestrów
R1:R0
←
Rhd · Rhs
Z,C
MULSU
Rhd
,
Rhs
Mnożenie zawartości rejestrów (jeden ze
znakiem, drugi bez znaku)
R1:R0
←
Rhd · Rhs
Z,C
FMUL
Rd
,
Rs
Mnożenie liczb ułamkowych bez znaku
R1:R0
←
(Rd · Rs) << 1
Z,C
FMULS
Rd
,
Rs
Mnożenie liczb ułamkowych ze znakiem
R1:R0
←
(Rd · Rs) << 1
Z,C
FMULSU
Rd
,
Rs
Mnożenie liczby ułamkowej ze znakiem z
liczbą ułamkową bez znaku
R1:R0
←
(Rd · Rs) << 1
Z,C
Instrukcje skoków
[1][6]
Mnemonika
Operandy
Opis
Operacje
Strona 16 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
RJMP
adr2k
Skok względny
PC
←
PC + adr2k + 1
IJMP
Skok pośredni określony zawartością
rejestru indeksowego Z
PC
←
Z
EIJMP
Rozszerzony skok pośredni określony
zawartością rejestru indeksowego Z
PC(15...0))
←
Z
PC(21...16))
←
EIND
JMP
adr4M
Skok bezpośredni
PC
←
adr4M
RCALL
c1024
Względne wywołanie podprogramu
(SPL)
←
PC + 1
SPL
←
SPL - 2
PC
←
PC + 1024 + 1
ICALL
Pośrednie wywołanie podprogramu
określone zawartością rejestru
indeksowego Z
(SPL)
←
PC + 1
SPL
←
SPL - 2
PC
←
Z
EICALL
Rozszerzone, pośrednie wywołanie
podprogramu określone zawartością
rejestru Z oraz EIND
(SPL)
←
PC + 1
SPL
←
SPL - 3
PC(15...0)
←
Z
PC(21...16)
←
EIND
CALL
adr4M
Rozszerzone, pośrednie wywołanie
podprogramu określone zawartością
rejestru Z oraz EIND
(SPL)
←
PC + 1
SPL
←
SPL - 3
PC(15...0)
←
Z
PC(21...16)
←
EIND
RET
Powrót z podprogramu
PC
←
(SPL)
SPL
←
SPL + 2
RETI
Powrót z procedury obsługi przerwania
PC
←
(SPL)
SPL
←
SPL + 2
I
CPSE
Rd
,
Rs
Porównaj, skocz jeśli równe
(Rd=Rs)
=>
PC
←
PC + 2
lub 3
CP
Rd
,
Rs
Porównaj zawartość rejestrów
Rd - Rs
Z,C,N,V,H,S
CPC
Rd
,
Rs
Porównaj zawartość rejestrów z
przeniesieniem
Rd - Rs - C
Z,C,N,V,H,S
CPI
Rh
,
c255
Porównaj zawartość rejestru ze stałą
Rh - c255
Z,C,N,V,H,S
SBRC
Rs
,
b
Przeskocz jeśli bit w rejestrze jest
wyzerowany
Rs(b) = 0 => PC
←
PC + 2
Rs(b) = 1 => PC
←
PC + 1
SBRS
Rs
,
b
Przeskocz jeśli bit w rejestrze jest
ustawiony
Rs(b) = 1 => PC
←
PC + 2
Rs(b) = 0 => PC
←
PC + 1
SBIC
Pl
,
b
Przeskocz jeśli bit w rejestrze we/wy jest
wyzerowany
Pl(b) = 0 => PC
←
PC + 2
Pl(b) = 1 => PC
←
PC + 1
SBIS
Pl
,
b
Przeskocz jeśli bit w rejestrze we/wy jest
ustawiony
Pl(b) = 1 => PC
←
PC + 2
Pl(b) = 0 => PC
←
PC + 1
BRBS
b
,
c127
Skok względny jeśli flaga w rejestrze
SREG jest ustawiona
SREG(b) = 1 => PC
←
PC
+ c127 + 1
SREG(b) = 0 => PC
←
PC
+ 1
BRBC
b
,
c127
Skok względny jeśli flaga w rejestrze
SREG jest wyzerowana
SREG(b) = 0 => PC
←
PC
+ c127 + 1
Strona 17 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
SREG(b) = 1 => PC
←
PC
+ 1
BREQ
c127
Skok względny jeśli równe (gdy Z=1)
Z = 1 => PC
←
PC + c127 +
1
Z = 0 => PC
←
PC + 1
BRNE
c127
Skok względny jeśli nie równe (gdy Z=0)
Z = 0 => PC
←
PC + c127 +
1
Z = 1 => PC
←
PC + 1
BRCS
c127
Skok względny jeśli flaga przeniesienia
jest ustawiona (gdy C=1)
C = 1 => PC
←
PC + c127 +
1
C = 0 => PC
←
PC + 1
BRCC
c127
Skok względny jeśli flaga przeniesienia
jest wyzerowana (gdy C=0)
C = 0 => PC
←
PC + c127 +
1
C = 1 => PC
←
PC + 1
BRSH
c127
Skok względny jeśli większy lub równy
(gdy C=0, dotyczy liczb bez znaku)
C = 0 => PC
←
PC + c127 +
1
C = 1 => PC
←
PC + 1
BRLO
c127
Skok względny jeśli mniejszy (gdy C=1,
dotyczy liczb bez znaku)
C = 1 => PC
←
PC + c127 +
1
C = 0 => PC
←
PC + 1
BRMI
c127
Skok względny jeśli wartość ujemna (gdy
N=1)
N = 1 => PC
←
PC + c127
+ 1
N = 0 => PC
←
PC + 1
BRPL
c127
Skok względny jeśli wartość dodatnia
(gdy N=0)
N = 0 => PC
←
PC + c127
+ 1
N = 1 => PC
←
PC + 1
BRGE
c127
Skok względny jeśli większy lub równy
(gdy N albo V=0, dotyczy liczb ze
znakiem)
(N
⊕
V)=0 => PC
←
PC+c127+1
(N
⊕
V) = 1 => PC
←
PC +
1
BRLT
c127
Skok względny jeśli mniejszy niż zero
(gdy N albo V=1, dotyczy liczb ze
znakiem)
(N
⊕
V)=1 => PC
←
PC+c127+1
(N
⊕
V) = 0 => PC
←
PC +
1
BRHS
c127
Skok względny jeśli flaga przeniesienia
pomocniczego ustawiona (gdy H=1)
H = 1 => PC
←
PC + c127
+ 1
H = 0 => PC
←
PC + 1
BRHC
c127
Skok względny jeśli flaga przeniesienia
pomocniczego wyzerowana (gdy H=0)
H = 0 => PC
←
PC + c127
+ 1
H = 1 => PC
←
PC + 1
BRTS
c127
Skok względny jeśli flaga T ustawiona
(gdy T=1)
T = 1 => PC
←
PC + c127 +
1
T = 0 => PC
←
PC + 1
BRTC
c127
Skok względny jeśli flaga T wyzerowana
(gdy T=0)
T = 0 => PC
←
PC + c127 +
1
T = 1 => PC
←
PC + 1
Strona 18 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
BRVS
c127
Skok względny jeśli flaga przepełnienia
jest ustawiona (gdy V=1)
V = 1 => PC
←
PC + c127
+ 1
V = 0 => PC
←
PC + 1
BRVC
c127
Skok względny jeśli flaga przepełnienia
jest wyzerowana (gdy V=0)
V = 0 => PC
←
PC + c127
+ 1
V = 1 => PC
←
PC + 1
BRIE
c127
Skok względny jeśli przerwanie jest
odblokowane (gdy I=1)
I = 1 => PC
←
PC + c127 +
1
I = 0 => PC
←
PC + 1
BRID
c127
Skok względny jeśli przerwanie jest
zablokowane (gdy I=0)
I = 0 => PC
←
PC + c127 +
1
I = 1 => PC
←
PC + 1
Instrukcje przesyłania danych
[1][6]
Mnemonika
Operandy
Opis
Operacje
MOV
Rd
,
Rs
Przepisanie zawartości rejestru Rs do Rd
Rd
←
Rs
MOVW
Rd+1:Rd
,
Rs+1;Rs
Przepisanie zawartości pary rejestrów Rs i
Rs+1 do pary rejestrów Rd i Rd+1
Rd+1:Rd
←
Rs+1:Rs
LDI
Rd
,
c255
Ładuj rejestr Rd bezpośrednio wartością
stałej z zakresu 0...255
Rd
←
c255
LD
Rd
,
X
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy X
Rd
←
(X)
LD
Rd
,
X+
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy X z
postinkrementacją rejestru X
Rd
←
(X)
X
←
X + 1
LD
Rd
,
-X
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy X z
predekrementacją rejestru X
X
←
X - 1
Rd
←
(X)
LD
Rd
,
Y
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Y
Rd
←
(Y)
LD
Rd
,
Y+
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Y z
postinkrementacją rejestru Y
Rd
←
(Y)
Y
←
Y + 1
LD
Rd
,
-Y
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Y z
predekrementacją rejestru Y
Y
←
Y - 1
Rd
←
(Y)
LDD
Rd
,
Y
+
c63
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Y z
uwzględnieniem przemieszczenia o
wartość z zakresu 0...63
Rd
←
(Y + c63)
Strona 19 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
LD
Rd
,
Y
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Z
Rd
←
(Z)
LD
Rd
,
Y+
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Z z
postinkrementacją rejestru Z
Rd
←
(Z)
Z
←
Z + 1
LD
Rd
,
-Z
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Z z
predekrementacją rejestru Z
Z
←
Z - 1
Rd
←
(Z)
LDD
Rd
,
Z
+
c63
Ładuj rejestr Rd pośrednio daną z pamięci
SRAM znajdującą się pod adresem
wskazanym przez rejestr indeksowy Z z
uwzględnieniem przemieszczenia o
wartość z zakresu 0...63
Rd
←
(Z + c63)
LDS
Rd
,
adr65535
Ładuj rejestr Rd bezpośrednio daną z
pamięci SRAM znajdującą się pod
adresem wskazanym przez stałą z zakresu
0...65535
Rd
←
(adr65535)
ST
X
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy X
(X)
←
Rs
ST
X+
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy X z
postinkrementacją rejestru X
(X)
←
Rs
X
←
X + 1
ST
-X
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy X z
predekrementacją rejestru X
X
←
X - 1
(X)
←
Rs
ST
Y
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Y
(Y)
←
Rs
ST
Y+
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Y z
postinkrementacją rejestru Y
(Y)
←
Rs
Y
←
Y + 1
ST
-Y
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Y z
predekrementacją rejestru Y
Y
←
Y - 1
(Y)
←
Rs
STD
Y
+
c63
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Y z
uwzględnieniem przemieszczenia o
wartość z zakresu 0...63
(Y + c63)
←
Rs
ST
Z
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Z
(Z)
←
Rs
Strona 20 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
ST
Z+
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Z z
postinkrementacją rejestru Z
(Z)
←
Rs
Z
←
Z + 1
ST
-Z
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Z z
predekrementacją rejestru Z
Z
←
Z - 1
(Z)
←
Rs
STD
Z
+
c63
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez rejestr indeksowy Z z
uwzględnieniem przemieszczenia o
wartość z zakresu 0...63
(Z + c63)
←
Rs
STS
adr
,
Rs
Zachowaj pośrednio zawartość rejestru Rs
w pamięci SRAM pod adresem
wskazanym przez stałą adr
(adr)
←
Rs
LPM
Ładuj zawartość bajtu z pamięci programu
o adresie określonym zawartością rejestru
indeksowego Z do rejestru R0
R0
←
(Z)
LPM
Rd
,
Z
Ładuj zawartość bajtu z pamięci programu
o adresie określonym zawartością rejestru
indeksowego Z do rejestru Rd
Rd
←
(Z)
LPM
Rd
,
Z+
Ładuj zawartość bajtu z pamięci programu
o adresie określonym zawartością rejestru
indeksowego Z do rejestru Rd
z postinkrementacją rejestru Z
Rd
←
(Z)
Z
←
Z + 1
ELPM
Ładuj zawartość bajtu z pamięci programu
o adresie określonym zawartością rejestru
indeksowego Z i rejestru RAMPZ do
rejestru R0
R0
←
(RAMPZ:Z)
ELPM
Rd
,
Z
Ładuj zawartość bajtu z pamięci programu
o adresie określonym zawartością rejestru
indeksowego Z i rejestru RAMPZ do
rejestru Rd
Rd
←
(RAMPZ:Z)
ELPM
Rd
,
Z
Ładuj zawartość bajtu z pamięci programu
o adresie określonym zawartością rejestru
indeksowego Z i rejestru RAMPZ do
rejestru Rd z postinkrementacją rejestrów
Z i RAMPZ
Rd
←
(RAMPZ:Z)
Z
←
Z + 1
RAMPZ
←
RAMPZ + 1
SPM
Zapisanie zawartości pary rejestrów
R1:R0 do pamięci programu w miejscu
określonym zawartością rejestru
indeksowego Z i RAMPZ
(RAMPZ:Z)
←
R1:R0
IN
Rd
,
P
Przepisanie zawartości rejestru z
przestrzeni adresowej I/O o adresie P do
rejestru Rd
Rd
←
P
OUT
P
,
Rs
Przepisanie zawartości rejestru Rs do
rejestru z przestrzeni adresowej I/O o
adresie P
P
←
Rs
PUSH
Rs
Przepisanie zawartości rejestru Rs na
(SPL)
←
Rs
Strona 21 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
szczyt stosu
SPL
←
SPL - 1
lub
(SPH:SPL)
←
Rs
SPH:SPL
←
SPH:SPL - 1
POP
Rd
Przepisanie zawartości szczytu stosu do
rejestru Rd
SPL
←
SPL + 1
Rd
←
(SPL)
lub
SPH:SPL
←
SPH:SPL + 1
Rd
←
(SPH:SPL)
Instrukcje operacji bitowych
[1][6]
Mnemonika
Operandy
Opis
Operacje
SBI
PL
,
b
Ustaw bit b w rejestrze we/wy o adresie Pl Pl(b)
←
1
CBI
PL
,
b
Zeruj bit b w rejestrze we/wy o adresie Pl
Pl(b)
←
0
LSL
Rd
Przesunięcie logiczne zawartości rejestru
Rd w lewo
Rd(n+1)
←
Rd(n)
Rd(0)
←
0
Z,C,N,V,H
LSR
Rd
Przesunięcie logiczne zawartości rejestru
Rd w prawo
Rd(n)
←
Rd(n+1)
Rd(7)
←
0
Z,C,N,V
ROL
Rd
Przesunięcie cykliczne zawartości rejestru
Rd w lewo
Rd(0)
←
C
Rd(n+1)
←
Rd(n)
C
←
Rd(7)
Z,C,N,V,H
ROR
Rd
Przesunięcie cykliczne zawartości rejestru
Rd w prawo
Rd(7)
←
C
Rd(n)
←
Rd(n+1)
C
←
Rd(0)
Z,C,N,V
ASR
Rd
Przesunięcie arytmetyczne zawartości
rejestru Rd w prawo
Rd(n)
←
Rd(n+1), n=0...6
Z,C,N,V
SWAP
Rd
Zamiana półbajtów (nibli - ang. nibbles)
w rejestrze Rd
Rd(3...0)
←
Rd(7...4)
Rd(7...4)
←
Rd(3...0)
BSET
b
Ustawienie wybranej flagi (wskazanej
przez numer bitu b) w rejestrze statusów
SREG
SREG(b)
←
1
SREG(b)
BCLR
b
Zerowanie wybranej flagi (wskazanej
przez numer bitu b) w rejestrze statusów
SREG
SREG(b)
←
0
SREG(b)
BST
Rs
,
b
Przepisanie wartości bitu b z rejestru Rs
do wskaźnika T w rejestrze statusów
SREG
T
←
Rs(b)
T
BLD
Rd
,
b
Przepisanie stanu wskaźnika T w rejestrze
statusów SREG do bitu określonego przez
b w rejestrze Rd
Rd(b)
←
T
To nie wszystko - już wkrótce dalszy ciąg listy rozkazów ...
Literatura i inne źródła:
[1] "Mikrokontrolery AVR w praktyce"
- J. Doliński
[2] www.atmel.com
- strona producenta mikrokontrolerów AVR
[3] AVR-Assembler-Tutorial
- www.avr-asm-tutorial.net by Gerhard
Strona 22 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...
Schmidt
[4] materiały od użytkownika forum o nicku "GAWEŁ"
[5] AVRASM.chm - plik pomocy z AVR Studio4
[6] "Mikrokontrolery rodziny AVR - AT90S2313" - A. Krysiak
do
Wstecz
Menu
Dalej
nowości na stronie
|
elektronika w stylu retro
|
mikrokontrolery
|
ciekawe rozwiązania układowe
|
katalogi
|
coś dla początkujących
|
teoria - wstęp
|
podstawowe prawa
|
elementy RLC
|
diody
|
tranzystory
|
ź
r
prądu
|
wzmacniacze operacyjne
|
elementy optoelektroniczne
|
filtry
|
generatory
|
zasilacze
|
stabilizatory
przykłady
|
trochę matematyki
|
archiwum
|
© Copyright 2001-2004
http://www.elektronika.qs.pl/
Strona 23 z 23
Elektronika analogowa - Kurs asemblera dla AVR w przykładach - wprowadzenie ...
2006-05-19
file://E:\__UAM_~1\__RNE_~1\FOLDER~1\POMOCE~1\MIKROS~1\Elektronika ...