Mikrokontrolery
|
|
|
|
|
Programowanie
|
|
|
|
Co to jest asembler?
Aby odpowiedzieć na to pytanie najpierw trzeba odpowiedzieć
na pytanie, co to jest program dla mikrokontrolera. Program jest to ciąg
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łowym. Ten sam program przetworzony przez kompilator
do postaci kodów dla mikroprocesora nazywamy programem binarnym lub programem
wykonywalnym. Ten podział spowodowany jest tym, że mikrokontrolery nie
mogą wykonywać programów źródłowych, ponieważ oczekują one ciągu zer i
jedynek będących kodami instrukcji. Z drugiej strony człowiek nie może
poruszać się w programie binarnym, ponieważ jest on 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ęcia 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ększą 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ęzyka i zdefiniowanie pewnego zbioru słow (w sensie
wyrazów) o ściśle określonym znaczeniu.
W programie używa się symbolicznych nazw instrukcji, wskazuje się poprzez
nazwy używane zmienne, miejsca w programie. Każda nazwa (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ładem
mogą być nazwy zdefiniowane dyrektywami .equ, .def ). W wielu przypadkach
dopuszcza się używanie nowych nazw bez ich wcześniejszego określenia (jak
nazw etykiet jako miejsc w programie), które muszą być określone 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że być przykładowo w programie umieszczona jakaś etykieta
w dwóch różnych miejscach.
Proces kompilacji (tłumaczenia z przykładowo języka asemblera na postać
akceptowaną przez mikrokontrolery) może przebiegać w różny 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ów 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ć częściowo skompilowaną (postać, w której
instrukcje są zamienione na odpowiednie kody ale występują jeszcze symboliczne
odwołania do 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ęściowo skompilowane
w jedną całość uzupełniając wszystkie wzajemne powiązania między występującymi
jeszcze nazwami symbolicznymi.
Rozkazy w ASEMBLERZE
Operacje arytmetyczne
|
Dodaj A <-- A +
|
ADD
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
|
|
Dodaj A <-- A + + C
|
ADDC
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
|
|
Odejmij A <-- A + - C
|
SUBB
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
|
|
Zwiększ o jeden
|
INC
|
A
|
Rr
|
direct
|
@Ri
|
DPTR
|
|
Zmniejsz o jeden
|
DEC
|
A
|
Rr
|
direct
|
@Ri
|
|
|
Mnóż A • B
|
MUL
|
AB
|
wynik:
|
A-low
|
B-high
|
|
|
Dziel A / B
|
DIV
|
AB
|
A-wynik
|
B-reszta
|
|
|
|
Poprawka dziesiętna
|
DA
|
A
|
|
|
|
|
Operacje logiczne
|
Iloczyn logiczny AND
|
ANL
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
direct,A
|
direct,#data
|
|
Suma logiczna OR
|
ORL
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
direct,A
|
direct,#data
|
|
Suma modulo 2 XOR
|
XRL
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
direct,A
|
direct,#data
|
|
Zeruj
|
CLR
|
A
|
|
|
|
|
|
|
Neguj
|
CPL
|
A
|
|
|
|
|
|
|
Obrót w lewo
|
RL
|
A
|
|
|
|
|
|
|
Obrót w prawo
|
RR
|
A
|
|
|
|
|
|
|
Obrót przez C
|
RLC
|
A
|
|
|
|
|
|
|
Obrót przez C
|
RRC
|
A
|
|
|
|
|
|
|
Zamień 4 bity (hi <--> lo)
|
SWAP
|
A
|
|
|
|
|
|
Operacje logiczne na bitach
|
Zeruj
|
CLR
|
C
|
bit
|
|
Ustaw
|
SETB
|
C
|
bit
|
|
Neguj
|
CPL
|
C
|
bit
|
|
Iloczyn logiczny
|
ANL
|
C,bit
|
C,/bit
|
|
Suma logiczna
|
ORL
|
C,bit
|
C,/bit
|
|
Kopiuj
|
MOV
|
C,bit
|
bit,C
|
Przesyłanie danych
|
Kopiuj A<--
|
MOV
|
|
A,Rr
|
A,direct
|
A,@Ri
|
A,#data
|
|
Kopiuj Rr<--
|
MOV
|
Rr,A
|
|
Rr,direct
|
|
Rr,#data
|
|
Kopiuj direct<--
|
MOV
|
direct,A
|
direct,Rr
|
direct,direct
|
direct,@Ri
|
direct,#data
|
|
Kopiuj @Ri<--
|
MOV
|
@Ri,A
|
|
@Ri,direct
|
|
@Ri,#data
|
|
Kopiuj DPTR<--
|
MOV
|
DPTR,#data16
|
|
|
|
|
|
Pamięć programu
|
MOVC
|
A,@A+DPTR
|
A,@A+PC
|
|
|
|
|
Zewn. pamięć danych
|
MOVX
|
A,@Ri
|
A,@DPTR
|
@Ri,A
|
@DPTR,A
|
|
|
Zamień
|
XCH
|
A,Rr
|
A,direct
|
A,@Ri
|
|
|
|
Zamień młodsze 4 bity
|
XCHD
|
A,@Ri
|
|
|
|
|
|
Zapisz na stos
|
PUSH
|
direct
|
SP = SP+1
|
(SP) <-- direct
|
|
|
|
Odczytaj ze stosu
|
POP
|
direct
|
direct<--(SP)
|
SP = SP • 1
|
|
|
|
 |