24_11(2).pdf

(190 KB) Pobierz
152728896 UNPDF
Też to potrafisz
W kolejnym odcinku naszego cyklu
o mikrokontrolerach 8051 kontynuu−
jemy szczegółowy opis instrukcji
procesora ze zwróceniem uwagi na
składnię instrukcji oraz skrótowe
przykłady zastosowania. Podczas
analizy z pewnością przyda się za−
mieszczona we wkładce poprzed−
niego numeru EdW, tabela ze spi−
sem wszystkich instrukcji. I choć
dzisiejszy odcinek może wydać się
nieco monotonny, to trzeba pamię−
tać, że nauka każdego języka, tak
porozumiewania się jak i programo−
wania inteligentnych układów elekt−
ronicznych jest niezbędna każdemu
elektronikowi − hobbyście.
Mikrokontrolery?
To takie proste...
Część 8
Asembler – język maszynowy procesora
Kontynuując opis instrukcji przedsta−
wimy kolejno grupę najważniejszych in−
strukcji dotyczących przemieszczania da−
nych w strukturze rejestrów procesora.
Dodatkowe instrukcje umożliwiające sko−
ki warunkowe oraz wywoływanie pod−
programów, przedstawimy w ostatniej,
trzeciej części opisu asemblera.
<d>. We wszystkich przypadkach (oprócz
jednego) argumentami instrukcji MOV są
wyrażenia 8–bitowe: rejestry, dane adre−
sy pośrednie itp. Jedynie załadowanie
16–bitowego wskaźnika adresu DPTR
wymaga odpowiedniego 16–bitowego
(stałej) argumentu.
Poniżej opiszemy wszystkie możliwe
przypadki użycia instrukcji MOV.
– kod: 1 110011i stąd: E6h, E7h
– cykle: 1
bajty: 1
– przykład:
;przed wywołaniem
instrukcji R1 zawiera
wartość 34h
MOV A, @R1 ;załadowanie zawartości
komórki o adresie 34h do
;akumulatora
Operacje przemieszczenia
danych
1. Instrukcja MOV
Instrukcją służącą do przekazywania
danych pomiędzy rejestrami procesora
pamięcią wewnętrzną jest: „MOV” (ang.
„move” – przesuń, przenieś)
W zależności od tego co i gdzie
„przenosimy”, polecenie to może mieć
kilkanaście różnych postaci w zależności
od zastosowanych argumentów. Jedno−
cześnie warto wiedzieć, że polecenie to
w praktyce nie powoduje dosłownego
„przemieszczenia danej, lub zawartości
rejestru, ale jej skopiowanie ze źródła do
miejsca przeznaczenia.
Ogólne instrukcję MOV można zapi−
sać jako:
MOV <d> <s>
gdzie: <d> jest miejscem przeznaczenia
–tam dokąd ma być skopiowana dana ze
źródła (ang. „destination”) ,a <s> źród−
łem pobrania danej (ang. „source”).
W wyniku wykonania instrukcji MOV za−
wartość źródła <s> zostaje umieszczona
(skopiowana) w obiekcie przeznaczenia
MOV A, #dana
– instrukcja załadowania 8–bitowej liczby
„dana” do akumulatora
A <– dana
kod: 0 1110100
MOV A, Rn
– do akumulatora zostaje załadowana zawar−
tość rejestru Rn
A <– Rn
– kod: 11101n2 n1 n0 gdzie n2...n0
wskazują na R0...7 stąd: E8h–EFh
– cykle: 1
74h
– cykle: 1
bajty: 2 (kod instrukcji:
74h + dana)
– przykład:
MOV A,#100 ;załadowanie do
akumulatora liczby 100
bajty: 1
– przykład:
MOV R7,#0
MOV A, R7 ;wyzerowanie akumulatora
......
MOV Rn, A
– do rejestru Rn (R0...R7) zostaje załadowana
zawartość akumulatora
Rn <– A
– kod: 1 1111n2 n1 n0 gdzie n2...n0
wskazują na R0...7 stąd: F8h–FFh
– cykle: 1
MOV A, adres
– do akumulatora zostaje załadowana zawar−
tość komórki wewnętrznej pamięci RAM
o adresie: „adres”
A <– (adres)
–kod: 11100101 E5h
– cykle: 1 bajty: 2 (kod instrukcji E5h
+ 8–bitowy adres)
– przykład:
MOV A, 20h ;załadowanie do A
zawartości komórki
o adresie 20h
bajty: 1
– przykład:
MOV R3, A
;przepisanie zawartości
akumulatora do rejestru R3
MOV Rn, adres
– do rejestru Rn (R0...R7) zostaje załadowana
zawartość komórki o adresie „adres”
Rn <– (adres) gdzie n = 0...7
– kod: 1 0101n2 n1 n0 gdzie n2...n0
wskazują na R0...7 stąd: A8h–AFh
– cykle: 1 bajty: 2 (kod instrukcji + adres)
– przykład:
MOV A, @Ri
– do akumulatora zostaje załadowana zawartość ko−
mórki wewn. RAM, której adres znajduje się w re−
jestrze R0 (i=0), lub R1 (i=1)
A <– (Ri)
gdzie i = 0 lub 1
E LEKTRONIKA DLA WSZYSTKICH 12/97
37
152728896.002.png
Też to potrafisz
MOV R4, 65h ;załadowanie do rejestru
R4 zawartości komórki
o adresie 65h
MOV 45h, #100;komórce o adresie 45h
zostaje nadana wartość 100
o konkretnym zdarzeniu. Ponieważ takie
komunikaty są z reguły niezmienne,
w praktyce programista umieszcza je
w kodzie programu (pamięci stałej).
Dzięki takiemu działaniu instrukcja
MOVC umożliwia odczytanie całego kodu
programu użytkownika, co często w prakty−
ce nie jest pożądane, bo pozwala na np.
„nielegalny” odczyt i skopiowanie przez
osobę niepowołaną („hackera”) programu
utworzonego przez programistę. Jest to
oczywiście naruszeniem praw autorskich
danego projektu, ale łamiącemu prawo pi−
ratowi pozwala np. na powielenie ciekawe−
go urządzenia (np. sterownika) bez zgody
jego autora. Na szczęście procesor 8051
i wszystkie z jego rodziny mają wbudowa−
ne mechanizmy sprzętowego zabezpiecze−
nia przed taką sytuacją. Istnieje bowiem
możliwość permanentnego zablokowania
instrukcji MOVC wywoływanej z zewnę−
trznej pamięci programu (napisanego np.
przez hackera). Sytuacja ta dotyczy oczy−
wiście aplikacji wykorzystujących proceso−
ry z wewnętrzną pamięcią programu (87xx,
89xx) gdzie przezorny programista umieścił
kod programu w wewnętrznej pamięci pro−
gramu, uniemożliwiając tym skopiowanie
go przez osoby niepowołane. W przypadku
aplikacji z kodem programu umieszczone−
go w zewnętrznej pamięci programu (np.
EPROM) nie istnieje możliwość zabezpie−
czenia programu – hacker może w po pros−
tu wyjąć z układu pamięć EPORM (ROM)
i odczytać ją na dowolnym programatorze
(bez stosowania instrukcji MOVC) .
MOV @Ri, A
– do komórki o adresie znajdującym się w re−
jestrze R0 (i=0) lub R1 (i=1) zostaje wpisana
zawartość akumulatora
(Ri) <– A
– kod: 1 1 1 1 0 1 1 i gdzie i = 0 lub 1
stąd: F6h, F7h
– cykle: 1
MOV Rn, #dana
– do rejestru Rn (R0...R7) zostaje wpisana
8–bitowa liczba
Rn <– dana gdzie n = 0...7
– kod: 01111n2 n1 n0 gdzie n2...n0
wskazują na R0...7 stąd: 78h–7Fh
– cykle: 1 bajty: 2 (kod instrukcji + dana)
– przykład: jeżeli chcemy np. wpisać do rejes−
tru R6 liczbę 16 można wydać komendę
MOV R6, #10h ;10h szesnastkowo to 16
dziesiętnie
bajty: 1
– przykład:
CLR A ;wyzerowanie akumulatora
MOV @R1, A ;wyzerowanie komórki
o adresie w R1
MOV adres, A
– do komórki o adresie „adres” zostaje wpi−
sana zawartość akumulatora
(adres) <– A
– kod: 11110101 F5h
– cykle: 1 bajty: 2 (kod instrukcji + adres)
– przykład:
MOV 00h, A ;wpisanie zawartości
akumulatora do komórki
o adresie 0
;instrukcja równoznaczna
zapisowi MOV R0, A w
;przypadku gdy
aktywnym zbiorem rej.
roboczych jest 0.
MOV @Ri, adres
– do komórki o adresie znajdującym się w re−
jestrze R0 (i=0) lub R1 (i=1) zostaje wpisana
zawartość komórki o adresie „adres”
(Ri) <– (adres)
– kod: 1 0 1 0 0 1 1 i
gdzie i = 0 lub 1
stąd: A6h, A7h
– cykle: 2 bajty: 2 (kod instrukcji + adres)
– przykład:
MOV R0, #11h
MOV @R0,10h ;przepisanie zawartości
komórki o adresie 10h do
komórki
;sąsiedniej o adresie 11h
MOV @Ri, #dana
– do komórki o adresie znajdującym się w re−
jestrze R0 (i=0) lub R1 (i=1) zostaje wpisana
wartość stała (liczba)
(Ri) <– dana
– kod: 0 1 1 1 0 1 1 i
MOV adres, Rn
– do komórki o adresie „adres” zostaje wpi−
sana zawartość rejestru Rn (R0...R7)
(adres) <– Rn gdzie n = 0...7
– kod: 10001n2 n1 n0 gdzie n2...n0
– wskazują na R0...7 stąd: 88h–8Fh
– cykle: 2 bajty: 2 (kod instrukcji + adres)
– przykład:
MOV 30h, R5 ;wpisanie do komórki
w wew. RAM zawartości
rejestru ;R5.
gdzie i = 0 lub 1
stąd: 76h, 77h
– cykle: 1 bajty: 2 (kod instrukcji + dana)
– przykład:
MOV @R0, #255 ;jeżeli wcześniej
rejestr R0 miał
wartość np. 30h, to w
;efekcie tej operacji
do komórki o adresie
30h zostanie
; wpisana liczba 255
MOV adres1, adres2
– przepisanie zawartości komórki o adresie
„adres2” do komórki o adresie „adres1”
(adres1) <– (adres2)
–kod: 10000101
– cykle: 2 bajty: 3 (kod instrukcji + adres2
+ adres1)
– przykład:
MOV 7Fh, 7Eh ;przepisanie zawartości
dwóch sąsiadujących
komórek w
;wew. RAM procesora
MOVC A, @A+DPTR
– do akumulatora zostaje załadowana dana z pa−
mięci programu spod adresu będącego sumą
bieżącej wartości wskaźnika danych DPTR i za−
wartości akumulatora. Najpierw procesor two−
rzy 16–bitowy adres poprzez dodanie DPTR
i A potem pobiera spod tego adresu daną (bajt
kodu programu) i umieszcza ją z akumulatorze.
A <– (A + DPTR)
– kod: 1 0 0 1 0 0 1 1
MOV DPTR, #dana16
– instrukcja załadowania 16–bitowego, bez−
względnego adresu do wskaźnika danych
DPTR
DPTR <– dana16 gdzie „dana16” jest
liczbą 16–bitową (zakres: 0...FFFFh)
– kod: 1 0 0 1 0 0 0 0 90h
– cykle: 2 bajty: 3 (kod instrukcji + starszy
bajt + młodszy bajt liczby „dana16”)
– przykład:
MOV DPTR,#0 ;wyzerowanie wskaźnika
danych
93h
– cykle: 2
bajty: 1
– przykład:
MOV DPTR, #tablica
MOV adres, @Ri
– do komórki o adresie „adres” zostaje wpi−
sana zawartość komórki której adres
znajduje się w rejestrze R0 (i=0) lub R1 (i=1)
(adres) <– (Ri)
– kod: 1000011i gdzie i = 0 lub 1
stąd: 86h, 87h
– cykle: 2 bajty: 2 (kod instrukcji + adres)
– przykład:
MOV R1, #32
MOV 32h, @R1 ;przepisanie zawartości
komórki o adresie 32h na nia
;samą (fizycznie operacja
ta nie ma efektu)
;załadowanie
adresu tablicy
do wskaźnika
DPTR
2. Instrukcja MOVC
Podobną do instrukcji MOV jest
MOVC. Służy ona także do przemieszcza−
nia danych z tym że przemieszczanie do−
tyczy tylko pobierania danych (bajtów)
znajdujących się w kodzie programu, czy−
li w wewn. lub zewnętrznej pamieci pro−
gramu procesora. W praktyce instrukcję
tę wykorzystuje się do pobierania danych
stałych (np. tablic przy konwersji arytme−
tycznej lub logicznej. Innym często spoty−
kanym przypadkiem jest generowanie
standardowych komunikatów (teksto−
wych) np. na wyświetlaczach LCD
w określonych sytuacjach pracy proceso−
ra w celu poinformowania użytkownika
MOV
A,#3
;pobierz czwarty
element tablicy
(nie trzeci, bo od
;elementy są
numerowane
od zera)
MOVC A, @A+DPTR
;pobranie
elementu –
litera ‘A’
.......
;gdzie tablica
może być
zdefiniowana
w programie
jako np.:
MOV adres, #dana
– do komórki o adresie „adres” zostaje wpi−
sana wartość stałą (8–bitowa liczba)
(adres) <– stała
– kod: 01110101 75h
– cykle: 2 bajty: 3 (kod instrukcji + adres
+ dana)
– przykład:
tablica DB
‘ WITAJ KOLEGO!’
MOVC A, @A+PC
– do akumulatora zostaje załadowana dana
z pamięci programu spod adresu będącego
sumą wartości: licznika rozkazów PC (na−
38
E LEKTRONIKA DLA WSZYSTKICH 12/97
152728896.003.png
Też to potrafisz
stępnej po tej instrukcji) i zawartości aku−
mulatora. W praktyce przy wykonaniu tej in−
strukcji, adres pobrania jest równy sumie
zawartości akumulatora oraz wartości liczni−
ka rozkazów – będzie to adres następnej po
MOVC instrukcji.
A <– (A + PC)
– kod: 10000011
A <– (DPTR)
– kod: 11100000
E0h
tu P2 procesora, co w wielu przypadkach
jest wręcz niezbędne. Można by oczywiście
zaadresować tę pamięć za pomocą instrukcji
MOVX A, @DPTR (podając wtedy adres
MOV DPTR, #0124h), ale wtedy zniszczeniu
uległy by stany pozostałych, nie dołączonych
do pamięci, końcówek portu P2.
– cykle: 2
bajty: 1
– przykład:
aby odczytać zawartość komórki z zewn.
RAM o adresie np. 1240h nalezy wykonać
instrukcje:
MOV DPTR, #1240h ;załadowanie
adresu (16–bit) do
wskaźnika DPTR
MOVX A, @A+DPTR ;i odczyt danej spod
tego adresu
83h
– cykle: 2
bajty: 1
MOVX @Ri, A
– do obszaru zewnętrznej pamięci danych
o adresie znajdującym się w rejestrze Ri (R0
gdy i=0 lub R1 gdy i=1) zostaje przesłana za−
wartość akumulatora. Innymi słowy jest to
zapis do zewnętrznej pamięci danych.
(Ri) <– A gdzie Ri = R0, lub R1
– kod: 1 111001i
– przykład:
CLR A ;wyzerowanie akumulatora
MOVC A, @A+PC ;pobranie do
akumulatora kodu
rozkazu NOP (00h)
......
;dana znajduje się
w akumulatorze
NOP
......
MOVX @DPTR, A
– do komórki zewnętrznej pamięci danych
o podanym w DPTR adresie zostaje przesła−
na zawartość akumulatora – innymi słowy
jest to operacja zapisu do zewnętrznej pa−
mięci danych.
(DPTR) <– A
– kod: 11110000
gdzie i = 0,1
stąd: F2, F3
3. Instrukcja MOVX
Instrukcja MOVX służy do przesyłania
danej pomiędzy akumulatorem a zewnęt−
rzną pamięcią danych. Wykonanie tej in−
strukcji uaktywnia sygnały /RD (przy od−
czycie z zewnętrznej pamięci) lub /WR
(przy zapisie) procesora – piny P3.7 i P3.6.
Dodatkowo porty P0 i P2 pełnią wtedy ro−
lę magistrali systemowej dzięki której wy−
stawiany jest adres oraz przekazywana
dana do zewnętrznej pamięci danych.
Jak już zapewne wiesz z poprzednich
odcinków naszego cyklu zewnętrzna pa−
mięć danych można zaadresować w dwo−
jaki sposób.
Pierwszą metodą jest użycie pełnego
16–bitowego adresu. W takim przypadku
procesor odczytując lub zapisując daną
w tej pamięci (właśnie dzięki instrukcji
MOVX) młodszą część adresu zatrzaskuje
w zewnętrznym latch u (np. 74573),star−
szą wystawia na port P2.
Często jednak używana kostka pamię−
ci SRAM jest mniejszej pojemności
i większość linii adresowych starszego
bajta (adresu) nie jest wykorzystana do
sterowania pamięcią. W takim przypadku
możliwe jest adresowanie pamięci za po−
mocą tzw. „stronicowania”. Ten sposób
omówiliśmy już w poprzednich odcin−
kach szkoły mikroprocesorowej. Jak za−
pewne pamiętasz w takim trybie adreso−
wania procesor przy obsłudze zewnętr−
znej pamięci danych wystawia tylko
młodszą część adresu (A0...A7), nato−
miast port P2 nie jest modyfikowany, co
pozwala użytkownikowi na pełna kontro−
lę sposobu i kierunku ustawienia jego
końcówek – a więc jest metodą na mak−
symalne wykorzystanie cechy „jed−
noukładowości” procesora.
I tak dwa wspomniane dwa tryby ad−
resowania zewnętrznej RAM maja swoje
odzwierciedlenie w liście instrukcji z wy−
korzystaniem rozkazu MOVX, oto one.
– cykle: 2
bajty: 1
– przykład:
weźmy sytuacje z poprzedniego przykładu,
ale tym razem chcemy zapisać daną znajdu−
jącą się w akumulatorze do komórki o adre−
sie 00h na stronie 7 (innymi słowy fizyczny
adres komórki będzie równy: 0700h), w tym
celu należy wykonać ciąg instrukcji:
SETB P2.2 ;ustawienie linii
adresowej A10
SETB P2.1 ;ustawienie linii
adresowej A9
SETB P2.0 ;ustawienie linii
adresowej A8 (strona: 7)
MOV R1, #00h ;załadowanie
adresu komórki
do wskaźnika
MOVX @R1, A ;i zapisane danej
z akumulatora
w zewn. RAM
F0h
– cykle: 2
bajty: 1
– przykład:
aby zapisać daną w obszarze zewnętrznej
pamięci danych pod adresem np. 8000h na−
leży wykonać instrukcje:
MOV A, ...... ;w miejsce kropek należy
wpisać źródło danej
MOV DPTR, #8000h
;podajemy też
adres zapisu
MOVX @DPTR,A
;i zapisujemy
daną w zewn.
pamięci
Tryb stronicowania
(niepełnego adresu)
......
MOVX A, @Ri
– do akumulatora zostaje przesłana zawartość
komórki w obszarze zewn. pamięci danych
spod adresu znajdującego się w rejestrze
R0 (i=0) lub R1 (i=1): adres 8–bitowy
A <– (Ri) gdzie Ri = R0, lub R1
– kod: 1 1 1 0 0 0 1 i
gdzie i = 0,1
4. Instrukcje przesyłania wymiany danych
ze stosem
PUSH adres
– ang. „push onto stack”, prześlij na stos
– w wyniku tej operacji zawartość wskaźnika
stosu SP jest zwiększana o 1, po czym na
wierzchołek stosu (adresie w wew. RAM
wskazywanym przez SP) zostaje zapisana
zawartość komórki z wew. RAM o podanym
adresie bezpośrednim „adres”. Innymi sło−
wy wykonywana jest operacja „przesłania
na stos”.
SP <– SP + 1, (SP) <– (adres)
– kod: 1 1000000
stąd: E2, E3
– cykle: 2
bajty: 1
– przykład:
niech w układzie z procesorem 8951 pracu−
jącym z wewn. pamięcią programu znajduje
się zewnętrzna pamięć danych w postaci
kostki SRAM 2kB – typ 6116.
Linie adresowe A0...A7 tej pamięci są dołą−
czone do zatrzasku młodszej części adresu
szyny procesora (patrz poprzednie odcinku
cyklu). Trzy starsze linie A8...A10 są dołą−
czone np. do pinów P2.0, P2.1 i P2.2 proce−
sora, pozostałe końcówki portu P2
(P2.2...P2.7) są wykorzystywane np. do ste−
rowania przekaźnikami jakiegoś urządzenia
zewnętrznego. Aby odczytać daną z tej pa−
mięci np. spod adresu 24h na stronie pierw−
szej (strony liczone od 0 do 7, bo 2kB / 256
= 8 stron) należy wykonać instrukcje:
CLR P2.2 ;wyzerowanie linii
adresowej A10
CLR P2.1 ;wyzerowanie linii
adresowej A9
SETB P2.0 ;ustawienie linii
adresowej A8 (strona: 1)
MOV R1, #24h ;załadowanie
adresu komórki
do wskaźnika
MOVX A, @R1 ;i przesłanie jej zawartości
do akumulatora
C0h
– cykle: 2
bajty: 2 (kod instrukcji
C0h + adres)
– przykłady:
PUSH ACC ;przesłanie akumulatora
na stos
PUSH B
;przesłanie rejestru B
na stos
PUSH 20h
;przesłanie zawartości
komórki o adresie 20h
na stos
PUSH DPH
;przesłanie 16–bitowego
wskaźnika danych na stos
PUSH DPL
;w dwóch instrukcjach,
starsza i młodsza część
DPTR
.....
Tryb pełnego adresu
(16–bitowego)
POP adres
– ang. „pop from stack” ,zdejmij ze stosu
– w wyniku tej operacji dana znajdująca się
pod adresem w wewn. RAM określonym
w SP zostaje wpisana do komórki o poda−
nym adresie bezpośrednim „adres”. Na−
stępnie wskaźnik stosu SP zostaje zmniej−
szony o 1. Innymi słowy wykonywana jest
operacja „zdjęcia ze stosu”.
MOVX A, @DPTR
– do akumulatora zostaje załadowana dana
(bajt) z zewnętrznej pamięci danych (odczyt
z zewnętrznej pamięci danych) spod adresu
w DPTR
......
Zauważ że przy takim zaadresowaniu pamię−
ci nie uległy modyfikacji piny P2.3...P2.7 por−
E LEKTRONIKA DLA WSZYSTKICH 12/97
39
152728896.004.png
Też to potrafisz
(adres) <– (SP), SP <– SP – 1
– kod: 11010000
D0h
A 3–0 <–> (Ri) 3–0
– kod: 1 1 0 1 0 1 1 i
gdzie i = 0,1
e) przykład:
SETB C
ADDC A,#0 ;inkrementacja
akumulatora
z wykorzystaniem C
– cykle: 2
bajty: 2 (kod instrukcji
stąd: D6h, D7h
– cykle: 1
D0h + adres)
– przykład: jeżeli w poprzednim przykładzie
załadowaliśmy na stos rejestry w w/w kolej−
ności, to aby poprawnie je odtworzyć nale−
ży zdjąć je w kolejności odwrotnej, czyli:
POP DPL
POP DPH
bajty: 1
– przykład:
MOV A, #5Ah
MOV @R1, #A5h
XCHD A, @R1
.... ;teraz w akumulatorze
będzie liczba 55h, a pod
;adresem @R1 liczba AAh
Operacje na bitach
Do tej pory omawialiśmy instrukcje
operujące na bajtach danych. Procesor
8051 i mu pochodne zawiera bardzo po−
mocny zestaw instrukcji do wykonywa−
nia operacji na pojedynczych bitach.
Dzięki temu możliwe jest wykonanie
wielu często niezbędnych operacji, jed−
na z nich było omówione wcześniej stro−
nicowanie zewnętrznej pamięci danych
(przykład z instrukcją MOV @Ri,A). Trze−
ba wiedzieć że większość rejestrów
specjalnych SFR procesora posiada
możliwość bezpośredniego adresowa−
nia ich bitów. I tak np. akumulator (A)
składa się z 8–miu adresowanych bitów
Acc.7 ... Acc.0
Toteż aby np. ustawić wybrane bity te−
go rejestru nie trzeba modyfikować całoś−
ci a jedynie wyzerować lub ustawić wy−
brani bit. Dla przykładu prześledzimy sytu−
ację kiedy chcemy wyzerować bit 4 aku−
mulatora bez ingerowania w pozostałe,
można wykonać te zadanie dwojako:
– poprzez instrukcję iloczynu logicznego:
ANL A, #11101111b ;wyzerowanie
bitu 4
akumulatora
– lub poprzez instrukcję działającą na po−
jedynczym bicie:
CLR Acc.4
Instrukcje operujące na bitach nabiera−
ją szczególnie praktycznego znaczenia
przy badaniu stanu końcówek (portów)
mikroprocesora lub przy ich sterowaniu
(ustawianiu na nich poziomów logicznych
niskich lub wysokich oraz przy ustawianiu
w stan wysokiej impedancji). Problemem
tym zajmiemy się przy okazji kolejnej lek−
cji ze szkoły mikroprocesorowej.
....
;odtworzenie wskaźnika
DPTR
CLR bit
a) ang. „clear bit” ,zeruj bit
b) w wyniku tej operacji wyzerowany zostaje
bit którego adres podany jest bezpośrednio
(bit) <– 0
c) kod: 1 1 0 0 0 0 1 0 C2h
d) cykle: 1 bajty: 2 (instrukcja C2 + adres bitu)
e) przykład:
CLR
POP 20h
;następnie komórki
o adresie 20h
POP B
;i rejestru B
POP ACC
;wreszcie akumulatora
....
AFh
;zablokowanie systemu
przerwań (EA w słowie
IE = 0)
5. Dodatkowe instrukcje przemieszczania
danych
XCH A, Rn
– ang. „exchange register with accumulator”,
wymień akumulator z rejestrem
– w wyniku tej operacji zawartość akumulato−
ra zostaje wymieniona z zawartością rejest−
ru Rn (R0...R7), wymieniona tzn. że liczba
znajdująca się w A znajdzie się w Rn, i od−
wrotnie.
A<–> Rn
– kod: 11001n2 n1 n0 gdzie n2...n0
wskazują na R0...7 stąd: C8h–CFh
– cykle: 1
....
Przykład ten można także zapisać w postaci
CLR EA
bajty: 1
SETB bit
a) ang. „set bit”,ustaw bit
b) w wyniku tej operacji ustawiony zostaje bit
którego adres podany jest bezpośrednio
(bit) <– 1
c) kod: 1 1 0 1 0 0 1 0 D2h
d) cykle: 1 bajty: 2 (instrukcja + adres bitu)
e) przykład:
SETB P1.2 ;ustawienie wysokiego
poziomu logicznego
;na wyprowadzeniu
2 portu P1 (pin 3 procesora)
– przykład:
MOV A, #10 ;nadanie wartości
akumulatorowi
MOV R4, #23 ;nadanie wartości
rejestrowi R4
CPL C
a) ang. „complement carry” ,zaneguj flagę
przeniesienia
b) w wyniku tej operacji flaga C zostaje zane−
gowana
C <– /C
c) kod: 1 0 1 1 0 0 1 1
XCH A, R4
;wymiana danych
....
;teraz w A jest liczba 23,
a w R4 liczba 10
XCH A, adres
– w wyniku tej operacji zawartość akumulato−
ra zostaje wymieniona z zawartością komór−
ki w wew. pamięci RAM o podanym adresie
bezpośrednim
A <–> (adres)
– kod: 11000101 C5h
– cykle: 1 bajty: 2 (kod instrukcji C5 + adres)
– przykład:
MOV A,#99
MOV 00h, #0
XCH A, 00h ;teraz w akumulatorze
będzie 0
B3h
d) cykle: 1
bajty: 1
e) przykład:
SETB C
; C=1
CPL
C
;teraz C=0
CPL bit
a) ang. „complement bit” ,zaneguj bit
b) w wyniku tej operacji zanegowany zostanie
bit,którego adres podany jest bezpośrednio
(bit) <– /(bit)
c) kod: 1 0 1 1 0 0 1 0
B2h
d) cykle: 1 bajty: 1
e) przykład: wykonanie instrukcji
neg: CPL P1.0
SJMP neg
spowoduje nieprzerwane generowanie na
pinie 1 procesora fali prostokątnej
o częstotliwości równej: ..... (jako ćwiczenie
powinieneś sam wpisać wartość – odpo−
wiedź w kolejnym odcinku naszego cyklu).
....
XCH A, @Ri
– w wyniku tej operacji zawartość akumulato−
ra zostaje wymieniona z zawartością komór−
ki w wew. RAM o adresie znajdującym się
w rejestrze R0 (i=0) lub R1 (i=1)
A <–> (Ri)
– kod: 1100011i
CLR C
a) ang. „clear carry”,zeruj flagę przeniesienia
b) w wyniku tej operacji wyzerowany zostaje znacz−
nik (bit w rejestrze PSW) przeniesienia C
C <– 0
c) kod: 1 1 0 0 0 0 1 1
gdzie i = 0,1
stąd: C6h, C7h
– cykle: 1 bajty: 1
– przykład: wykonanie instrukcji
MOV R1, #20h
CLR A
XCH A, @R1
jest równoważne
MOV A, 20h
MOV 20h, #0
zastanów się dlaczego ?
ANL C, bit
a) ang. „AND direct bit to carry” ,iloczyn lo−
giczny znacznika C i bitu o adresie podanym
jako bezpośredni
b) w wyniku tej operacji zostanie wykonany
iloczyn logiczny flagi przeniesienia C oraz bi−
tu o adresie „bit”, a wynik zostanie umiesz−
czony w C
C <– C
C3h
d) cykle: 1
bajty: 1
e) przykład:
CLR C ;wyzerowanie przeniesienia
SUBB A, B
;aby odjąć A – B bez pożyczki
....
(bit)
c) kod: 1 0 0 0 0 0 1 0 82h
d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu)
e) przykład:
ANL C, D6h ;iloczyn flagi przeniesienia
C i flagi przeniesienia
;pomocniczego AC
(jej adres w słowie
PSW to D6h)
SETB C
a) ang. „set carry”,ustaw flagę przeniesienia
b) w wyniku tej operacji ustawiona zostaje fla−
ga przeniesienia
C <– 1
c) kod: 1 1 0 1 0 0 1 1
XCHD A, @Ri
– w wyniku tej operacji młodszy półbajt (bity
3–0) akumulatora zostaje wymieniony
z młodszym półbajtem komórki w wew.
RAM o adresie zawartym w rejestrze Ro
(i=0) lub R1 (i=1).
D3h
d) cykle: 1
bajty: 1
40
E LEKTRONIKA DLA WSZYSTKICH 12/97
152728896.005.png
Też to potrafisz
Też to potrafisz
ANL C, /bit
a) ang. „AND complement of direct bit to car−
ry”,iloczyn logiczny znacznika C i zanego−
wanego bitu o adresie podanym jako bezpo−
średni
b) w wyniku tej operacji zostanie wykonany
iloczyn logiczny flagi przeniesienia C oraz za−
negowanego bitu o adresie „bit”, a wynik
zostanie umieszczony w C
C <– C
c) kod: 1 0 1 0 0 0 0 0 A0h
d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu)
e) przykład:
ORL C, /D7h ;równoważne ustawieniu
znacznika C
;bo zsumowano C przed
zanegowane C
;(adres C w PSW to D7h)
Załóżmy że bit1 zdefiniowaliśmy jako:
bit1 EQU 20h ;EQU to deklaracja
równoważności
– przypisania
;nazwie umownej
(wyrazowi) konkretnego
adresu
a bit 2 jako
bit2 EQU 30h
Chcąc teraz przenieść zawartość bitu 1 do
bitu 2 często początkujący wykonują błędną
operację:
MOV bit2, bit1
co w efekcie nie powoduje przeniesienia bi−
tu 1 do 2 ale przepisanie zawartości komórki
wew. RAM o adresie 20h do komórki o adre−
sie 30h – wykonywana jest zatem operacja
na bajtach ,a nie przenoszenie bitów (patrz
instrukcja: MOV adres1, adres2 )
Prawidłową odpowiedzią na postawione za−
danie będzie wykorzystania instrukcji MOV
działających na bitach i znaczniku przenie−
sienia C w postaci sekwencji:
MOV C, bit1 ;najpierw załaduj bit1 do C
MOV bit2, C ;a potem C do bitu 2,
w efekcie przeniosłeś bit1
do 2
/(bit)
c) kod: 1 0 1 1 0 0 0 0 B0h
d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu)
e) przykład:
ANL C, /D7h ;równoważne
wyzerowaniu znacznika C
;bo wymnożono C przed
zanegowane C
;(adres C w PSW to D7h)
MOV C, bit
a) ang. „move direct bit to carry” ,przenieś za−
wartość bitu o podanym adresie bezpośred−
nim do znacznika przeniesienia C
b) w wyniku tej operacji zawartość bitu o po−
danym adresie „bit” zostanie przepisana do
znacznika przeniesienia C
C <– (bit)
c) kod: 1 0 1 0 0 0 1 0 A2h
d) cykle: 1 bajty: 2 (kod instrukcji A2h + adres
bitu)
e) przykład:
MOV C, P1.7 ;odczyt stanu końcówki
7 portu P1 i wpisanie go
do C
ORL C, bit
a) ang. „OR direct bit to carry”,logiczna suma
znacznika C i bitu o adresie podanym jako
bezpośredni
b) w wyniku tej operacji zostanie wykonana
suma logiczna flagi przeniesienia C oraz bitu
o adresie „bit”, a wynik zostanie umiesz−
czony w C
C <– C (bit)
c) kod: 0 1 1 1 0 0 1 0 72h
d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu)
e) przykład:
ORL C, D6h ;suma flagi przeniesienia
C i flagi przeniesienia
;pomocniczego AC
(jej adres w słowie PSW
to D6h)
MOV bit, C
a) ang. „move carry to direct bit”, przenieś za−
wartość znacznika C do bitu o podanym ad−
resie bezpośrednim
b) w wyniku tej operacji zawartość znacznika
przeniesienia C zostanie przepisana do bitu
o podanym adresie bezpośrednim „bit”
(bit) <– C
c) kod: 1 0 0 1 0 0 1 0
92h
....
W dzisiejszym odcinku to wszystkie
instrukcje,w trzeciej części – ostatniej
opisującej listę poleceń procesora 8051
zapoznasz się drogi Czytelniku z instruk−
cjami skoków warunkowych, bezwarun−
kowych i do podprogramów. Po zapozna−
niu się z pozostałymi poleceniami roz−
poczniemy wspólne tworzenie pierw−
szych aplikacji (programów) na procesor
8051 przy wykorzystaniu zmontowanego
przez Ciebie komputerka edukacyjnego.
Na razie w celu przećwiczenia omó−
wionych dzisiaj instrukcji zapraszam do
wnikliwej lektury „Lekcji 3” szkoły mikro−
procesorowej.
d) cykle: 2
bajty: 2 (kod instrukcji
+ adres bitu)
e) przykład: – pytanie?...
jak przenieść zawartość jakiegoś bitu (o podanym
adresie bezpośrednim do innego o innym adresie
bezpośrednim – czyli wykonać operację :
(bit2) <– (bit1)
Otóż do wykonania tego niezbędny jest
znacznik C, nie można bowiem wykonać ta−
kiej operacji bezpośrednio jednym rozkazem.
Nie istnieje w 8051 instrukcja która by wyko−
nywała taką operację przeniesienia zawartoś−
ci jednego bitu do drugiego bezpośrednio.
ORL C, /bit
a) ang. „OR complement of direct bit to car−
ry”,suma logiczna znacznika C i zanegowa−
nego bitu o adresie podanym jako bezpo−
średni
b) w wyniku tej operacji zostanie wykonana
suma logiczna flagi przeniesienia C oraz za−
negowanego bitu o adresie „bit”, a wynik
zostanie umieszczony w C
C <– C
/(bit)
Sławomir Surowiński
Jako uwieńczenie analizy drugiej
części listy instrukcji procesora 8051
proponuję abyśmy przećwiczyli przesy−
łanie danych pomiędzy procesorem
a zewnętrzną pamięcią danych, umiesz−
czoną na płytce komputerka – układ U4.
Otóż wspólnie napiszemy prostą proce−
durę testującą wszystkie komórki tej pa−
mięci, z dodatkowym wyświetlaniem na
wyświetlaczu aktualnie testowanego
adresu i ewentualnych błędów. Wyko−
rzystamy przy tym m.in. instrukcję
MOVX,a pamięć będziemy adresować
z wykorzystaniem pełnego 16–bitowego
adresu.
Popatrzmy zatem i przeanalizujmy lis−
ting przykładowego programu, realizują−
cego procedurę testowania pamięci.
Program zasadniczo składa się
z 3 części:
– w pierwszej na wyświetlaczu wypisywa−
ny adres aktualnie testowanej komórki
– w drugiej: testowana jest komórka pa−
mięci przez zapisanie w niej, odczyt
i weryfikację wartości testowej: czyli
dwóch liczb: 55h i AAh. Wybrano właś−
nie takie liczby, bowiem jak pewnie za−
uważyłeś są one kombinacjami zer i jedy−
nej na przemian: 55h = 01010101b,a AAh
= 10101010h, co pozwala na spraw−
dzenie wszystkich 8–miu bitów danej
komórki pamięci.
– w trzeciej części inkrementowany jest
adres wskaźnika DPTR po czym jeżeli
nie przekracza on założonego obszaru
pamięci (8100h...9FFFh) wykonywany
jest skok na początek procedury i tes−
towana jest następna komórka.
W przypadku wykrycia błędu następu−
je skok do etykiety „blad” w której
w efekcie zostaje wypisany komunikat
„Err” – skrót od „error” – z angielskiego
„błąd” wraz z widniejącym adresem
wadliwej komórki.
W przypadku przetestowania całego
zakresu pamięci wypisany zostaje komu−
nikat o zakończeniu: „End” – koniec.
Zauważmy że testowany obszar za−
czyna się od adresu 8100h, a nie np.
8000h, dlaczego? Otóż pamiętajmy że
w obszarze 8000h....8040h znajduje się
kod naszego programu, toteż gdybyśmy
wpisali jako wartość początkową adres
8000h, program zostałby zamazany
i komputerek zawiesiłby się.
Ta sama uwaga dotyczy adresu koń−
cowego, w przypadku pamięci 8kB
(6264). Posiadacze komputerków
z 32kB RAM (62256) mogą zakończyć
testowanie pamięci na adresie FFFFh.
E LEKTRONIKA DLA WSZYSTKICH 12/97
41
Lekcja 3
152728896.001.png
Zgłoś jeśli naruszono regulamin