Mikrokontroler Elektronika analogowa Kurs asemblera dla AVR w przykładach

background image

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 ...

background image

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 ...

background image

• 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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

.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 ...

background image

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 ...

background image

.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 ...

background image

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 ...

background image

/

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 ...

background image

&

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 ...

background image


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 ...

background image

; 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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

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 ...

background image

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 ...


Wyszukiwarka

Podobne podstrony:
Kurs Asemblera na AVR, AVR Assembler
mikrokontrolery, ELEKTRONIKA I PROGRAMOWANIE, Mikroprocesory, programowanie Bascom, AVR,
Asembler Kurs Programowania Dla Srednio Zaawansowanych S Kruk www !OSIOLEK!com
elektronika analogowa -pytania dla ib
elektronika analogowa pytania dla ib
Podstawy elektroniki lekki kurs dla opornych Wykop
Asembler Kurs programowania dla średnio zaawansowanych
Asembler Kurs Programowania Dla Srednio Zaawansowanych S Kruk www !OSIOLEK!com
Asembler Kurs programowania dla średnio zaawansowanych
Podstawy elektroniki lekki kurs dla opornych Wykop
Asembler Kurs Programowania Dla Srednio Zaawansowanych S Kruk www !OSIOLEK!com
Asembler dla procesorow Intel Vademecum profesjonalisty asinvp
Elektronika analogowa czym mierzyc
Elektrotechnika i elektronika analogowa
Kurs frywolitek dla początkujących
Praktyczny kurs asemblera pkasem

więcej podobnych podstron