Lista rozkazów mikrokontrolera 8051 część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne Ryszard J. Barczyński, 2016 Politechnika Gdańska, Wydział FTiMS, Katedra Fizyki Ciała Stałego Materiały dydaktyczne do użytku wewnętrznego
8051 Pamięć programu Po uruchomieniu procesora wykonywanie programu rozpoczyna się od adresu 0000h Adres ma długość 16 bitów. Zatem 8051 może zaadresować 2 16 = 64k słów programu. Każde słowo ma długość jednego bajtu. CPU może wykonywać instrukcje jedynie z pamięci programu.
Programowanie 8051 A B R7 R6 R5 R4 R3 R2 R1 R0 PC 8-bits 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 16-bits
Lista 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 logiczne Przesłania danych Przeniesienia 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ów Rozkaz zawiera informację 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ów 8 bitowy kod operacji daje 2 8 =256 możliwości Używa się 255 139 rozkazów 1 bajtowych 92 rozkazy 2 bajtowe 24 rozkazy 3 bajtowe Przykład instrukcji 1 bajtowej CLR C jest ona reprezentowana przez kod 0C3h (bitowo 11000011)
Kodowanie 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: 5 bitów 3 bity 0011 1 Rn
Timing 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 ACALL addr11 DIV AB LJMP addr16 RETI ADD A,<src> DJNZ <byte>,<rel8> MOV <dest>,<src> RL A ADDC A,<src> INC <byte> MOV DPTR,#data16 RLC A AJMP addr11 INC DPTR MOV bit,bit RR A ANL <dest>,<src> JB bit,rel8 MOVC A,@A+<base> RRC A ANL C,<bit> JBC bit,rel8 MOVX <dest>,<src> SETB bit CJNE <dest>,<src>,rel8 JC rel8 MUL AB SJMP rel8 CLR A JMP @A+DPTR NOP SUBB A,<src> CLR bit JNB bit,rel8 ORL <dest>,<src> SWAP A CPL A JNC rel8 ORL C,bit XCH A,<byte> CPL bit JNZ rel8 POP direct XCHD A,@Ri DA A JZ rel8 PUSH direct XRL <dest>,<src> DEC <byte> LCALL addr16 RET
Rozkaz MOV Musimy mieć możliwość przesyłania danych Pomiędzy rejestrami FFh 8-bits Pomiędzy pamięcią a rejestrami W pamięci : ) 80h 20h Upper 128 bytes Lower 128 bytes A B R7 R6 R5 R4 R3 R2 R1 R0 Służy do tego rozkaz MOV Możliwe są różne tryby adresowania 00h 8 bits 32 bytes used PC 16-bits
FFh Rozkaz MOV 8-bits A 12 Upper 128 bytes B 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 80h 20h Lower 128 bytes R7 R6 R5 R4 R3 R2 R1 R0 00h 8 bits 32 bytes used PC 16-bits
Rozkaz MOV i wartości W naszym przykładzie natychmiastowe MOV A,#12 Przeznaczeniem jest rejestr A natomiast źródłem jest A B R7 R6 R5 R4 R3 R2 R1 R0 8-bits 12 wartość natychmiastowa Wszystkie warości natychmiastowe są poprzedzane znakiem # Źródło jest tu wartością stałą PC 16-bits
Rozkaz MOV i adresowanie rejestrów Adresowanie rejestrów (implikowane) Przykład MOV R3,#32 A B R7 R6 R5 R4 R3 R2 R1 R0 PC 8-bits 32 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 16-bits
FFh 80h 20h 00h Rozkaz MOV i adresowanie bezpośrednie Upper 128 bytes Lower 128 bytes 8 bits 32 bytes used A B R7 R6 R5 R4 R3 R2 R1 R0 PC 8-bits 15 16-bits 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.
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.
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 FFh A 8-bits 13 Możemy użyć @R0 lub @R1 80h 20h Upper 128 bytes Lower 128 bytes B R7 R6 R5 R4 R3 R2 R1 R0 20h mówiąc o adresowaniu pośrednim zwykle używamy oznaczenia @Ri, gdzie i może oznaczać 1 lub 0. 00h PC 8 bits 32 bytes used 16-bits
Wartość bezpośrednia #data8 np. MOV A,#56h Adresowanie rejestrów Rn np. MOV R6,R3 Adresowanie bezpośrednie direct np. MOV R6,4Eh Adresowanie pośrednie @Ri np. MOV @R1,R6 Podsumowanie trybów adresowania
Rozkazy MOV MOV A,source MOV dest,a MOV A,#data MOV dest,source MOV dest,#data Gdzie dest i source może być każdym z Rn, direct lub @Ri
Rozkaz 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 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) 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 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 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 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 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 A 23 można używać wszystkich ALU omówionych trybów adresowania
Dodawanie: 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)
Dodawanie: ADD 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... do programisty należy właściwa interpretacja formatów danych
Dodawanie: ADD Przykład Dodaj zawartość R1 do A i umieść wynik w R2 Flagi przeniesienia carry (C) i przepełnienia overflow (OV) są modyfikowane przez instrukcję ADD ADD A,R1 MOV R2,A R1 R2 15 38 0 0 C OV A 23
Interpretacja bez znaku Przykład ilustruje dodawanie bez znaku bit OV nie ma w tym wypadku znaczenia Rezultatem dodawania 238 i 23 jest 5. Bit przeniesienia (C) został jednak ustawiony, co oznacza, że prawdidłowym wynikiem jest 256+5=261. R1 98 0 C R1 238 1 C R2 169 1 OV R2 5 0 OV A 71 A 23
Interpretacja ze znakiem Bit OV oznacza, że rezultat dodawania ze znakiem znalazł się poza zakresem. 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 98 0 C R1 18 1 C R2 87 1 OV R2 5 0 OV A 71 A 23
Dodawanie: 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: ADDC Wariantem instrukcji dodawania jest ADDC Do wyniku dodawania jest dodawany jeszcze wskaźnik przeniesienia C Przykład ADDC A,#34 Instrukcja służy do wykonywania dodawania 16, 24 lub 32 bitowego za pomocą instrukcji 8 bitowych
Dodawanie: 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,R0 ADD A,R2 MOV R4,A R1 MOV A,R1 R3 ADDC A,R3 R5 MOV R5,A R0 R2 R4
Odejmowanie: SUBB Odejmuje od akumulatora liczbę wraz z pożyczką od najmniej znaczącego bitu (LSB) Rolę pożyczki pełni bit C (carry) z PSW By nie uwzględniać pożyczki trzeba ją wyzerować Można to zrobić na przykład tak CLR C Bity OV oraz C są przez tą instrukcję odpowiednio ustawiane.
Odejmowanie: SUBB Przykład Odejmij zawartość R1 od R0 i umieść rezultat w R2, czyli (R2) < (R0) (R1) CLR C MOV A,R0 SUBB A,R1 R0 R1 R2 23 15 8 0 0 C OV MOV R2,A A 23
Mnoż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: 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 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: 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: 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: 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: 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: 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: 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: 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 arytmetyczne podsumowanie W większości instrukcji arytmetycznych akumulator jest zarówno operandem, jak i rejestrem przeznaczenia. Flagi w PSW są modyfikowane przez niektóre instrukcje Bit 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 danych Bez znaku Ze znakiem (kod uzupełnień do 2) Inne (na przykład BCD)
Iloczyn 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: 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: 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: CLR Instrukcja zeruje wszystkie bity akumulatora. Flagi nie są modyfikowane. CLR A
Negacja: CPL Instrukcja zaneguje wszystkie bity akumulatora. Flagi nie są modyfikowane. CPL A