IV PROGRAMOWANIE MIKROKOMPUTERA Technika Cyfrowa 2. Wykład 4: Programowanie mikrokomputera 8051

Podobne dokumenty
Programowanie mikrokontrolerów (CISC)

Lista rozkazów mikrokontrolera 8051 część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne

Programowanie mikrokontrolera 8051

Lista rozkazów mikrokontrolera 8051

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

architektura komputerów w 1 1

Asembler - język maszynowy procesora

TMiK Podstawy Techniki Mikroprocesorowej. Lidia Łukasiak

Obszar rejestrów specjalnych. Laboratorium Podstaw Techniki Mikroprocesorowej Instytut Mikroelektroniki i Optoelektroniki PW

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

START: ; start programu od adresu 0100H ; zerowanie komórek od 01H do 07FH ( 1 dec dec)

Technika mikroprocesorowa I Wykład 2

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

LABORATORIUM nr 1. Temat: Wstęp do mikrokontrolerów rodziny MCS-51

Pracownia elektryczno-elektroniczna klasa IV

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Architektura komputerów. Asembler procesorów rodziny x86

Architektura komputerów

Struktura programu w asemblerze mikrokontrolera 8051

architektura komputerów w 1 1

CPU architektura i rejestry

Liczniki, rejestry lab. 09 Mikrokontrolery 8051 cz. 1

Liczniki, rejestry lab. 08 Mikrokontrolery WSTĘP

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

6.1. Zastosowanie mikrokontrolera SAB 80C535 do sterowania silnikiem prądu stałego

Ćwiczenie 1. (sd 2) 0x0000 0x0003 0x000B 0x0013 0x001B 0x0023

MIKROPROCESORY I MIKROKONTROLERY INSTRUKCJE / KOMENDY / ROZKAZY: PRZEGLĄD I KILKA PRZYKŁADÓW DLA PRZYPOMNIENIA, GŁÓWNE REJESTRY ROBOCZE CPU:

Programowanie niskopoziomowe

Struktura i działanie jednostki centralnej

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Celem ćwiczenia jest zapoznanie z obsługą klawiatury sekwencyjnej i matrycowej w systemie DSM-51.

ZAPOZNANIE SIĘ Z ZESTAWEM DYDAKTYCZNYM ZD537, OPROGRAMOWANIEM µvision 2 ORAZ OPERACJE NA PAMIĘCIACH

Politechnika Warszawska

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

CYKL ROZKAZOWY = 1 lub 2(4) cykle maszynowe

Architektura typu Single-Cycle

organizacja procesora 8086

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Organizacja typowego mikroprocesora

Mikrokontroler ATmega32. Język symboliczny

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Opis mikrokontrolera 8051 Lista rozkazowa Timery

MIKROPROCESORY architektura i programowanie

DSM51 operacje przesylania danych i operacje arytmetyczne strona 1

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Mikrokontrolery w systemach pomiarowo sterujących

Ćwiczenie 3. Konwersja liczb binarnych

Wstępdo assemblera MA51

Sprzęt i architektura komputerów

1. Operacje logiczne A B A OR B

LISTA ROZKAZÓW i TRYBY ADRESOWANIA

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

Programowanie w językach asemblera i C

Podstawy techniki cyfrowej Mikroprocesory. Mgr inż. Bogdan Pietrzak ZSR CKP Świdwin

Dyrektywy asemblerowe

1. Dyrektywy asemblerowe

Mikrokontrolery. Wrocław 2003

Architektura Systemów Komputerowych. Jednostka ALU Przestrzeń adresowa Tryby adresowania

Lista instrukcji mikroprocesora Programowanie w assemblerze

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Instytut Teleinformatyki

Arytmetyka stałopozycyjna

Instytut Teleinformatyki

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Ćwiczenie 30. Techniki mikroprocesorowe Programowanie w języku Asembler mikrokontrolerów rodziny '51

Laboratorium 1: Wprowadzenie do środowiska programowego. oraz podstawowe operacje na rejestrach i komórkach pamięci

Architektura systemów komputerowych Laboratorium 8 Symulator SMS32 Instrukcje skoku i pętle

MIKROKONTROLERY I MIKROPROCESORY

Wstęp do assemblera MA51

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Instytut Teleinformatyki

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Programowanie Niskopoziomowe

Sprzęt i architektura komputerów

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Rozszerzalne kody operacji (przykład)

