23_10.pdf

(186 KB) Pobierz
152728894 UNPDF
Też to potrafisz
W kolejnym odcinku poświęconym
naszym wspólnym staraniom mają−
cym na celu ujarzmienie mikrokont−
rolera 8051 postaram się zapoznać
Was drodzy Czytelnicy w przystęp−
ny sposób z listą instrukcji tego pro−
cesora. Na końcu tego odcinka cze−
ka na Was druga już lekcja – czyli
kolejny praktyczny krok w nauce
z wykorzystaniem naszego kompu−
terka edukacyjnego z 8051.
Dziś wspólnie napiszemy i przeanali−
zujemy krótki ale już prawdziwie
asemblerowy program
Mikrokontrolery?
To takie proste...
Część 7
Asembler – język maszynowy procesora
W poprzednim odcinku poznałeś już
ideę tworzenia programów na mikrokont−
rolery 8051. Wiesz że do tego celu nie−
zbędny jest zestaw instrukcji danego pro−
cesora (u nas jest to rodzina MCS−51, któ−
ra ma wspólny język programowania) oraz
znajomość kodów numerycznych po−
szczególnych instrukcji w przypadku kiedy
nie masz dostępu do komputera i wszyst−
kie czynności musisz wykonać ręcznie.
W przypadku kiedy do dyspozycji progra−
misty jest komputer, procedurę tłumacze−
nia instrukcji zapisanych jawnie – w języku
asemblera – automatycznie wykonuje
komputer korzystający z programu zwane−
go kompilatorem. Autor cyklu zadbał, aby
każdy z Was drodzy Czytelnicy, niskim
kosztem mógł stać się posiadaczem takie−
go kompilatora. Jest on dostępny na dys−
kietkach 3,5” w ofercie handlowej AVT
pod nazwą AVT−2250/D. Ważną informacją
jest to że zamieszczono tam dwie wersje
kompilatora: wersję angielską oraz pols−
ką!. Jest to chyba pierwszy program tego
typu komunikujący się w naszym ojczys−
tym języku z programistą. Dzięki temu
osoby nie znające angielskiego będą mog−
ły bez problemów korzystać z takiej wers−
ji kompilatora. Funkcjonalnie obie wersje
są takie same, to znaczy że wykonują
wszystkie czynności identycznie, jedynie
komunikaty zgłaszane przez program wy−
stępują w dwóch rożnych językach, jak
wspomniałem wcześniej. Na dyskietce
znajduje się plik tekstowy z rozszerzeniem
.DOC, w którym zawarte są informacje
o kompilatorze i jego możliwościach nie−
zbędne do prawidłowego posługiwania
się nim. Dlatego nie zbędę opisywał
szczegółowo tych spraw, ponieważ wśród
naszych czytelników są osoby nie mające
komputera PC a poza tym każdy zaintere−
sowany PC−towiec będzie miał sam okaz−
ję na zapoznanie się z instrukcją użytkowa−
nia programu.
Ze względu na mocno ograniczone
możliwości „ręcznej” kompilacji tworzo−
nych przez Ciebie programów do postaci
maszynowej, powinieneś już teraz zasta−
nowić się nad możliwością nabycia lub
przynajmniej korzystania z komputera PC,
nawet poczciwej AT czy XT. Efektywne,
pozbawione niepotrzebnych pomyłek,
tworzenie nawet mało skomplikowanych
programów jest możliwe tylko przy wyko−
rzystaniu komputera oraz kompilatora,
który jest dostępny dla wszystkich zainte−
resowanych po przystępnej cenie.
W tym miejscy chcę uspokoić wszyst−
kich antykomputerowców. Wszystkie
przedstawiane w cyklu przykładowe pro−
gramy będą drukowane w postaci czytel−
nej i jasnej także dla tego grona czytelni−
ków. Ułatwi to analizę i pokaże jak
w praktyce tłumaczy się komendy asem−
blera na język maszynowy.
W tym odcinku szkoły mikroprocesoro−
wej zapoznamy się z listą instrukcji proce−
sora, oraz dodatkowo zbierzemy „w ca−
łość” wiadomości dotyczące wszystkich
rejestrów specjalnych SFR – także tych
nie omawianych (na razie). Wszystko to
jest umieszczone dodatkowo we wkładce
wewnątrz numeru w postaci kartki A4
z nadrukowanymi dwustronnie skrótowo
wszysktimi informacjami niezbędnymi do
rozpoczęcie pisania własnych programów
oraz ich tłumaczenia (asemblacji) w przy−
padku osób które musza to zrobić ręcznie.
Taka „ściąga” powinna być przez Ciebie
drogi Czytelniku wycięta a następnie zafo−
liowana, by mogła ci służyć przez cały
czas zabawy z procesorem 8051. Zawie−
szenie jej na ścianie nad twoim biurkiem
z pewnością ułatwi Ci poznanie i zapamię−
tanie wszystkich instrukcji procesora, tak
abyś w przyszłości mógł władać asemble−
rem tak ja własnym ojczystym językiem –
gwarantuję Ci – jest to możliwe!
Przejdźmy zatem do zapoznania się
i wyjaśnienia działania wszystkich pole−
ceń kontrolerów 8051.
Lista instrukcji
Informacje zawarte w tej części artyku−
łu są rozszerzeniem listy przedstawionej
we wkładce wewnątrz numeru. Dlatego
analizują opisy poszczególnych instrukcji
powinieneś mieć także przed oczyma
wspomnianą „ściągę”. Kiedy w przy−
szłości nabierzesz nieco wprawy w posłu−
giwaniu się poleceniami asemblera, po−
trzebna będzie Ci tylko strona z wkładki,
36
E LEKTRONIKA DLA WSZYSTKICH 11/97
152728894.002.png
Też to potrafisz
a do niniejszego opisu będzie mógł za−
wsze wrócić w przypadku niejasności,
szczególnie wtedy jeżeli będziesz chciał
tworzyć programy nie mając dostępu do
komputera PC. Tak więc zaczynamy.
Opis każdej instrukcji składa się zasad−
niczo z następujących elementów:
– nazwy angielskiej i polskiej instrukcji: pkt. a)
– krótkiego opisu działania instrukcji: pkt.b)
– wyszczególnienia znaczników na które
działa instrukcja: pkt. c)
– opisu szczegółowego instrukcji lub jej
rodzajów: pkt. d), wraz z podaniem for−
matu i kodów maszynowych instrukcji,
w zapisanych binarnie i heksadecymal−
nie, z podaniem ilości cykli i bajtów ko−
du oraz ewentualnie poparte przykła−
dem lub uwagami dotyczącymi efek−
tów użycia danej instrukcji.
Większość z tych informacji znajduje
się także w tabeli zestawieniowej instruk−
cji we wkładce wewnątrz numeru.
b) Do wartości przechowywanej w akumulato−
rze dodawany jest wskazany argument oraz
zawartość znacznika przeniesienia C, a wy−
nik zostaje wpisany do akumulatora.
c) znaczniki: C, AC i OV
d) rodzaje instrukcji:
– ADDC A , Rn
do akumulatora dodawana jest zawartość
rejestru Rn oraz C
A <− A + Rn + C gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 00111n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 38h−3Fh
cykle: 1 bajty: 1
przykład: ADDC A , R4
– ADDC A , adres
do akumulatora dodawana jest zawartość
komórki w wewn. RAM
o adresie „adres” oraz znacznik C
A <− A + (adres) + C
kod: 00110101 35h
cykle: 1
bajty: 2 (kod instrukcji 35h + adres)
przykład: ADDC A , 7Eh (dodanie do A za−
wartości komórki o adresie 7Eh)
– ADDC A , @Ri
do akumulatora dodawana jest zawartość
komórki w wewn. RAM
o adresie wskazywanym przez rejestr Ri.
(R0 lub R1) oraz C
A <− A + (Ri) + C
kod: 0011011i gdzie i wskazuje na
R0 (i=0) lub R1 (i=1) stąd: 36h, 37h
cykle: 1 bajty: 1
przykład: ADDC A , @R1 (dodanie do A za−
wartości komórki o adresie w R1)
– ADDC A , #dana
do akumulatora dodawany jest argument
stały (8−bitowa liczba) i C
A <− A + dana + C
kod: 00110100
cykle: 1
bajty: 2 (kod instrukcji + dana)
przykład: ADDC A , #120 (dodanie do
A liczby 120)
A <− A – (Ri) – C
kod: 1 0 0 1 011i gdzie i wskazuje na R0
(i=0) lub R1 (i=1) stąd: 96h, 97h
cykle: 1 bajty: 1
przykład: SUBB A , @R1 (odjęcie od A za−
wartości komórki o adresie w R1oraz C)
– SUBB A , #dana
od akumulatora odejmowany jest argu−
ment stały (8−bitowa liczba) oraz C
A <− A – dana – C
kod: 1 0010100
94h
cykle: 1
bajty: 2 (kod instrukcji + dana)
przykład: ADDC A , #86h (odjęcie od A licz−
by 86h i znacznika C)
“INC”
a) ang. „increment” – zwiększenie o 1
b) do wskazanego argumentu jest dodawana
jedynka
c) znaczniki: bez zmian
d) rodzaje instrukcji:
– INC A
do akumulatora dodawana jest jedynka
A <− A + 1
kod: 0 0000100
04h
cykle: 1
bajty: 1
Operacje arytmetyczne
– INC Rn
do zawartości rejestru Rn dodawana jest
jedynka
Rn <− Rn + 1 gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 0 0 0 0 1 n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 08h−0Fh
cykle: 1
“ADD”
a) ang. „add to acummulator” – dodaj do aku−
mulatora
b) Do wartości przechowywanej w akumulato−
rze dodawany jest wskazany argument,
a wynik zostaje wpisany do akumulatora.
c) znaczniki: C, AC i OV
d) rodzaje instrukcji:
– ADD A , Rn
do akumulatora dodawana jest zawartość
rejestru Rn
A <− A + Rn gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 0 0 1 0 1 n2 n1 n0, gdzie n2...n0 –
wskazują na R0...7 stąd: 28h−2Fh
cykle: 1 bajty: 1
przykład: ADD A , R2
– ADD A , adres
do akumulatora dodawana jest zawartość
komórki w wewn. RAM
o adresie „adres”
A <− A + (adres)
kod: 0 0 1 0 0 1 0 1 25h
cykle: 1
bajty: 2 (kod instrukcji 25h + adres)
przykład: ADD A , 2Fh (dodanie do
A zawartości komórki o adresie 2Fh)
– ADD A , @Ri
do akumulatora dodawana jest zawartość
komórki w wewn. RAM
o adresie wskazywanym przez rejestr Ri
(R0 lub R1)
A <− A + (Ri).
kod: 0 0 1 0 0 1 1 i gdzie i wskazuje na
R0 (i=0) lub R1 (i=1) stąd: 26h, 27h
cykle: 1 bajty: 1
przykład: ADD A , @R0 (dodanie do
A zawartości komórki o adresie w R0)
– ADD A , #dana
do akumulatora dodawany jest argument
stały (8−bitowa liczba)
A <− A + dana
kod: 0 0 1 0 0 1 0 0
cykle: 1
bajty: 2 (kod instrukcji + dana)
przykład: ADD A , #120 (dodanie do A licz−
by 120)
“ADDC”
a) ang. „add to acummulator with carry” – do−
daj do akumulatora z przeniesieniem
bajty: 1
przykład: INC R3
– INC adres
do zawartości komórki o adresie „adres”
dodawana jest jedynka
(adres) <− (adres) + 1
kod: 0 0000101 05h
cykle: 1
bajty: 2 (kod instrukcji 05h + adres)
przykład: INC 12h (inkrementacja zawartoś−
ci komórki o adresie 12h)
– INC @Ri
do zawartości komórki o adresie wskazy−
wanym przez Ri dodawana jest jedynka
(Ri) <− (Ri) + 1
kod: 0 000011i gdzie i wskazuje na
R0 (i=0) lub R1 (i=1) stąd: 06h, 07h
cykle: 1 bajty: 1
przykład: INC @R1
– INC DPTR
do 16−bitowego wskaźnika danych DPTR
złożonego z rejestrów SFR: DPH (bardziej
znaczący bajt) i DPL (mniej znaczący bajt)
dodawana jest jedynka.
Znaczniki nie ulegają zmianie.
DPTR <− DPTR + 1
kod: 1 0100011 A3h
cykle: 2
“SUBB”
a) ang. „substract from acummulator with bor−
row” – odejmij od akumulatora z pożyczką
b) Od wartości przechowywanej w akumulato−
rze odejmowany jest wskazany argument
oraz zawartość znacznika przeniesienia C,
a wynik zostaje wpisany do akumulatora.
c) znaczniki: C, AC i OV
d) rodzaje instrukcji:
– SUBB A , Rn
od akumulatora odejmowana jest zawar−
tość rejestru Rn oraz C
A <− A – Rn – C gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 10011n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 98h−9Fh
cykle: 1 bajty: 1
przykład: SUBB A , R6
– SUBB A , adres
od akumulatora odejmowana jest zawar−
tość komórki w wewn. RAM
o adresie „adres” oraz znacznik C
A <− A – (adres) – C
kod: 10010101 95h
cykle: 1
bajty: 2 (kod instrukcji 95h + adres)
przykład: SUBB A , 45h (odjęcie od A zawartości
komórki o adresie 45h i znacznika C)
– SUBB A , @Ri
od akumulatora odejmowana jest zawar−
tość komórki w wewn. RAM
o adresie wskazywanym przez rejestr Ri.
(R0 lub R1) oraz C
bajty: 1
“DEC”
a) ang. „decrement” – zmniejszenie o 1
b) od wskazanego argumentu odejmowana
jest jedynka
c) znaczniki: bez zmian
d) rodzaje instrukcji:
– DEC A
od akumulatora odejmowana jest jedynka
A <− A – 1
kod: 0 0010100 14h
cykle: 1
bajty: 1
– DEC Rn
od zawartości rejestru Rn odejmowana jest
jedynka
Rn <− Rn – 1 gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
E LEKTRONIKA DLA WSZYSTKICH 11/97
37
152728894.003.png
Też to potrafisz
kod: 00011n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 18h−1Fh
cykle: 1
bajty: 1
cykle: 1 bajty: 1
Przykład: jeżeli w wyniku dodawania
w akumulatorze jest liczba 6Ah, to po ko−
rekcji dziesiętnej akumulator będzie zawie−
rał liczbę 70h, patrz listing:
MOV A,#69h ;wpisanie liczby 69h
do akumulatora
– ANL adres , #dana
wymnożona logicznie zostaje zawartość
komórki o adresie „adres” przez argument
stały (8−bitowa liczba)
(adres) <− (adres)
przykład: DEC R5
– DEC adres
od zawartości komórki o adresie „adres”
odejmowana jest jedynka
(adres) <− (adres) – 1
kod: 00010101 15h
cykle: 1
bajty: 2 (kod instrukcji 15h + adres)
przykład: DEC 3Fh (inkrementacja zawar−
tości komórki o adresie 3Fh)
– DEC @Ri
od zawartości komórki o adresie wskazy−
wanym przez Ri odejmowana jest jedynka
(Ri) <− (Ri) – 1
kod: 0001011i gdzie i wskazuje na
R0 (i=0) lub R1 (i=1) stąd: 16h, 17h
cykle: 1 bajty: 1
przykład: DEC @R0
dana
kod: 0 1 0 1 0 0 1 1 53h
cykle: 2 bajty: 3 (kod instrukcji
54h + adres + dana)
przykład: ANL 45h , #23 (mnożenie logicz−
ne zawartości komórki 45h i liczby 23)
(1)
ADD
A,#1
;inkrementacja
akumulatora poprzez
dodawanie
(2)
;w wyniku tego
w A będzie liczba 6Ah
“ORL”
a) ang. „logical OR” – zsumuj logicznie
b) wykonywana jest suma logiczna OR (doda−
wanie bitów „bit po bicie”) wskazanych
w instrukcji dwóch argumentów. Wynik
operacji jest wpisywany do argumentu pier−
wszego instrukcji
c) znaczniki: nie zmieniają się
d) rodzaje instrukcji:
– ORL A , Rn
dodana logicznie zostaje zawartość akumu−
latora i rejestru Rn, wynik w A
A <− A
da
A
;korekcja dziesiętna A,
w A będzie po tym
70h
(3).
Uwaga: jeżeli w przykładzie w linii (2) użyje−
my instrukcji INC A zamiast dodania jedyni,
to korekcja dziesiętna będzie nieprawidłowa.
Operacje logiczne
“MUL AB”
a) ang. „multiply” – pomnóż
b) 8−bitowa liczba bez znaku znajdująca się w aku−
mulatorze jest mnożona przez 8−bitową liczbę
bez znaku z rejestru B. 16−bitowy wynik wpisy−
wany jest do rejestrów B i A (bardziej znaczący
bajt do B, mniej znaczący bajt do A)
c) znaczniki: jeśli wynik mnożenia jest > 255 to
ustawiany jest znacznik OV, w przeciwnym razie
OV jest zerowany. znacznik C jest zerowany.
d) B.A <− A x B
kod: 10100100
“ANL”
a) ang. „logical AND” – pomnóż logicznie
b) wykonywany jest iloczyn logiczny AND
(mnożenie bitów „bit po bicie”) wskaza−
nych w instrukcji dwóch argumentów. Wy−
nik operacji jest wpisywany do argumentu
pierwszego instrukcji
c) znaczniki: nie zmieniają się
d) rodzaje instrukcji:
– ANL A , Rn
wymnożona logicznie zostaje zawartość
akumulatora i rejestru Rn, wynik w A
A <− A
Rn gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 0 1 0 0 1 n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 48h−4Fh
cykle: 1 bajty: 1
przykład: ORL A , R7
– ORL A , adres
dodana logicznie zostaje zawartość akumu−
latora i komórki o podanym adresie
„adres”, wynik zostaje umieszczony w A
A <− A (adres)
kod: 0 1 0 0 0 1 0 1 45h
cykle: 1
A4h
cykle: 4
bajty: 1
Rn gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 0 1 0 1 1 n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 58h−5Fh
cykle: 1 bajty: 1
przykład: ANL A , R3
– ANL A , adres
wymnożona logicznie zostaje zawartość
akumulatora i komórki o podanym adresie
„adres”, wynik zostaje umieszczony w A
A <− A
DIV AB”
a) ang. „divide” – podziel
b) 8−bitowa liczba bez znaku, znajdująca się
w akumulatorze jest dzielona przez 8−bito−
wą liczbę z rejestru B. Cześć całkowita ilora−
zu wpisywana jest do akumulatora, a reszta
z dzielenia do rejestru B. W przypadku gdy
dzielnik jest równy 0 (B=0) to po wykonaniu
operacji zawartość akumulatorze i rejestru
B jest nieokreślona oraz dodatkowo usta−
wiony zostaje znacznik OV.
c) znaczniki: C = 0, OV =0 (zerowane)
d) A <− A : B B <− reszta (A : B)
kod: 10000100 84h
cykle: 4 bajty: 1
bajty: 2 (kod instrukcji
45h + adres)
przykład: ORL A , 19h (dodanie logiczne
A i zawartości komórki pod adresem 19h)
– ORL A , @Ri
dodana logicznie zostaje zawartość akumu−
latora komórki w wewn. RAM o adresie
wskazywanym przez rejestr Ri. (R0 lub R1)
A <− A (Ri)
kod: 0 1 0 0 0 1 1 i gdzie i wskazu−
je na R0 (i=0) lub R1 (i=1) stąd: 46h, 47h
cykle: 1 bajty: 1
przykład: ORL A , @R0 (dodanie logiczne
A i zawartości komórki o adresie w R0)
– ORL A , #dana
dodana logicznie zostaje zawartość akumu−
latora przez argument stały (8−bitowa liczba)
A <− A dana
kod: 0 1 0 0 0 1 0 0 44h
cykle: 1
(adres)
kod: 0 1 0 1 0 1 0 1
55h
cykle: 1
bajty: 2 (kod instrukcji 55h + adres)
przykład: ANL A , 45h (mnożenie logicznie
A i zawartości komórki pod adresem 45h)
– ANL A , @Ri
wymnożona logicznie zostaje zawartość aku−
mulatora komórki w wewn. RAM o adresie
wskazywanym przez rejestr Ri. (R0 lub R1)
A <− A (Ri)
kod: 0 1 0 1 0 1 1 i gdzie i wskazuje na R0
(i=0) lub R1 (i=1) stąd: 56h, 57h
cykle: 1 bajty: 1
przykład: ANL A , @R1 (wymnożenie. logicz−
ne A i zawartości komórki o adresie w R1)
– ANL A , #dana
wymnożona logicznie zostaje zawartość aku−
mulatora przez argument stały (8−bitowa liczba)
A <− A
“DA A”
a) ang. „decimal adjust” – korekcja dziesiętna
b) wykonywana jest korekcja dziesiętna wyni−
ku dodawania. Operacja ta sprowadza wynik
do postaci dwóch cyfr dziesiętnych w kodzie
BCD, jeżeli argumenty były w kodzie BCD.
Rozkaz ten powinien być używany jedynie
w połączeniu z rozkazem dodawania (ADD,
ADDC). Także inkrementacja powinna odby−
wać się poprzez instrukcję ADD A, #1, a nie
INC A, bowiem w tym drugim przypadku nie
są ustawianie znaczniki C i AC, tak więc nie
może być wykonana korekcja dziesiętna.
Korekcja polega na tym że w przypadku kiedy
po wykonanej na akumulatorze operacji doda−
wania (ADD, ADDC) zawartość jego bitów
3...0 jest większa od 9 lub jest ustawiony
znacznik AC, to do wartości akumulatora doda−
wana jest liczba 6. Po tym jeżeli okaże się że
zawartość bitów 7...4 jest większa od 9 lub jest
ustawiony znacznik C to do tych bitów doda−
wana jest także liczba 6. Jeżeli podczas tej
ostatniej operacji wystąpiło przeniesienie to do
znacznika wpisywana jest 1, w przeciwnym
wypadku stan znacznika C nie zmienia się.
c) znaczniki: C, OV (patrz pkt.a)
d) A <− korekcja dziesiętna (A)
kod: 11010100
bajty: 2 (kod instrukcji
44h + dana)
przykład: ORL A , #23 (dodanie logiczne
A i liczby 23)
– ORL adres , A
dodana logicznie zostaje zawartość akumu−
latora i komórki o podanym adresie
„adres”, wynik zostaje umieszczony w ko−
mórce pamięci o adresie “adres”
(adres) <− (adres)
dana
kod: 0 1 0 1 0 1 0 0 54h
cykle: 1
bajty: 2 (kod instrukcji 54h + dana)
przykład: ANL A , #23 (mnożenie logiczne
A i liczby 23)
– ANL adres , A
wymnożona logicznie zostaje zawartość
akumulatora i komórki o podanym adre−
sie „adres”, wynik zostaje umieszczony
w komórce pamięci o adresie “adres”
(adres) <− (adres) A
kod: 0 1 0 1 0 0 1 1 52h
cykle: 1
A
kod: 0 1 0 0 0 0 1 1 42h
cykle: 1
bajty: 2 (kod instrukcji
42h + adres)
przykład: ORL A , 20h (dodanie logicznie
A i zawartości komórki pod adresem 20h)
– ORL adres , #dana
dodana logicznie zostaje zawartość komór−
ki o adresie „adres” oraz argument stały
(8−bitowa liczba)
(adres) <− (adres)
dana
kod: 0 1 0 0 0 0 1 1 43h
cykle: 2 bajty: 3 (kod instrukcji
43h + adres + dana)
przykład: ORL 12h , #99 (dodanie logiczne
zawartości komórki 12h i liczby 99)
bajty: 2 (kod instrukcji
55h + adres)
przykład: ANL A , 45h (mnożenie logicznie
A i zawartości komórki pod adresem 45h)
D4h
38
E LEKTRONIKA DLA WSZYSTKICH 11/97
152728894.004.png
Też to potrafisz
“XRL”
a) ang. „logical XOR” – zsumuj mod 2 (różnica
symetryczna)
b) wykonywana jest suma mod 2 XOR wska−
zanych w instrukcji dwóch argumentów.
Wynik operacji jest wpisywany do argu−
mentu pierwszego instrukcji
c) znaczniki: nie zmieniają się
d) rodzaje instrukcji:
– XRL A , Rn
zsumowana (mod 2) zostaje zawartość
akumulatora i rejestru Rn, wynik w A
A <− A
d) A <− 0
kod: 11100100 E4h
cykle: 1 bajty: 1
Przykład: efekt wyzerowania akumulatora
można uzyskać stosując instrukcję:
MOV A , #0
lecz w tym przypadku instrukcja ma dłu−
gość 2 bajtów (a CLR A tylko 1), co
w efekcie skraca długość kodu programu
i oszczędza pamięć.
bit 1 przyjmuje wartość bitu 2
itd......
bit 6 przyjmuje wartość bitu 7
a
bit 7 przyjmuje wartość bitu 0
c) znaczniki: bez zmian
d) A <− rotacja w prawo (A)
kod: 0 0000011 03h
cykle: 1 bajty: 1
Przykład: jeżeli w A jest liczba 43h
(01000011 binarnie) to po wykonaniu
instrukcji
RR A
akumulator będzie zawierał liczbę: A1h
(10100001 binarnie).
Rn gdzie Rn = R0...R7 (jeden
z rejestrów roboczych)
kod: 0 1 1 0 1 n2 n1 n0 gdzie n2...n0 –
wskazują na R0...7 stąd: 68h−6Fh
cykle: 1 bajty: 1
przykład: XRL A , R7
– XRL A , adres
zsumowana (mod 2) logicznie zostaje za−
wartość akumulatora i komórki o podanym
adresie „adres”, wynik zostaje umieszczo−
ny w A
A <− A (adres)
kod: 0 1 1 0 0 1 0 1
“CPL A”
a) ang. „complement accumulator” – zaneguj
akumulator
b) wartość akumulatora zostaje zanegowa−
na, wynik wpisany zostaje do akumulatora
c) znaczniki: bez zmian
d) A <− / A
kod: 11110100 F4h
cykle: 1 bajty: 1
Przykład: aby np. zmienić znak liczby zapi−
sanej w akumulatorze w kodzie U2 należy
wykonać sekwencję instrukcji:
CPL A
;negacja akumulatora
“RRC A”
a) ang. „rotate right through carry” – przesuń
cyklicznie w prawo ze znacznikiem C
b) zawartość akumulatora zostaje przesunięta
w prawo o 1 pozycję (o 1 bit) z uwzględnie−
niem znacznika C, to znaczy że: znacznik
C przyjmuje wartość bitu 0 (akumulatora
oczywiście)
bit 0 przyjmuje wartość bitu 1
bit 1 przyjmuje wartość bitu 2
itd......
bit 6 przyjmuje wartość bitu 7
a
bit 7 przyjmuje wartość znacznika C
c) znaczniki: C jest ustawiany zgodnie z wyni−
kiem operacji
d) A <− rotacja w prawo (A) z C
kod: 0 0010011 13h
cykle: 1 bajty: 1
Przykład: jeżeli w A jest liczba 54h
(01010100 binarnie) to wykonanie instruk−
cji:
CLR C
65h
INC A
;inkrementacja akumulatora
.....
“RL A”
a) ang. „rotate left” – przesuń w lewo
b) zawartość akumulatora zostaje przesunięta
w lewo o 1 pozycję (o 1 bit), to znaczy że:
bit 1 przyjmuje wartość bitu 0
bit 2 przyjmuje wartość bitu 1
itd......
bit 7 przyjmuje wartość bitu 6
a
bit 0 przyjmuje wartość bitu 7
c) znaczniki: bez zmian
d) A <− rotacja w lewo (A)
kod: 00100011 23h
cykle: 1 bajty: 1
Przykład: jeżeli w A jest liczba 43h (01000011
binarnie) to po wykonaniu instrukcji:
RL A
akumulator będzie zawierał liczbę: 86h
(10000110 binarnie).
cykle: 1
bajty: 2 (kod instrukcji
65h + adres)
przykład: XRL A , 19h (dodanie logiczne
A i zawartości komórki pod adresem 19h)
– XRL A , @Ri
zsumowana (mod 2) logicznie zostaje za−
wartość akumulatora komórki w
wewn. RAM o adresie wskazywanym
przez rejestr Ri. (R0 lub R1)
A <− A (Ri)
kod: 0 1 1 0 0 1 1 i gdzie i wskazuje na
R0 (i=0) lub R1 (i=1) stąd: 66h, 67h
cykle: 1 bajty: 1
przykład: XRL A , @R0 (zsumowanie (mod 2)
logiczne A i zawartości komórki o adresie
w R0)
– XRL A , #dana
zsumowana (mod 2) logicznie zostaje za−
wartość akumulatora przez argument stały
(8−bitowa liczba)
A <− A dana
kod: 0 1 1 0 0 1 0 0 64h
cykle: 1
;wyzeruje znacznik C
RLC A
;przesuń w lewo
z C akumulator
....
spowoduje podzielenie przez 2 liczby zapi−
sanej w naturalnym kodzie binarnym
w akumulatorze.
bajty: 2 (kod instrukcji
“RLC A”
a) ang. „rotate left through carry” – przesuń
cyklicznie w lewo ze znacznikiem C
b) zawartość akumulatora zostaje przesunięta
w lewo o 1 pozycję (o 1 bit) z uwzględnie−
niem znacznika C, to znaczy że: znacznik
C przyjmuje wartość bitu 7 (akumulatora
oczywiście)
bit 1 przyjmuje wartość bitu 0
bit 2 przyjmuje wartość bitu 1
itd......
bit 7 przyjmuje wartość bitu 6
a
bit 0 przyjmuje wartość znacznika C
c) znaczniki: C jest ustawiany zgodnie z wyni−
kiem operacji
d) A <− rotacja w lewo (A) z C
kod: 00110011
“SWAP A”
a) ang. „swap nibbles within accumulator” –
wymień półbajty w akumulatorze
b) w wyniku tej instrukcji wymieniona zostaje
zawartość bitów 3...0 (mniej znaczący pół−
bajt) i bitów 7...4 (bardziej znaczący półbajt)
akumulatora. Operacja ta jest równoważna
4−krotnemu przesunięciu zawartości aku−
mulatora.
c) znaczniki: bez zmian
d) A 3−0 <−> A 7−4
kod: 1 1000100 C4h
cykle: 1 bajty: 1
Przykład: sekwencja podana poniżej powo−
duje zamianę półbajtów akumulatora
MOV A , #52h ;wpisanie do akumulatora
liczby 52h
SWAP A
64h + dana)
przykład: XRL A , #23 (zsumowanie (mod
2) logiczne A i liczby 23)
– XRL adres , A
zsumowana (mod 2) logicznie zostaje za−
wartość akumulatora i komórki o
poda−
nym adresie „adres”, wynik zostaje
umieszczony w komórce pamięci o adresie
„adres”
(adres) <− (adres) A
kod: 0 1 1 0 0 0 1 1 62h
cykle: 1
bajty: 2 (kod instrukcji
62h + adres)
przykład: XRL A , 20h (zsumowanie (mod
2) logicznie A i zawartości komórki pod ad−
resem 20h)
– XRL adres , #dana
zsumowana (mod 2) logicznie zostaje za−
wartość komórki o adresie „adres” oraz ar−
gument stały (8−bitowa liczba)
(adres) <− (adres)
33h
;wykonanie polecenia
zamiany
cykle: 1 bajty: 1
Przykład: jeżeli w A jest liczba 54h
(01010100 binarnie) to wykonanie instrukcji:
CLR C
.....
;w akumulatorze
znajduje się teraz
liczba 25h
;wyzeruje znacznik C
RLC A
;przesuń w lewo z C
;akumulator
dana
kod: 0 1 1 0 0 0 1 1 63h
cykle: 2 bajty: 3 (kod instrukcji
63h + adres + dana)
przykład: XRL 12h , #99 (dodanie logiczne
zawartości komórki 12h i liczby 99)
Uff! Na razie to tyle w następnym od−
cinku dokończenie listy instrukcji, a więc
pozostałe komendy dotyczące:
− operacji przemieszczania danych
− operacji na bitach (znacznikach)
− skoki i pozostałe
oraz krótki opis asemblera ASM51 przezna−
czony szczególnie dla komputerowców.
Sławomir Surowiński
....
spowoduje wymnożenie przez 2 liczby za−
pisanej w naturalnym kodzie binarnym
w akumulatorze.
“CLR A”
a) ang. „clear accumulator” – zeruj akumulator
b) do akumulatora zostaje wpisana wartość 0.
c) znaczniki: bez zmian
“RR A”
a) ang. „rotate right” – przesuń w prawo
b) zawartość akumulatora zostaje przesunięta
w prawo o 1 pozycję (o 1 bit), to znaczy że:
bit 0 przyjmuje wartość bitu 1
E LEKTRONIKA DLA WSZYSTKICH 11/97
39
152728894.005.png
Też to potrafisz
W dzisiejszej lekcji sprawdzimy działa−
nie niektórych spośród omówionych
wcześniej instrukcji arytmetycznych i lo−
gicznych procesora na podstawie przykła−
dowego programu. Działanie programu
jest bardzo proste, otóż:
a) najpierw program prosi o wprowadze−
nie dwóch liczb 8−bitowych w postaci
heksadecymalnej,
czyli z zakresu 0...FFh (0...255 dziesięt−
nie). Pierwsza liczba wyświetlana jest
na wyświetlaczach DL1 i DL2, druga
na DL4 i DL5
b) następnie wykonywana jest wybrana
przez Ciebie operacja arytmetyczna lub
logiczna (o tym jak ją wybrać – za chwilę
c) w efekcie na wyświetlaczach DL7 i DL8
wypisywany jest wynik operacji, który mo−
żesz sprawdzić ręcznie (na papierze) lub
korzystając z kalkulatora wyposażonego
w konwerter liczb zapisanych dziesiętnie
i szesnastkowo (np. taki z MS−Windows).
Program w postaci listingu – czyli
w zapisie źródłowym z dodatkowymi in−
formacjami istotnymi szczególnie dla
tych którzy nie mają komputera jest na−
stępujący:
;Program do lekcji nr 2
;testowanie komend: ADD, SUBB, ANL, ORL, XRL, SWAP
;z wykorzystaniem instrukcji BIOS’a
;********************************
8000
org
8000h
;pocztek zewn. pamieci programu
;********************************
8000 120274
znowu:
lcall
CLS
;wyczyszczenie wyswietlacza
8003 75F001
mov
B,#1
;pozycja 1 na displeju
8006 757840
mov
DL1,#_minus
;znak “—” na pozycji wprowadzenia
8009 757940
mov
DL2,#_minus
;pierwszego skladnika
800C 1203A7
lcall
GETACC
;pobranie skladnika 1 dodawania
800F 128036
lcall
wait1
;odczekaj sekunde
8012 C0E0
push
Acc
;i przechowanie go na stosie
8014 75F004
mov
B,#4
;pozycja 4 na displeju
8017 757B40
mov
DL4,#_minus
;znak “—” na pozycji wprowadzeniaa
801A 757C40
mov
DL5,#_minus
;drugiego skladnika
801D 1203A7
lcall
GETACC
;pobranie skladnika 2 dodawania
8020 128036
lcall
wait1
;odczekaj sekunde
8023 D0F0
pop
B
;sciagniecie skladnika 1 ze stosu do rej.B
8025 C3
clr
C
;potrzebne do testowania instrukcji SUBB
8026 25F0
add
A,B
;komenda dodania skladnikow - tu wstaw inne komendy
8028 75F007
mov
B,#7
;pozycja 7 na displeju
802B 12024E
lcall
A2HEX
;wypisanie wyniku dodawania
802E 128036
lcall
wait1
;odczekaj sekunde
8031 128036
lcall
wait1
;odczekaj sekunde
8034 80CA
sjmp
znowu
;i nastepne skladniki
;********************************
8036 C0E0
wait1:
push
Acc
;przechowanie A na stosie
8038 74FF
mov
A,#255
803A 120295
lcall
DELAY
;odczekanie 0,5 sek
803D 74FF
mov
A,#255
803F 120295
lcall
DELAY
;odczekanie 0,5 sek (w sumie 1 sek.)
8042 D0E0
pop
Acc
;odtworzenie A (ze stosu)
8044 22
ret
;powrot do programu glownego
;********************************
8045
END
Szczegółowy opis listingu nie jest te−
matem niniejszej lekcji (a przyszłego
odcinka szkoły mikroprocesorowej), to−
też przedstawię tylko istotne informa−
cje potrzebne do wykonania zadania
z naszej dzisiejszej lekcji. Informacje
podzielę na te istotne dla komputerow−
ców oraz dla „ręczniaków” (o ile mogę
posłużyć się takim skrótem), tak więc,
patrzymy na listing powyżej i wyjaśnia−
my sobie:
a) w pierwszej kolumnie podany jest ad−
res początkowy danej linii programu
z zawartą w niej instrukcją. U nas adres
początkowy to 8000h – początek pa−
mięci SRAM w komputerku. Zauważ−
my że cały program zajmuje 45 bajtów,
bo ostatnim adresem jest 8045h –
ostatnia linia listingu.
b) w każdej zawierającej instrukcję lini−
i tuż za adresem znajduje się ciąg baj−
tów będący odpowiednikiem maszyno−
wym instrukcji zapisanej w dalszej
części linii w sposób jawny. Dzięki te−
mu „niekomputerowcy” będą mogli
po prostu wklepać te dane „ciurkiem”
od adresu 8000h bez mozolnego tłu−
maczenia z postaci źródłowej znajdują−
cej się w trzeciej kolumnie listingu).
Warto jednak przy tym chociaż chwilę
zastanowić się i przetłumaczyć już te−
raz (korzystając z tabeli we wkładce)
znane i nieznane instrukcje w kolej−
40
E LEKTRONIKA DLA WSZYSTKICH 11/97
Lekcja 2
152728894.001.png
Zgłoś jeśli naruszono regulamin