Lista rozkazów mikrokontrolera 8051...Mikrokontroler 8051 potrzebuje na wykonanie instrukcji...
Transcript of Lista rozkazów mikrokontrolera 8051...Mikrokontroler 8051 potrzebuje na wykonanie instrukcji...
Lista rozkazówmikrokontrolera 8051część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne
Ryszard J. Barczyński, 2018Politechnika Gdańska, Wydział FTiMS, Katedra Fizyki Ciała StałegoMateriały dydaktyczne do użytku wewnętrznego
8051 Pamięć programu8051 Pamięć programu
Po uruchomieniu procesora wykonywanie programu rozpoczyna się od adresu 0000h
Adres ma długość 16 bitów. Zatem 8051 może zaadresować 216 = 64k słów
programu. Każde słowo ma długość jednego bajtu. CPU może wykonywać instrukcje jedynie z pamięci
programu.
Programowanie 8051Programowanie 8051
Podstawowe znaczenie dla programowania mikrokontrolera 8051 mają rejestry.
8051 zawiera CPU oparte na akumulatorze
Większość operacji wykonywana jest na zawartości A i rezultat jest umieszczony w A
np Add A,#23
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
Lista rozkazówLista rozkazów
Lista rozkazów (instrukcji) to zestaw wszystkich rozkazów, które jest w stanie wykonać dany procesor..
Każdy procesor ma własną listę rozkazów.Rozkazy możemy podzielić na zasadnicze grupy:
Arytmetyczno - logicznePrzesłania danychPrzeniesienia sterowania Testowania i porównania (w zasadzie nieobecne w 8051)Wejścia - wyjścia (tylko niektóre procesory; 8051 ich nie ma) Inne
Niektóre procesory (szczególnie RISC) mają rozkazy o ujednoliconej długości, inne (w tym 8051) nie.
Kodowanie rozkazówKodowanie rozkazów
Rozkaz zawierainformację jaką operację wykonać, operandy (jeżeli są). przeznaczenie wyniku (jeżeli jest)
Część rozkazu zawierająca informację o operacji nazywa się często kodem instrukcji (rozkazu) albo opcode
Operand może byćwartością natychmiastową, adresem pamięci lub rejestrem.
Przeznaczeniem może być adres pamięci lub rejestr. Rozkaz procesora 8051 może mieć długość 1, 2 lub 3 bajtów
Kodowanie rozkazówKodowanie rozkazów
8 bitowy kod operacji daje 28=256 możliwościUżywa się 255
139 rozkazów 1 bajtowych92 rozkazy 2 bajtowe24 rozkazy 3 bajtowe
Przykład instrukcji 1 bajtowej
CLR C jest ona reprezentowana przez kod 0C3h (bitowo 11000011)
Kodowanie rozkazówKodowanie rozkazów
Inny przykład to ADDC A,R1
Instrukcja dodaje zawartość A i zawartość R1 używając wskaźnika przeniesienia i umieszcza rezultat w A
Kod maszynowy to 039h. W ogólności kodowanie ADDC wygląda tak:
0011 1
5 bitów 3 bity
Rn
Timing rozkazówTiming rozkazów
Mikrokontroler 8051 potrzebuje na wykonanie instrukcji minimum 12 cykli zegara (tak zwany cykl maszynowy).
Są instrukcje wolniejsze, wymagające 48 cykli zegara
Nie ma instrukcji potrzebujących 36 cykli zegara, ale są 2 potrzebujące 48 cykli (4 cykle maszynowe)
instrukcje MUL oraz DIV
Zauważ, że długość (liczba bajtów) rozkazu nie ma jednoznacznego przełożenia na czas trwania!
Lista rozkazów 8051 Lista rozkazów 8051
ACALL addr11 DIV AB LJMP addr16 RETIADD A,<src> DJNZ <byte>,<rel8> MOV <dest>,<src> RL AADDC A,<src> INC <byte> MOV DPTR,#data16 RLC AAJMP addr11 INC DPTR MOV bit,bit RR AANL <dest>,<src> JB bit,rel8 MOVC A,@A+<base> RRC AANL C,<bit> JBC bit,rel8 MOVX <dest>,<src> SETB bitCJNE <dest>,<src>,rel8 JC rel8 MUL AB SJMP rel8CLR A JMP @A+DPTR NOP SUBB A,<src>CLR bit JNB bit,rel8 ORL <dest>,<src> SWAP ACPL A JNC rel8 ORL C,bit XCH A,<byte>CPL bit JNZ rel8 POP direct XCHD A,@RiDA A JZ rel8 PUSH direct XRL <dest>,<src>
DEC <byte> LCALL addr16 RET
Rozkaz MOV
Rozkaz MOV
Musimy mieć możliwość przesyłania danych
Pomiędzy rejestrami
Pomiędzy pamięcią a rejestrami
W pamięci :-)
Służy do tego rozkaz MOV
Możliwe są różne tryby adresowania
Lower 128 bytes
8 bits 32 bytesused
Upper 128 bytes
00h
20h
80h
FFh
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
Rozkaz MOV Rozkaz MOV ma formę
MOV <dest>,<src>
Rezultatem jest przeniesienie bajtu z <src> do <dest>
Istnieje 15 wersji tego rozkazu
Przykład
MOV A,#12
Lower 128 bytes
8 bits 32 bytesused
Upper 128 bytes
00h
20h
80h
FFh
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
12
Rozkaz MOV i wartości
natychmiastoweW naszym przykładzie
MOV A,#12
Przeznaczeniem jest rejestr A natomiast źródłem jest wartość natychmiastowa
Wszystkie warości natychmiastowe są poprzedzane znakiem #
Źródło jest tu wartością stałą
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
12
Rozkaz MOV i adresowanie
rejestrów
Adresowanie rejestrów (implikowane)
Przykład
MOV R3,#32
MOV A,R3
Pierwsza instrukcja umieszcza 32 w rejestrze R3, a druga kopiuje zawartość R3 do rejestru A.
Można używać dowolnego z 8 rejestrów R0-R7
Operandy będące rejestrami R0-R7 będziemy oznaczać przez Rn
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
32
32
Rozkaz MOV i adresowanie bezpośrednie
Dla dostępu do RAM używa się, adresowania bezpośredniego
Przykład
MOV 20h,A
Przeznaczeniem jest adres 20h, a źródło, zawartość A, jest kopiowane do RAM
Adresowanie bezpośrednie może być używane tylko dla niższych 128 adresów.
Lower 128 bytes
8 bits 32 bytesused
Upper 128 bytes
00h
20h
80h
FFh
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
15
Zauważ różnicę pomiędzy adresowaniem natychmiastowym i
bezpośrednim!!!
Zauważ różnicę pomiędzy adresowaniem natychmiastowym i
bezpośrednim!!!
MOV A,#64h MOV A,64h
Tutaj, wartość 64h jest umieszczona w A
Tutaj, wartość spod adresu 64h jest umieszczona w A.
PC
A
B
R7R6R5R4R3R2R1R0
8-bits
16-bits
Instrukcja MOV i adresowanie
pośrednie
By uzyskać dostęp do 256 adresów RAM musimy użyć adresowania pośredniego
Przykład
MOV @R0,A
Możemy użyć @R0 lub @R1
mówiąc o adresowaniu pośrednim zwykle używamy oznaczenia @Ri, gdzie i może oznaczać 1 lub 0.
Lower 128 bytes
8 bits 32 bytesused
Upper 128 bytes
00h
20h
80h
FFh
20h
13
Podsumowanie trybów
adresowania
Podsumowanie trybów
adresowaniaWartość bezpośrednia
#data8np. MOV A,#56h
Adresowanie rejestrówRnnp. MOV R6,R3
Adresowanie bezpośredniedirectnp. MOV R6,4Eh
Adresowanie pośrednie@Rinp. MOV @R1,R6
Rozkazy MOV Rozkazy MOV
MOV A,source MOV dest,A
MOV A,#data
MOV dest,source
MOV dest,#dataGdzie dest i source może być każdym z Rn, direct lub @Ri
Rozkaz XCHRozkaz XCH
Instrukcja zamienia zawartość akumulatora z zawartością adresowaną przez operand
XCH A,source
Gdzie source może być każdym z Rn, direct lub @Ri
Rozkaz XCHDRozkaz XCHD
Instrukcja zamienia zawartość czterech najniższych bitów akumulatora z zawartością czterech najniższych bitów adresowaną przez operand
XCHD A,@Ri
Rozkaz MOV (DPTR) Rozkaz MOV (DPTR)
MOV DPTR,#data16 Ta specjalna wersja rozkazu MOV umieszcza
w rejestrze DPTR stałą 16-bitową. Rejestr DPTR służy głównie jako wskaźnik przy
dostępie do pamięci programu i zewnętrznej pamięci RAM.
Rozkaz MOVX Rozkaz MOVX
MOVX A,@DPTR MOVX @DPTR,A
Rozkaz MOVX służy do dostępu do
zewnętrznej pamięci RAM. Jednym z operandów musi być akumulator.
Rozkaz MOVX Rozkaz MOVX
MOVX A,@Ri MOVX @Ri,A
Wersja rozkazu MOVX służąca do dostępu do
zewnętrznej pamięci RAM o pojemności 256B. Przy użyciu tej instrukcji nie są
używane wyższe bity adresowe (używany jest tylko port P0).
Rozkaz MOVC Rozkaz MOVC
MOVC A,@A+DPTR MOVC A,@A+PC
Instrukcja służy do przepisywania danych z pamięci programu do akumulatora. Adres
wyliczany jest poprzez sumę akumulatora i rejestru DPTR lub PC.
Instrukcje arytmetyczneInstrukcje arytmetyczne
Instrukcje arytmetyczne umożliwiają dodawanie, odejmowanie, mnożenie i dzielenia operandów całkowitych
W większości przypadków akumulator pełni rolę zarówno jednego z operandów jak i przeznaczeniea wyniku
np. ADD A,#23
można używać wszystkich
omówionych trybów adresowania
A 23
ALU
Dodawanie: ADDDodawanie: ADD
Instrukcja umożliwia dodawanie dwóch liczb 8-bitowych. Na przykład
ADD A,#23 załóżmy, że A zawierał
początkowo liczbę 31.
(23) 00010111(31) 00011111(54) 000110110
Rezultat ma 9 bitów... Dodatkowy bit przeniesienia
carry jest umieszczany na pozycji C w słowie stanu procesora (PSW)
Gdy niezbędne są liczby ze znakiem posługojemy się kodem uzupełnień do 2.
Zakres liczb wynosi wtedy od –128 do +127
Dodajmy 43 i –68(43) 00101011
(-68) 11000001
(-25) 011100111
Używamy tej samej instrukcji dodawania
Ważne... Ważne... do do programistyprogramisty należy należy właściwa interpretacja właściwa interpretacja formatów danychformatów danych
Dodawanie: ADDDodawanie: ADD
Dodawanie: ADDDodawanie: ADD
PrzykładDodaj zawartość R1 do
A i umieść wynik w R2
ADD A,R1
MOV R2,A
Flagi przeniesienia carry (C) i przepełnienia overflow (OV) są modyfikowane przez instrukcję ADD
R1 C
R2
A
OV
0
38
15
23
0
Interpretacja bez znaku
Rezultatem dodawania 238 i 23 jest 5. Bit przeniesienia (C) został jednak ustawiony, co oznacza, że prawdidłowym wynikiem jest 256+5=261.
R1 C
R2
A
OV
1
5
238
23
0
Przykład ilustruje dodawanie bez znaku
bit OV nie ma w tym wypadku znaczenia
R1 C
R2
A
OV
0
169
98
71
1
Interpretacja ze znakiem
Resultatem dodawania –18 oraz 23 jest 5. Bit OV jest równy 0, co oznacza, że wynik mieści się w zakresie i jest prawidłowy.
R1 C
R2
A
OV
1
5
-18
23
0
Bit OV oznacza, że rezultat dodawania ze znakiem znalazł się poza zakresem.
R1 C
R2
A
OV
0
-87
98
71
1
Dodawanie: ADDDodawanie: ADD
Możliwe formaty instrukcji
ADD A,source
ADD A,#data
Gdzie source jest dowolnym z
Rn, direct lub @Ri
Podobne formaty dopuszcza większość instrukcji arytmetycznych i logicznych
Dodawanie: ADDCDodawanie: ADDC
Wariantem instrukcji dodawania jest ADDCDo wyniku dodawania jest dodawany jeszcze wskaźnik
przeniesienia CPrzykład
ADDC A,#34
Instrukcja służy do wykonywania dodawania 16, 24 lub 32 bitowego za pomocą instrukcji 8 bitowych
Dodawanie: ADDCDodawanie: ADDC
Przykład:Rejestry R1 i R0 zawierają jedną 16 bitową liczbę
całkowitą za znakiem, a R3 i R2 drugą. Dodaj te dwie liczby, umieść wynik w rejestrach R5 i R4.MOV A,R0ADD A,R2MOV R4,AMOV A,R1ADDC A,R3MOV R5,A
R1
R5 R4
R3 R2
R0
Odejmowanie: SUBBOdejmowanie: SUBB
Odejmuje od akumulatora liczbę wraz z pożyczką od najmniej znaczącego bitu (LSB)
Rolę pożyczki pełni bit C (carry) z PSWBy nie uwzględniać pożyczki trzeba ją wyzerować
Można to zrobić na przykład takCLR C
Bity OV oraz C są przez tą instrukcję odpowiednio ustawiane.
Odejmowanie: SUBBOdejmowanie: SUBB
PrzykładOdejmij zawartość R1 od R0 i umieść rezultat w R2,
czyli (R2) <- (R0) - (R1)
CLR C
MOV A,R0
SUBB A,R1
MOV R2,A
R1 C
R2
R0
A
OV
0
8
15
23
23
0
Mnożenie: MULMnożenie: MUL
Instrukcja mnożenia mnoży dwie ośmiobitowe liczby bez znaku - zawartość rejestrów A i B.
Mniej znacząca część wyniku pozostaje w A, bardziej znacząca trafia do B. Bit C jest ustawiany gdy wynik nie mieści się w 8 bitach. Bit OV jest zerowany.
MUL AB
(B)(A) <- (A)*(B)
Dzielenie: DIVDzielenie: DIV
Instrukcja dzieli dwie ośmiobitowe liczby bez znaku - zawartość A przez zawartość B.
Wyniku pozostaje w A, reszta z dzielenia trafia do B. Bit C jest zawsze zerowany. Bit OV sygnalizuje dzielenie przez zero.
DIV AB
(A) <- (A) DIV (B)
(B) <- (A) MOD (B)
Wyrównanie dziesiętne: DA
Wyrównanie dziesiętne: DA
Dziwna instrukcja :-) poprawiająca wynik w akumulatorze gdy poprzednio dodawane liczby były zapisane w kodzie BCD. Wynik będzie również zapisany w kodzie BCD.
Wbrew temu, co się powszechnie sądzi instrukcja ta nie zamienia zawartości akumulatora na kod BCD...
DA A
Zmniejsz: DECZmniejsz: DEC
Instrukcja zmniejsza o 1 bajt adresowany przez operand.
Flagi nie są modyfikowane.
Gdy operandem jest port, argument pobierany jest z zatrzasków, a nie z linii wejsciowych.
DEC byte
Zwiększ: INCZwiększ: INC
Instrukcja zwiększa o 1 bajt adresowany przez operand lub zawartość DPTR.
Flagi nie są modyfikowane.
Gdy operandem jest port, argument pobierany jest z zatrzasków, a nie z linii wejsciowych.
INC byte
INC DPTR
Obroty: RRObroty: RR
Instrukcja przesuwa akumulator w prawo, najmniej znaczący bit trafia do najbardziej znaczącego bitu akumulatora
Flagi nie są modyfikowane.
RR A
(A6..A0) <- (A7..A1)
(A7) <- (A0)
Obroty: RRCObroty: RRC
Instrukcja przesuwa akumulator w prawo, najmniej znaczący bit trafia do bitu C, a zawartość bitu C do najbardziej znaczącego bitu akumulatora
Flagi nie są modyfikowane.
RRC A
(A6..A0) <- (A7..A1)
(A7) <- (C)
(C) <- (A0)
Obroty: RLObroty: RL
Instrukcja przesuwa akumulator w lewo, najbardziej znaczący bit trafia do najmniej znaczącego bitu akumulatora
Flagi nie są modyfikowane.
RL A
(A7..A1) <- (A6..A0)
(A0) <- (A7)
Obroty: RLCObroty: RLC
Instrukcja przesuwa akumulator w lewo, najbardziej znaczący bit trafia do bitu C, a zawartość bitu C do najmniej znaczącego bitu akumulatora
Flagi nie są modyfikowane.
RLC A
(A7..A1) <- (A6..A0)
(A0) <- (C)
(C) <- (A7)
Zamień nibble: SWAPZamień nibble: SWAP
Instrukcja zamienia cztery najmniej i cztery najbardziej znaczące bity akumulatora
Flagi nie są modyfikowane.
SWAP A
(A3..A0) <- (A7..A4)
(A7..A4) <- (A3..A0)
Instrukcje arytmetycznepodsumowanie
Instrukcje arytmetycznepodsumowanie
W większości instrukcji arytmetycznych akumulator jest zarówno operandem, jak i rejestrem przeznaczenia.
Flagi w PSW są modyfikowane przez niektóre instrukcjeBit przeniesienia (C)Bit przepełnienia (OV)
Ma znaczenie tylko przy działaniach na liczbach ze znakiem i dzieleniu
By prawidłowo interpretować wyniki musimy określić format danychBez znakuZe znakiem (kod uzupełnień do 2)Inne (na przykład BCD)
Iloczyn logiczny: ANLIloczyn logiczny: ANL
Instrukcja wykonuje bit po bicie iloczyn logiczny na całej długości bajtu.
Flagi nie są modyfikowane.
Gdy operandem jest port używana jest wartość z zatrzasku, a nie linii wejściowych.
ANL A,#data
ANL A,byte
ANL direct,A
ANL direct,#data
Suma logiczna: ORLSuma logiczna: ORL
Instrukcja wykonuje bit po bicie sumę logiczną na całej długości bajtu.
Flagi nie są modyfikowane.
Gdy operandem jest port używana jest wartość z zatrzasku, a nie linii wejściowych.
ORL A,#data
ORL A,byte
ORL direct,A
ORL direct,#data
Dysjunkcja logiczna: XRLDysjunkcja logiczna: XRL
Instrukcja wykonuje bit po bicie iloczyn wykluczający (dysjunkcję) na całej długości bajtu.
Flagi nie są modyfikowane.
Gdy operandem jest port używana jest wartość z zatrzasku, a nie linii wejściowych.
XRL A,#data
XRL A,byte
XRL direct,A
XRL direct,#data
Zerowanie: CLRZerowanie: CLRInstrukcja zeruje wszystkie bity akumulatora.
Flagi nie są modyfikowane.
CLR A
Negacja: CPLNegacja: CPLInstrukcja zaneguje wszystkie bity akumulatora.
Flagi nie są modyfikowane.
CPL A