Jerzy Nawrocki, Wprowadzenie do informatyki

Lista Rozkazów: Język komputera

Systemy wbudowane. Wprowadzenie. Wprowadzenie. Mikrokontroler 8051 Budowa

Architektura Systemów Komputerowych

2 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.02 Rok akad. 2011/ / 24

Programowanie komputera

Podstawy programowania w języku C

Arytmetyka binarna - wykład 6

Przerwania w architekturze mikrokontrolera X51

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

Dariusz Kozak ZESTAW URUCHOMIENIOWY MIKROKOMPUTERÓW JEDNOUKŁADOWYCH MCS-51 ZUX51. Asembler ASMX51 INSTRUKCJA OBSŁUGI

Algorytm mnożenia sekwencyjnego (wariant 1)

Wstęp. do języka C na procesor (kompilator RC51)

Instytut Teleinformatyki

2. Architektura mikrokontrolerów PIC16F8x... 13

Kompilator języka C na procesor 8051 RC51 implementacja

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Programowanie Niskopoziomowe

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Podstawy Informatyki

Transkrypt:

Technika Cyfrowa 2 Wykład 4: Programowanie mikrokomputera 81 dr inż. Jarosław Sugier Jaroslaw.Sugier@pwr.wroc.pl IIAR, pok. 227 C-3 4-1 IV PROGRAMOWANIE MIKROKOMPUTERA 81 1 REJESTRY Oprócz DPTR wszystkie omawiane są jednobajtowe. Notacja: Rej.n = n-ty bit rejestru Rej Zestaw 8 rejestrów użytkowych R0 R7. Umieszczone w IRAM w jednym z czterech obszarów w zakresie adresów 00 1F, numer aktualnego obszaru jest pamiętany w słowie statusu PSW. R0 oraz R1 (ozn. Ri) = tzw. rejestry adresowe przy dostępie do komórek w IRAM / XRAM. Wszystkie pozostałe rejestry pamiętane są w obszarze SFR (adres 80... FF) Akumulator (symbol A lub ACC; adres SFR: E0) rejestr wyróżniony w operacjach ALU oraz w komunikacji z XRAM. Symbol A = rejestr akumulator (adresowanie rejestrowe) Symbol ACC = rejestr SFR o adresie E0 (adresowanie bezpośrednie) Rejestr B (adres SFR: F0) wyróżniony w operacjach mnożenia i dzielenia, poza nimi może być ogólnego przeznaczenia. 4-2 1 REJESTRY c.d. PSW (Program Status Word; adres SFR: D0) słowo stanu programu. Zawartość: CY AC F0 RS1 RS0 OV F1 P numer aktywnego zestawu rejestrów użytkowych R0 R7: PSW.4, PSW.3 = RS1, RS0 (Register Bank Switch) 00, 01, 10 lub 11; przy RESET wpisywane 00. flagi ustawiane przez ALU: PSW.0 = P (parity) parzysta liczba jedynek w ACC, PSW.2 = OV (overflow) przepełnienie, przekroczenie zakresu liczb w kodzie uzupełnienia do 2 (U2), PSW.6 = AC (auxiliary carry) przeniesienie z młodszej do starszej tetrady (istotne w rozkazach arytmetycznych BCD), PSW.7 = CY (carry) przeniesienie z najstarszego bitu (oznacza np. przekroczenie zakresu przy sumowaniu w NKB), flagi dostępne do wykorzystania własnego: PSW.5 = F0 PSW.1 = F1 począwszy od 82 4-3 1 REJESTRY c.d. Wskaźnik stosu (Stack Pointer; adres SFR: 81h) wskazuje szczyt obszaru zwanego stosem. Przy RESET = 7 obszar stosu rozpoczyna się za bankiem 0 rejestrów! Wskaźnik danych DPTR (Data Pointer) zawiera adres przy dostępie do XRAM; wyjątkowo 2 bajty (DPH DPL), adres SFR: 83 82. Inne rejestry związane z obsługą urządzeń WE/WY, np. P0 / P1 / P2 / P3 ( SFR: 80 / 90 / A0 / B0) i szereg innych... Uwagi: 1. Wszystkie rejestry (od R0 do DPTR) są tak naprawdę komórkami IRAM (obszaru użytkowego albo SFR) specyfika mikrokontrolerów. 2. Na liście nie ma 2B rejestru PC (PCH PCL) tylko dlatego, że nie jest dostępny programowo. 4-4 2 TRYBY ADRESOWANIA I KODOWANIE ROZKAZÓW Tryb adresowania = sposób wskazania argumentu w rozkazie procesora. Kodowanie rozkazu: na 1 do 3B; bajt pierwszy zawsze zawiera kod operacji (opcode), po nim następuje 0 do 2 bajtów identyfikujących argument(-y) w zależności od trybu(-ów) adresowania. Przykłady na rozkazie przesłania MOV: MOV dst, src ;= prześlij dane z src do dst (dst src) 2.1 Adresowanie rejestrowe (registered addressing) Argument operacji znajduje się w rejestrze (nie jest potrzebny jego adres): MOV A, R7 prześlij do akumulatora bajt z rejestru R7 Szczegóły kodowania rozkazu MOV A, Rr: Kod: EF 1 1 1 0 1 r2 r1 r0 gdzie r 2 r 1 r 0 jest numerem rejestru Rr. 4-5 2.2 Adresowanie natychmiastowe (immediate addressing) Argumentem operacji jest stała, której wartość podaje się za kodem rozkazu: MOV A, #5Ah prześlij do akumulatora bajt 5A Kod: 74 Stała: 5A Uwagi: 1. znak # oznacza w asemblerze 81 daną natychmiastową! 2. w rozkazie MOV DPTR, #1A2B dana natychmiastowa musi być 2B, kodowanie zajmuje 3B: kod (90) DPH (1A) DPL (2B); 3. ściślej: w rozkazie MOV A, #5Ah występują dwa tryby adresowania: rejestrowe (dst) i natychmiastowe (src). 4-6

2.3 Adresowanie bezpośrednie (direct addressing) Argument znajduje się w komórce pamięci, której adres podany jest za kodem rozkazu: MOV A, 5Ah pamięci wewn. o adresie 5A Kod: E5 Adres: 5A Uwaga: Stała bez żadnych dodatkowych oznaczeń w asemblerze 81 reprezentuje adres w adresowaniu bezpośrednim, a nie daną natychmiastową! 4-7 2.4 Adresowanie pośrednie (indirect addressing) Argument znajduje się w komórce pamięci, której adres znajduje się w rejestrze. Np. a) adresowanie pośrednie IRAM (adres 8b w rejestrze R0 lub R1): MOV A, @R0 pamięci wewn. o adresie odczytanym z R0 b) adresowanie pośrednie XRAM: adres 16b w rej. DPTR lub w P2 (starszy bajt) + w R0 / R1 (młodszy bajt): MOVX A, @DPTR pamięci zewn. o adresie odczytanym z DPTR Kod: E6 Kod: E0 Uwaga: Symbol @ przed nazwą rejestru oznacza w asemblerze 81 adresowanie pośrednie! 4-8 2.5 Adresowanie względne (relative addressing) W rozkazach tzw. skoków względnych: adres docelowy skoku jest sumą bieżącej pozycji PC oraz przesunięcia (offset) podanego jak dana natychmiastowa (za kodem rozkazu), np.: 2.6 Adresowania indeksowe (indexed addressing) Ważny tryb (rodzina trybów) adresowania, w których adres argumentu jest sumą zawartości rejestru (tzw. rejestru indeksowego) oraz adresu podanego jako dana natychmiastowa. SJMP 1Ah - przejdź do rozkazu o 26 bajtów dalej Kod: 80 Offset: 1A Typowym przykładem byłby: MOV A, @R0 + 10h; - nie ma na liście rozkazów 81! Uwaga: Offset kodowany jest jako 1B liczba ze znakiem w kodzie U2 możliwy zakres skoku 128...+127B od adresu następnego rozkazu. Wariant w rozkazie dostępu do pamięci kodu: MOVC A, @A + DPTR pamięci kodu o adresie wyznaczonym jako suma A i DPTR Kod: 93 4-9 4-10 2.7 Adresowanie bitów (bit addressing) Konkretne realizacje specyficzne dla różnych procesorów; dla 81: MOV C, 0Fh - skopiuj bit o numerze 0F do flagi CY Kod: A2 NrBitu: 0F 81 Łącznie 256 flag bitowych identyfikowanych numerem: 00 7F w IRAM (pam. użytkowa) w szesnastu bajtach o adresach 20 2F; 80 FF w obszarze SFR w bajtach, których adres podzielny jest przez 8. Np.: 00 najmłodszy bit w bajcie o adresie 20, najmłodszy bit w bajcie o adresie 21, 7E przedostatni najstarszy bit w bajcie o adresie 2F, 80 najmłodszy bit w bajcie o adresie 80 (pierwszy w obszarze SFR port P0), 88 najmłodszy bit w bajcie o adresie 88 (rej. sterujący ukł. przerwań i liczników), E7 najstarszy bit w bajcie o adresie E0 (akumulator), itd. 4-11 2.8 Uwagi Inne tryby adresowania Specyficzne dla konkretnego procesora. Niektóre klasyfikacje wyróżniają np.: adresowanie niejawne stos poprzez rejestr w rozkazach wywołań podprogramów, adresowanie strony zerowej związanie na stałe podprogramów obsługi przerwań z adresami na pierwszej stronie, etc. Łączenie różnych trybów Kiedy w rozkazie występują jednocześnie dwa tryby adresowania (np. w MOV dla src i dst) odpowiednio dłuższe jest kodowanie, np. MOV 5Ch, #30h - dst adresowane bezpośrednio, src natychmiastowo. Kodowanie 3 bajty: Kod: 75 Adres: 5C Dana: 30 4-12

3 LISTA ROZKAZÓW KONTROLERA 81 Odwołania do rejestrów Symbole A, ACC, B, Rn implikują odpowiednie tryby adresowania: A = adresowanie rejestrowe rejestr akumulatora ACC = adresowanie bezpośrednie rejestr SFR E0h B = adresowanie bezpośrednie rejestr SFR F0h Rn = adresowanie rejestrowe Zatem: MOV A,#0 ; rozkaz 2B MOV ACC,#0 ; rozkaz 3B, dłuższe wykonanie MOV B,#0 MOV F0,#0 ; rozkaz 3B j.w. itd. 4-13 Notacja Operatory języka C + symbole: Ri R0 lub R1 (rejestry adresowania pośredniego) Rn R0 R7 dana8 wartość 8-bitowa dana16 wartość 16-bitowa adr8 adres 8b wewnętrznej pamięci danych adr11 adres 11b na bieżącej stronie w pamięci programu adr16 adres 16b w pamięci programu (x) zawartość komórki pamięci adresowanej przez x, np. (adr) = zawartość komórki pamięci o adresie adr, (R1) = zawartość komórki pamięci o adresie w R1, itd. x.n bit o numerze n w rejestrze / komórce pamięci x bit 8b nr bitu 0..255 (wg zasad adresowania bitów j.w.) rel 8b offset (liczba ze znakiem w kodzie U2, 128 +127) 4-14 3.1 Rozkazy przesłań 3.1.1 Przesłania jednobajtowe MOV dst,src; move dst src dst: A, Rn, adr8, @Ri src: A, Rn, adr8, @Ri, #dana8 Ale: nie wszystkie kombinacje trybów src i dst są dopuszczalne; oprócz oczywistego MOV A,A zabronione są: MOV Rn,Rn ; np. MOV R0,R1; choć możliwe jest MOV adr8 1,adr8 2 MOV Rn,@Ri ; np. MOV R7,@R0 MOV @Ri,Rn ; np. MOV @R0,R7 MOV @Ri,@Ri ; np. MOV @R0,@R1 3.1.2 Przesłania dwubajtowe W 81 tylko jedno: MOV DPTR,#dana16 4-15 3.1 Rozkazy przesłań c.d. 3.1.3 Dostęp do pamięci kodu Tylko odczyt do akumulatora: MOVC A,@A + DPTR MOVC A,@A + PC Adresowanie src typu indeksowego: 16b adres bazowy (PC lub DPTR) oraz 8b offset z akumulatora (liczba NKB, bez znaku). 3.1.4 Dostęp do XRAM Zawsze do lub z akumulatora: MOVX A,@DPTR MOVX A,@Ri MOVX @DPTR,A MOVX @Ri,A Jeśli adresowanie pośrednie (poprzez R0 lub R1): ponieważ port P2 pełni rolę starszego bajtu magistrali adresowej jego aktualna zawartość dopełnia Ri jako starsze 8b adresu. 4-16 3.1 Rozkazy przesłań c.d. 3.1.5 Wymiany danych (przesłania dwukierunkowe) XCH = exchange: XCH A,{ Rn adr8 @Ri } XCHD = wymiana półbajtu młodszej tetrady (bitów 3..0): XCHD A,@Ri ; A.3..0 (Ri).3..0 SWAP = wymiana półbajtów w akumulatorze: SWAP A ; A.7..4 A.3..0 3.1.6 Obsługa stosu Wysłanie bajtu na stos: PUSH adr8 ; (++) = (adr8) Odczytanie ( zdjęcie ) bajtu ze stosu: POP adr8 ; (adr8) = ( ) 4-17 Obsługa stosu uwagi: 1) Argument src tylko adresowanie bezpośrednie (nie ma rejestrowego!) 2) Argument dst adresowanie pośrednie rejestrem w 82 i następcach stos może być umieszczony w obszarze IRAM powyżej adresu 7Fh 3) Symbole A, ACC, Rn, B a tryby adresowania: A = adresowanie rejestrowe rejestr akumulatora ACC = adresowanie bezpośrednie adres SFR E0h Rn = adresowanie rejestrowe B = adresowanie bezpośrednie adres SFR F0h Zatem: Poprawne: Niepoprawne: PUSH ACC PUSH A PUSH 01 PUSH R1 PUSH B 5) Obsługa podprogramów niejawnie korzysta ze stosu, gdzie przechowuje dwubajtowy adres powrotu elementy stosu w 81 są jedno- i dwubajtowe! 4-18

Obsługa stosu przykład pracy: 77 Stan początkowy 77 Po instr. PUSH 01 33 77 Po instr. PUSH 03 77 33 77 Po instr. PUSH 33 77 03 77 Po instr. POP 03 rozkazów przesłań Rozkazy wykonywane w dwóch cyklach maszynowych: MOV dst,src w których nie uczestniczy akumulator (wyjątki: MOV Rn,#data oraz MOV @Ri,#data) MOV DPTR,#data16 PUSH / POP MOVX / MOVC 3.2 Operacje arytmetyczne 3.2.1 Dodawanie / odejmowanie ADD A, {Rn adr8 @Ri #dana8} ADDC: dodawanie z przeniesieniem (add with carry, w sumowaniu dodawana jest także wartość flagi C). Argumenty jak dla ADD. SUBB: odejmowanie z pożyczką (substract with borrow, od akumulatora odejmowany jest Arg2 oraz flaga C ). Argumenty jak dla ADD. Nie ma rozkazu odejmowania bez pożyczki! (konieczne CLR C) Ustawiane flagi: C przeniesienie z najstarszego bitu, OV przepełnienie dla interpretacji sumowania w kodzie U2, AC przeniesienie tzw. połówkowe z młodszej do starszej tetrady (z 3 do 4 bitu). Wszystkie pozostałe w jednym. 4-19 4-20 3.2.2 Inkrementacje / dekrementacje (++ / --) INC {A Rn adr8 @Ri DPTR} DEC {A Rn adr8 @Ri} Uwagi: INC/DEC NIE ustawiają żadnej flagi! INC/DEC mogą operować na komórkach IRAM i Rn (jako jedyne nie są przywiązane do akumulatora) INC DPTR = jedyna operacja arytmetyczna na argumencie 16b 3.2.3 Mnożenie i dzielenie Mnożenie rejestrów A i B: 16b wynik wpisywany do B (starszy bajt) i A (młodszy): MUL AB ; BA = A * B (gdzie BA rejestr 16b ) ; C = 0 ; if( B!= 0 ) OV = 1 Dzielenie całkowitoliczbowe rejestru A przez B: iloraz w A, reszta z dzielenia w B: DIV AB ; if( B = = 0 ) OV = 1 ; A =A/B, B =A %B 4-21 3.2.4 Korekcja dziesiętna akumulatora Rozkaz używany jeśli akumulator przechowuje wynik operacji wykonanej w tzw. spakowanym kodzie BCD (dwie cyfry dziesiętne w dwóch tetradach akumulatora): DA A ; if( A.3..0 > 9 AC = = 1 ) A.3..0 += 6 ; if( A.7..4 > 9 C = = 1 ) A.7..4 += 6 Informacje o arytmetyce binarnej, kodowaniu i korekcji BCD następny wykład. operacji arytmetycznych Wszystkie są wykonywane w 1 cyklu maszynowym za wyjątkiem: INC DPTR 2 cykle MUL / DIV 4 cykle 4-22 3.3 Operacje logiczne Są wykonywane niezależnie na poszczególnych bitach argumentów (-u). 3.3 Operacje logiczne c.d. Rotacje; także dotyczą tylko akumulatora: rotuj akumulator w lewo RL A: A.7 A.6... A.1 A.0 Podstawowe operatory dwuargumentowe: iloczyn (ANL), suma (ORL), suma mod 2 (EX-OR, XRL). Dopuszczalne warianty adresowania: ANL A,{Rn adr8 @Ri #dana8} ANL adr,{a #dana8} Identycznie: ORL i XRL. Specyficzne dla akumulatora CLR A ; A = 0 CPL A ; A = ~A 4-23 rotuj w lewo przez flagę C RLC A: C A.7 A.6... A.1 A.0 Analogicznie: rotacje w prawo RR A oraz RRC A. Rozkazy wykonywane w 2 cyklach maszynowych: ANL ORL XRL adr8, #dana8 Wszystkie pozostałe w jednym. Mimo wolniejszej pracy możliwość bezpośredniego kasowania / ustawiania / negowania bitów w dowolnej komórce IRAM jest bardzo przydatna. 4-24

3.4 Operacje bitowe Operacje wykonywane na słowach 1b; w roli akumulatora flaga C rejestru PSW. iloczyn / suma logiczna flagi C oraz argumentu: ANL C, bit ; C = C & bit ANL C, /bit ; C = C & ~bit ORL C, bit ; C = C bit ORL C, /bit ; C = C ~bit zerowanie (clear) bitu lub flagi C: CLR bit CLR C ustawianie (set) bitu lub flagi C: SETB bit SETB C 3.4 Operacje bitowe c.d. negowanie (complement) bitu lub flagi C: CPL bit CPL C kopiowanie bitu z / do flagi C: MOV C, bit MOV bit, C Wszystkie instrukcje tej grupy są wykonywane w 1 cyklu maszynowym za wyjątkiem: ANL C, ORL C, dwa cykle maszynowe. 4-25 4-26 3.5 Skoki 3.5.1 Skoki bezwarunkowe Skoki z tzw. adresem bezwzględnym: LJMP adr_16 ; PC = adr_16 AJMP adr_11 ; PC.10..0 = adr_11, PC.15..11 bez zmian JMP @A+DPTR ; PC = A + DPTR (skok z adresem dynamicznym!) Kodowanie rozkazu AJMP adr_11: a 10 a 9 a 8 0 0 0 0 1 a 7 a 6... a 0 Automatyczny wybór rodzaju skoku: użycie mnemonika JMP etykieta asembler sam dobiera instrukcję (AJMP / LJMP). Skok względny: SJMP rel ; PC = PC + 2 + rel rel 8b przesunięcie w zakresie 128 127 (kod U2); +2 bo PC wskazuje już następny rozkaz (SJMP zajmuje 2B) 4-27 3.5.2 Skoki warunkowe Wykonywane jeśli odpowiedni warunek jest spełniony. Warunki: testowanie flagi C / bitu, porównanie akumulatora z zerem. Tylko w wersji skoków względnych. JC rel ; if( C = = 1 ) PC += 2 + rel JNC rel ; if( C = = 0 ) PC += 2 + rel JZ rel ; if( A = = 0 ) PC += 2 + rel JNZ rel ; if( A! = 0 ) PC += 2 + rel JB bit, rel ; if( bit = = 1 ) PC += 3 + rel JNB bit, rel ; if( bit = = 0 ) PC += 3 + rel JBC bit, rel ; if( bit = = 1 ) PC += 3 + rel, bit = 0 Skoki z adresowaniem bitowym kodowane są na 3B, pozostałe na 2B. 4-28 3.5.3 Skok warunkowy z porównaniem CJNE = Compare and Jump if NOT Equal; np.: CJNE A, adr8, rel ; if( A < (adr8) ) C = 1 else C = 0 ; if( A!= (adr8) ) PC += 3 + rel Efekt uboczny oprócz skoku: ustawienie flagi C wg wyniku porównania jedyna metoda porównywania liczb w 81! Analogicznie: CJNE A, #dana8, rel CJNE Rn, #dana8, rel CJNE @Ri, #dana8, rel 3.5.4 Rozkaz zapętlenia DJNZ = Decrement and Jump if Not Zero DJNZ Rn, rel ; if( -- Rn!= 0 ) PC += 2 + rel Analogicznie DJNZ adr8,rel ; rolę licznika pełni komórka IRAM. Rozkaz bardzo użyteczny przy organizowaniu pętli iteracyjnych: Rn = N; // N = 1.. 255 do {... // powtórzone dokładnie N razy } while( --Rn ); Wszystkie instrukcje skoków wykonywane są w dwóch cyklach maszynowych. 4-29 4-30

3.6 Wywołania podprogramów Tzw. skok ze śladem (adres powrotu zapisywany na stosie). Wywołanie podprogramu z pełnym adresem (long call): LCALL adr_16 ; PUSH PCL ; PUSH PCH ; PC = adr_16 Uwagi: w trakcie wykonywania PC wskazuje już adres następnego rozkazu za LCALL. kodowanie na 3B: kod (12h) + adr_16.15..8 + adr_16.7..0 3.6 Wywołania podprogramów c.d. Podobnie jak dla skoków: mnemonik CALL asembler sam dobiera ACALL lub LCALL. Powrót z podprogramu ściągnięcie zapamiętanego na stosie adresu powrotu ( śladu ): ; POP PCH ; POP PCL Ściąganie ze stosu dwóch bajtów adresu w odwrotnej kolejności niż wysyłanie. Wywołanie podprogramu na bieżącej stronie (adres 11b): ACALL adr_11 ; PUSH PCL ; PUSH PCH ; PC.10..0 = adr_11 (PC.15..11 bez zmian) Kodowanie na 2B: a 10 a 9 a 8 1 0 0 0 1 a 7 a 6... a 0 4-31 Powrót z podprogramu obsługi przerwania: I = identycznie jak + sygnalizacja końca blokady przerwań. Wszystkie rozkazy tej grupy (LCALL, ACALL,, I): dwa cykle maszynowe. 4-32 3.6 Wywołania podprogramów przykład 3.7 Podsumowanie: rozkazy ustawiające flagi 13h: 10h: LCALL 1100h 13h: 13h: 10h: LCALL 1100h 13h: 10 53 13h: 10h: LCALL 1100h 13h: A 10 53 13h: 10h: LCALL 1100h 13h: 10 53 13h: 10h: LCALL 1100h 13h: Uwaga: w momencie wykonywania instrukcji stos musi być w identycznym stanie jak przy rozpoczynaniu podprogramu. Instrukcja Flagi Flagi Instrukcja C OV AC C OV AC ADD X X X CLR C 0 ADDC X X X CPL C X SUBB X X X ANL C,bit X MUL 0 X ANL C,/bit X DIV 0 X ORL C,bit X DA X ORL C,/bit X RRC X MOV C,bit X RLC X CJNE X SETB C 1 flaga bez zmian 0 / 1 skasuj / ustaw X ustaw odpowiednio do rezultatu operacji 4-33 4-34 4 PROGRAMOWANIE W JĘZYKU WEWNETRZNYM 4.2 Elementy programu w asemblerze 4.1 Wprowadzenie Cross assembler: kompilator pracuje w środowisku (CPU) innym (np. IBM PC) niż kompilowany program (np. 81). Jednostka organizacji programu asemblerowego segment: ciągły obszar pamięci, zawierający kod lub dane. Linker (program łączący) decyduje o ułożeniu segmentów w przestrzeniach adresowych systemu. Segmenty relokowalne: mogą być umieszczone pod różnymi adresami; segmenty o adresie absolutnym (s. absolutne): adres początkowy podany jawnie (niebezpieczeństwo nakładania się segmentów). Kod relokowalny: względne zamiast bezwzględnych w rozkazach skoków, wywołań podprogramów... 4-35 Linie źródłowe z rozkazami 81 (generują kod) Komentarze od znaku ; do końca linii Etykiety symbol etykiety + znak : Dyrektywy asemblera polecenia organizacyjne, niegenerujące kod, np. definicje modułu: NAME, MODULE, END... definicje segmentu: ASEG, RSEG, CSEG, ORG... rezerwacja pamięci na dane: DB, DW, DD, DS... przypisanie wartości symbolom: EQU, DEFINE, SET... dołączanie plików zewnętrznych: $include(837.inc) kompilacja warunkowa IF...ELSE...ENDIF definicje makr MACRO...ENDMAC sterowanie listingiem itp. 4-36

Przykładowy program: (20h) IRAM += (0200h) CODE $nomod51 $include(reg517.inc) ;dołączenie stand. definicji CSEG AT 0 ; segment kodu o adr. bezwzględnym WYN EQU 20h ; adres wyniku w IRAM MOV DPTR,#ARG ; rozkaz 3B CLR A ; 1B MOVC A,@A+DPTR ; 1B ADD A,WYN ; 2B MOV WYN,A ; 2B AJMP $ ; koniec (zapętlenie), 2B ORG 0200h ARG: DB 17h ; DB = dyrektywa Define Byte END ; koniec tekstu źródłowego Dyrektywa ORG = ustawienie wartości licznika adresów, predefiniowany symbol $ = aktualna wartość licznika adresów. Wynik: jeden segment kodu, 11B pod adr. 0000 00h, 1B pod adr. 200h. 4-37 4.3 Implementacja podstawowych operacji Porównanie A z zerem: if( A = = 0 ) B = 10h; else B = 20h; JNZ LAB1 MOV B,#10h JMP FIN LAB1: MOV B,#20h FIN: JMP $ Porównanie typu >= : if( R7 >= 10h ) B = 10h; else B = 20h; CJNE R7,#10h,ETPOM ETPOM: JC LAB1 ;C=1 R7<10 MOV B,#10h JMP FIN LAB1: MOV B,#20h FIN: JMP $ Porównanie z wartością zero: if( R7 = = 10h ) B = 10h; else B = 20h; CJNE R7,#10h,LAB1 MOV B,#10h JMP FIN LAB1: MOV B,#20h FIN: JMP $ CJNE R7,#10h,$+3 JC LAB1 ;C=1 R7<10 Użycie $+3 pozwala zaoszczędzić jedną niepotrzebną etykietę. Rozkaz CJNE + testowanie flagi C = najlepszy sposób porównywania liczb w 51. 4-38 Iteracje Przykład: zerowanie obszaru IRAM o adr. 40 4F MOV R0, #40h ; R0 = 40 PETLA: MOV @R0,#0 ; (R0) = 0 INC R0 ; R0 ++ CJNE R0, #50h, PETLA ; if(r0!=50) goto PETLA JMP $ Alternatywa: pętla DJNZ MOV R0, #40h ; R0 = 40 MOV R7, #10h ; R7 = 10 PETLA: MOV @R0,#0 ; (R0) = 0 INC R0 ; R0 ++ DJNZ R7,PETLA ; if(--r7) goto PETLA JMP $ 4-39 Podprogramy Zadanie: w przekazanym bajcie ustaw na 1 bit na zadanej pozycji WE: A bajt, R7 nr. pozycji 8 1 WY: A bajt z ustawionym bitem, R7 zero SETBIT: PUSH B ; B = rej. pomocniczy PUSH ACC ; przygotowanie maski: MOV A, #80h ; po pierwszym RL A A = 01h ROTUJ: RL A DJNZ R7, ROTUJ MOV B, A ; przechowaj maskę ; bajt do ustawienia ORL A, B ; ustawienie bitu POP B ; odtworzenie rej. pomocniczego Podprogram nie powinien niszczyć zawartości rejestrów innych niż związane z przekazywaniem argumentów; stąd PUSH B / POP B. Numer bitu powinno się podawać 7 0; instr. INC R7 przed etykietą ROTUJ. 4-40 Wywołanie podprogramu przekazanie argumentów przez A i R7: MOV A, #BAJT1 MOV R7, #NRPOZ1 CALL SETBIT Właściwa metoda przekazywania argumentów: przez stos MOV A, #BAJT1 PUSH ACC MOV R7, #NRPOZ1 PUSH ACC CALL SETBIT ; -= 2, np. 2 POP oczyszczenie stosu Powód: każde wywołanie podprogramu ma własny zestaw argumentów konieczność jeśli mają być możliwe wywołania rekurencyjne! Nowa wersja podprogramu: WE na stosie: bajt, nr. pozycji 7 0 WY: A bajt z ustawionym bitem, inne rejestry b.z. 4-41 SETBIT: PUSH 00 ; zapisuj rej. pomocnicze MOV R0, 81h ; zapamiętaj ( SFR 81h = ) PUSH PUSH B PCH PCL MOV, @R0 ; R7 = nr bitu NR_BITU MOV A, #80h ; przygotuj maskę BAJT INC R7 ; nr bitu 7 0 ROTUJ: RL A DJNZ R7, ROTUJ MOV B, A ; przechowaj maskę MOV A, @R0 ; A = bajt do ustawienia ORL A, B ; ustawienie bitu POP B ; odtworzenie rej. pomocniczych POP POP 00 4-42