Uniwersytet Śląski - Instytut Informatyki Stosowanej
Transkrypt
Uniwersytet Śląski - Instytut Informatyki Stosowanej
1. Elementy cyfrowe i mikroprocesory 8-bitowe 7 1.1. Podstawowe układy cfrowe ___________________________________________________________ Układy bramkujące Układy cyfrowe są zbudowane z elementarnych układów, zwanych bramkami logicznymi, realizujących podstawowe operacje logiczne. Zestawienie symboli podstawowych bramek logicznych przedstawiono w tablicy 1.1. H to poziom wysoki oraz L poziom niski. Niektóre z tablic operacji opisano za pomocą poziomów logicznych 0 i 1, dla dodatniej konwencji poziomów: 1 odpowiada wysokiemu poziomowi napięcia (H) oraz 0 odpowiada poziomowi niskiemu (L). Cyfrą 3 oznaczono trzeci stan logiczny, wysokiej impedancji zmiennej wyjściowej. Bramki logiczne umożliwiają realizację bardziej złożonych układów cyfrowych, których przeznaczeniem jest: - krótkotrwałe przechowywanie wektorów binarnych, - przekazywanie wektorów binarnych między różnymi układami, - przetwarzanie wektorów informacji, - sterowanie procesem przetwarzania informacji. Przykład prostego układu bramkującego pokazano na rys. 1.1, gdzie na wyjściu układu (WY) jest powtarzana informacja wejściowa (WE) wtedy, gdy sygnał bramkujący B = 1. Tego typu blok wykorzystuje się we wszystkich układach synchronizacji pisania i czytania danych. 8 Tablica 1.1 Symbole podstawowych bramek logicznych Nazwa bramki Wtórnik Invertor - negacja Alternatywa - OR NOR Iloczyn - AND NAND Symbol Tabela operacji x y L L H H x y L H H L x 1 x2 y LL LH HL HH L H H H x 1 x2 y 0 0 1 1 0 1 0 1 1 0 0 0 x 1 x2 y 0 0 1 1 0 1 0 1 0 0 0 1 x 1 x2 y 0 0 1 1 0 1 0 1 1 1 1 0 x 1 x2 y LL LH HL HH 3 L 3 H y=x x y=x x x1 x2 y = x1+x2 x1 x2 y = x1+x2 x1 x2 y = x1x2 x1 x2 y = x1x2 Bramka trójstanowa y x1 x2 9 WE WY B - sygnał bramkujący ( ) Rys. 1.1. Przykład układu bramkującego Multipleksery i demultipleksery Do przełączania źródeł informacji stosowane są układy zwane multiplekserami. Na jedno wyjście przepisywana jest informacja z jednego wybranego wejścia. Schemat takiego układu pokazano na rys. 1.2. Dekoder przełącza na wyjście układu jedną z czterech linii wejściowych (od 0 do 3). O tym która z linii wejściowych jest czynna decydują wartości zmiennych adresowych a0,a1 dekodera. .Liczba adresowanych linii wejściowych jest potęgą liczby zmiennych adresowych. Jeśli liczba zmiennych adresowych jest równa n, to liczba adresowanych linii wejściowych jest równa k = 2n . a) X0 X1 Y X2 X3 b) a0 X0 X1 a1 X2 X3 dekoder MUX a0 Y a1 Rys. 1.2. Schemat multipleksera (MUX) o czterech wejściach informacyjnych a) schemat ideowy, b) symbol multipleksera 10 Równoległe połączenie multiplekserów 1-bitowych daje multiplekser wielobitowy, którego przykład pokazano na rys. 1.3. a) b) 0 1 2 3 (A0 - A3) Y0 - Y3 B C D (A0 - A3) MUX B Y0 - Y3 C a0 a1 D Rys. 1.3. Przykład multipleksera czterobitowego a) schemat ideowy, b) symbol zastępczy Dwie linie adresowe a0 a1 przełączają odpowiednie linie A0-A3 czterech 1-bitowych multiplekserów (0,1,2,3), na odpowiadające im wyjścia Y. Gdy a0 a1 = 00, na wyjścia Y0-Y3 podłączone zostają przewody grupy (portu) A każdego z multiplekserów. Analogicznie przełącza się pozostałe wejścia portów B, C i D; zgodnie z przyporządkowanymi im wartościami zmiennych adresowych. Operację przełączania w drugą stronę, z magistrali na porty wyjściowe, realizuje układ zwany demultiplekserem. Zasadę działania demultipleksera ilustruje układ pokazany na rys. 1.4. Linie adresowe a0 a1 przełączają magistralę X na odpowiednie porty wyjściowe A, B, C i D. A = X dla a0 a1 = 00 , B = X dla a0 a1 = 01 , C = 10 dla a0a1 = 10 , D = X dla a0 a1 = 11. Multiplekser i demultiplekser należą do grupy układów cyfrowych zwanych selektorami. A X B DMX C D a0 X0 X1 X2 X3 X4 X5 X6 X7 koder 1z8 Y0 Y1 Y2 a1 Rys. 1.4. Oznaczenia demultipleksera Rys. 1.5. Oznaczenia kodera 1 z 8 Kodery i dekodery Koderem nazywamy układ realizującym operacje kodowania informacji, tzn. przyporządkowania zbiorowi elementów informacji określonych wektorów binarnych. Na rys. 1.5 podano przykład kodera stanów zadziałania jednego z ośmiu sygnałów wejściowych (szyfratora 1 z 8) za pomocą 3-bitowych wektorów binarnych, zgodnie z zasadą kodowania 2n = 23 = 8, gdzie n oznacza liczbę bitów wektora kodującego. Dekoder wykonuje operacje odwrotne do operacji kodera, tzn. zamienia wartości wejściowych wektorów binarnych na odpowiadający im aktywny sygnał wyjściowy. Elementy i układy pamięci Zapis/Odczyt - RAM Podstawowym układem pamięci półprzewodnikowej jest przerzutnik, którego schemat ideowy przedstawiono na rys. 1.6. a) b) s s r Q Q Q Rys. 1.6. Schemat ideowy (a) i symbol (b) jednobitowej komórki pamięci Zapis/Odczyt Jest to 1-bitowa komórka pamięci statycznej typu zapis/odczyt. W tym elemencie pamięci aktywny jest niski poziom sygnałów wejściowych - s i r. Wartość s = 0 (s - set) ustawia wartość 1 na wyjściu Q natomiast r = 0 (r - reset) zeruje zmienną wyjściową Q. Zespół przerzutników przeznaczonych do krótkotrwałego przechowywania wektora informacji cyfrowej nazywamy rejestrem (rys. 1.7). 12 WY (OUT) LE Serial IN Stb/Clock 0 1 2 3 czytaj (RD) 0 1 2 3 pisz (WR) WE (IN) Rys. 1.7. Symbol czterobitowego rejestru równnoległego Rejestr przyjmuje dane wprowadzane równolegle na przewodach wejściowych WE/IN (0, 1, 2, 3) lub wprowadzane szeregowo, na przewodzie Serial IN. Przełączanie trybu wprowadzania danych szeregowo lub równolegle odbywa się za pomocą linii sterującej LE. Sygnał WR - pisz (write). Dane można wprowadzać szeregowo (Serial IN) w takt impulsu zegarowego - Clock. Sygnał zegarowy jest też nazywany sygnałem synchronizującym. Dane są czytane na przewodach WY/OUT synchronicznie w takt sygnału RD - odczytu. Rejestry z równoległym wprowadzaniem danych i równoległym odczytem są elementem składowym układów zwanych pamięcią operacyjną systemu cyfrowego (Rys. 1.8). W pamięci operacyjnej przechowywane są ciągi wielobitowych wektorów binarnych reprezentujące dane lub kody sterujące programu. Możliwość natychmiastowego zapisu i odczytu została nazwana dostępem swobodnym lub dostępem natychmiastowym (RAM Random Access Memory). Na wejścia adresowe pamięci (Adr) zadawane są wektory binarne, które dekoder zamienia na 1 z n aktywnych sygnałów selekcji rejestrów pamięciowych, ponumerowanych od 0 do n - 1. Zadziałanie dekodera jest uwarunkowane poziomem aktywnym dodatkowego sygnału bramkującego CS (chip select) selekcji bloku RAM. Zaadresowany rejestr pamięciowy zostaje podłączony do linii DANE WE/WY. Kierunek transmisji danych do lub z rejestru pamięciowego określają poziomy sygnałów zapisu WR/Write i odczytu RD/Read. Układ Z/O (zapis/odczyt) zawiera elementy przełączania kierunku transmisji, zwane zwrotnicami, wzmacniacze sterujące liniami danych oraz wzmacniacze separujące linie danych od bloku rejestrów pamięciowych. Jest to stan linii różny od 0 lub 1, zwany stanem wysokiej impedancji lub trzecim stanem (porównaj tabl. 1.1). Stos 13 Pamięcią typu zapis odczyt przyjmującą dane w określonym porządku (od adresu wyższego do niższego) jest również stos. Na rys 1.8 b przedstawiono zasadę wprowadzania (Push) danych do pamięci typu STOS. Odczyt danych ze stosu (Pop) odbywa się w kolejności odwrotnej. Jako stos wykorzystywana jest pamięć RAM. Komórki pamięci są adresowane specjalnym rejestrem liczący, zwanym wskaźnikiem stosu, którego zawartość można zwiększać lub zmniejszać programowo (Pop, Push) oraz automatycznie w trakcie obsługi żądań przerwania (omówionych w dalszej części książki). a) 0 1 2 CS Adr dekoder n-1 pisz (WR) czytaj (RD) bufor Z/O Dane WE/WY b) D2 D1 D0 D0 D1 D0 Rys 1.8. Blok pamięci RAM a) schemat ideowy pamięci typu zapis/odczyt; b) Zasada wpisywania danych do stosu. Zwrotnica Schemat ideowy 1-bitowej zwrotnicy 3-stanowej pokazano na rys.1.9. Przełącza ona kierunek transmisji danych z punktu A do B lub z punktu B do A. Odpowiednio do wartości sygnału bramkującego (E) jest aktywny jeden lub drugi ze wzmacniaczy 3-stanowych układu. Moduły zintegrowane wzmacniaczy 3-stanowych zawierają kilka równolegle połączonych układów 1-bitowych podłączonych do wspólnej szyny transmisyjnej zwanej magistralą. 14 3 A B 3 E Rys 1.9. Schemat ideowy zwrotnicy 3-stanowej Pamięci stałe - ROM Elementy pamięci RAM cechuje ulotność zapisanych danych, co oznacza, że po wyłączeniu napięcia zasilania i ponownym jego załączeniu zapisane wcześniej w pamięci wektory informacji binarnej nie zostają zachowane. Na rys.1.10 przedstawiono schemat ideowy fragmentu matrycy tranzystorowej, która funkcjonuje podobnie jak pamięć. Na wyjściach WY są odbierane dane odpowiadające stanowi zainstalowania tranzystorów. Funkcję sygnałów adresowych (ADR 0, 1, ...) spełniają linie sterowania bramek. Aktywny poziom sygnału sterującego bramkami tranzystorów matrycy odpowiada wartościom 0 na wyjściach z zamontowanym tranzystorem. Brak tranzystora w polu adresacji odpowiada wartości 1 na tym wyjściu (zakładając, że 1 = UDD). Zapis informacji do pamięci polega na wykonaniu określonych operacji na etapie produkcji takich pamięci lub zniszczeniu połączeń dla tranzystorów zbędnych. Oznacza to jedynie możliwość odczytu informacji uprzednio zapisanej (Read Only Memory). 15 a) WY1 WY0 U DD U DD 0 ADR 1 2 b) ADR WY0 WY1 0 1 2 Rys 1.10 Komórka pamięci ROM a) schemat ideowy b) uproszczony schemat zastępczy Istotną cechą tych układów jest niezmienność ich zawartości po wyłączeniu i ponownym załączeniu napięcia zasilania. Liczniki Liczniki są układami, w których zapisana informacja, czy odpowiadająca jej wartość dziesiętna, może zostać zwiększona lub zmniejszona o jeden, czasem o zadaną wartość większą od jeden. Na rys. 1.11 pokazano oznaczenia licznika binarnego taktowanego sygnałem „clock”. Zadana na wejściach WE wartość początkowa jest powiększana, gdy aktywny jest sygnał INC (Increment) lub pomniejszana dla aktywnego sygnału DEC (Decrement). 16 WY Clock licznik binarny INC DEC WE Rys.1.11. Oznaczenia podstawowego licznika binarnego Jednostka Arytmetyczno-Logiczna (ALU) Systemy obliczeniowe realizują operacje arytmetyczne lub operacje logiczne (polegające na badaniu spełnienia założonego warunku). Wymienione operacje wykonuje układ zwany jednostką arytmetyczno-logiczną (ALU - Arithmetic Logic Unit). Operacje są wykonywane na dwóch wektorach binarnych zwanych operandami (rys. 1.12). wskaźniki (RF) A ALU Y B C Rys 1.12. Oznaczenia sygnałów jednostki Arytmetyczno-Logicznej (ALU) Na wejściach programujących C zadawany jest rodzaj operacji, której poddane zostają operandy A i B. Wynik operacji przedstawia wartość wektora Y oraz wartości wskaźników RF - rejestru flagowego (rejestru wskaźników). Bity flagowe przyjmują charakterystyczne dla określonych operacji wartości, na przykład bit Z = 1 (wskaźnik zera) dla spełnienia operacji porównania A = B, czy S = 1 (znak) gdy spełniona jest nierówność A > B. Skala integracji Układy cyfrowe o typowej funkcji (jak: liczniki, rejestry, pamięci czy układy arytmetyczno-logiczne) produkuje się w postaci jednego układu elektronicznego zwanego układem scalonym lub zintegrowanym. W latach siedemdziesiątych stosowano formalną klasyfikację układów scalonych o tzw. małej (SSI), średniej (MSI) lub dużej (LSI) skali integracji, w 17 której kryterium podziału stanowiła liczba tranzystorów we wspólnej strukturze elektronicznej. Nieustanny wzrost stopnia upakowania elementów scalonych spowodował, że wprowadzone liczbowe wagi podziału układów zintegrowanych nie odpowiadają realiom technologicznym. Wiadomo na pewno, że mała skala integracji oznacza kilkadziesiąt tranzystorów w układzie a bardzo duża skala integracji (VLSI) to kilkadziesiąt lub kilkaset milionów tranzystorów w układzie scalonym. 1.2. Podstawowe moduły komputera ___________________________________________________________ 18 Mikroprogramowane sterowanie Operacje arytmetyczne realizowane w zapisie dwójkowym są wykonywane jako sekwencja operacji składowych (dodawanie, przesunięcia i dopełnienie - negacja). Zadania wykonywane w jednym takcie zegarowym zwane są mikrooperacjami. Sekwencja takich mikrooperacji zwana jest mikroprogramem zadanej operacji arytmetycznej. Na rys. 1.13 przedstawiono schemat blokowy mikroprogramowanego układu sterującego. Na liniach wejściowych kod rozkazu podany zostaje wektor binarny będący adresem początku mikroprogramu odpowiadającego temu rozkazowi. Kod rozkazu zostaje wprowadzony do Rejestru Adresu mikrorozkazów (RA), którego zawartość adresuje odpowiednią komórkę pamięci ROM, gdzie rezydują wektory sterujące układami wykonawczymi procesora i komputera. Zawartość wskazanej przez RA komórki pamięci zostaje wprowadzona do Rejestru Mikrorozkazu (RM). Jego zawartość zadaje jednostce arytmetyczno-logicznej kod mikrooperacji oraz steruje pracą wszystkich elementów składowych układu cyfrowego –sygnałami P1 - Pk-1 . Ostatni z tych sygnałów (Pk ) steruje przebiegiem sekwencji mikroprogramu. Gdy Pk = 0, wówczas do RA w ciągu mikroprogramu dla zadanego kodu rozkazu jest wprowadzany wektor adresowy następnego mikrorozkazu (i+1). W przedostatnim kroku mikroprogramu zostaje odczytany następny kod rozkazu, a w ostatnim kroku mikroprogram, sygnałem Pk = 1, otwarta zostaje droga transmisji dla pierwszego wektora drugiego rozkazu. Układ sterowania, opisany w poprzednim rozdziale, generuje ciągi wektorów binarnych zapisane w pamięci mikroprogramu. 19 RM pamięć mikroprogramu (ROM) kod mikrooperacji } P1 - Pk-1 Pk adres i+1 RA kod rozkazu Rys 1.13. Schemat ideowy układu mikroprogramowanego sterowania RA - Rejestr Adresu, RM - Rejestr Mikrorozkazu Po dodaniu do bloku pamięci modułu RAM (rys.1.14) możliwe jest modyfikowanie mikroprogramów, dzięki wektorom binarnym wprowadzanym za pomocą linii wejściowych WE/WY. Są to bieżące dane dla elementów mikroprogramu rezydującego w pamięci programu ROM. Ponadto można łączyć ze sobą rezydujące w pamięci ROM sekwencje sterowania w mikroprogramy wielomodułowe, za pomocą danych czytanych z komórek pamięci RAM. Pokazany na rys. 1.14 układ jest sterownikiem binarnym, w którego program pracy może ingerować jego użytkownik. W ten sposób działają niektóre sterowniki przemysłowe o programach pracy uzależnionych od wartości wektorów zadanych na liniach WE lub od wyników operacji z poprzednich kroków. Obliczenia arytmetyczne można wykonać w zapisie binarnym a bieżący wynik może warunkować realizację kroku następnego w sekwencji sterowania, tzn. alternatywnie względem wartości badanej. Alternatywa należy do grupy operacji logicznych, stąd urządzenie cyfrowe wykonające operacje obliczeniowe - arytmetyczne i operacje badania warunków nazywamy układem lub jednostką arytmetyczno - logiczną (ALU - rys. 1.12). Jednostkę arytmetyczno-logiczna wraz ze współpracującym z nią układem sterowania nazwano procesorem. 20 WE/WY RMR RAM ALU - kod mikrooperacji pamięć mikroprogramu (ROM) } P1 - Pk-1 Pk adres i+1 RAMR kod rozkazu Rys 1.14. Schemat ideowy sterownika mikroprogramowanego Na rys. 1.15 przedstawiono mikroprogramowany układ zawierający podstawowe elementy urządzenia przetwarzającego zwanego komputerem. Procesor jest elementem składowym komputera. magistraly adresów i danych blok rejestrów ALU sterowanie układy sprzęgające i ROM RAM dekodery adresów WE/WY Rys. 1.15. Schemat blokowy komputera • ALU (Arithmetic Logic Unit) jest jednostką arytmetyczno-logiczną komputera, która realizuje podstawowe operacje arytmetyczne: binarne dodawanie i odejmowanie oraz operacje logiczne: AND, OR i EXCLUSIVE-OR. • Sterowanie (CU - Control Unit) jest jednostką sterującą realizacją mikroprogramów za pomocą ALU i układów z nią współpracujących. • Procesor zawiera ALU oraz jednostkę sterującą. Zwany jest centralnym układ przetwarzający - CPU (Central Processing Unit) komputera. Procesor wykonuje program zapisany w 21 pamięci operacyjnej w formie wektorów (wielobitowych słów) binarnych. Wektory binarne są wprowadzane do procesora za pośrednictwem magistral - do ALU i jednostki sterującej oraz pomocniczych rejestrów wewnętrznych procesora. • Układy sprzęgające zwane układami wejściowo/wyjściowymi (WE/WY, IN/OUT, interface) pośredniczą w operacjach transmisji danych do centralnego układu przetwarzającego z urządzeń wejściowych lub odwrotnie; z CPU do urządzenia wyjściowego. Układy WE/WY zwalniają procesor z realizacji wielu czasochłonnych funkcji polegających głównie na dopasowaniu szybkości i formatu transmitowanych danych, pomiędzy procesorem a pamięciami lub urządzeniami do wprowadzania i wyprowadzania danych. Te i inne względy sprawiły, że współczesne procesory zostały "obudowane" różnymi układami wspomagającymi ich pracę. • Cykl pracy procesora - oznacza powtarzające się cyklicznie działania związane z przetwarzaniem zapisanego w pamięci programu.. Praca procesora rozpoczyna się od fazy pobrania (fetch) kodu rozkazu (operacji), który zostaje zamieniony na ciąg mikrooperacji procesora, tworzących fazę wykonawczą rozkazu (execute). • Mikroprocesor - jest procesorem wykonanym w technikach wysokiej skali integracji (VLSI, USI). Historycznie pierwszym (powszechnie stosowanym) układem mikroprocesorowym był element 8-bitowy firmy Intel 8080/85, którego dalszy rozwój dał opracowania 16- 32- i 64-bitowe stanowiące podstawę rozwoju komputerów firmy IBM. 22 1.3. Zasady działania mikroprocesora 8-bitowego ___________________________________________________________ Na rys. 1.16 pokazano schemat blokowy magistralowego mikroprocesora 8-bitowego, na którym zaznaczono podstawowe elementy składowe oraz magistrale zewnętrzne i wewnętrzne typowe dla mikroprocesorów I8080/85-firmy Intel, M6500/6800-firmy Motorola i Z80-firmy Zilog. Mikroprocesor 8-bitowy składa się z następujących bloków: • jednostki arytmetyczno-logicznej (ALU), • układu sterowania (CU - Control Unit), • rejestrów operacyjnych, jak: A - akumulator, RP - rejestr pomocniczy, RF - rejestr wskaźników flagowych (flag register) PC - licznik rozkazów, lub licznik programu (pogram counter), SP - wskaźnik stosu (stack pointer) RR - rejestr rozkazów. • bloku BR - rejestrów programisty (inaczej, rejestrów ogólnego przeznaczenia), • buforów szyn zewnętrznych: BMD - bufor magistrali danych, BMA - bufor magistrali adresowej. Mikroprocesor komunikuje się z otoczeniem za pomocą trzech magistral zewnętrznych (Z): 23 - magistrali danych ZMD (data bus), - magistrali adresowej ZMA (address bus), - magistrali sygnałów sterujących MS (control bus). ZMD BMD WMD A RP RF BR RR SP PC ALU sterowanie MS BMA ZMA Rys.1.16. Schemat blokowy mikroprocesora 8-bitowego Mikroprocesor jest centralną jednostką przetwarzającą komputera wykonującą operacje na wielobitowych operandach. Rozkazy i dane są przekazywane do procesora za pomocą magistrali danych. Magistrala adresowa służy do określenia lokacji źródła rozkazów lub danych oraz miejsca przeznaczenia wyników operacji. Mikroprocesor współpracuje z urządzeniami zewnętrznymi za pośrednictwem sygnałów sterujących, które tworzą magistralę sygnałów sterujących, MS. W pracy mikroprocesora, tak jak w każdym układzie mikroprogramowanym, wyróżniamy dwie fazy realizacji programu: pobrania rozkazu i jego wykonania. Jednym z podstawowych sygnałów sterujących procesora jest zerowanie (Reset), które ustawia elementy mikroprocesora w stan początkowy. Następuje odczyt rozkazu z pamięci komórki operacyjnej wskazanej adresem warunku początkowego i jego wykonanie. Lokacja rozkazu lub operandów jest wskazywana każdorazowo zawartością licznika rozkazów (PC). Odczytany rozkaz zostaje przekazany do jednostki sterującej mikroprocesora, która analizuje kod rozkazu definiując rodzaj operacji i adresy operandów. Na zakończenie ciągu operacji ustalona jest nowa zawartość licznika rozkazów, będąca adresem kolejnego rozkazu. 24 Jednostka arytmetyczno-logiczna wykonuje operacje na operandach zawartych w rejestrach A i RP. Wyniki operacji zostają przekazane do określonego rejestru wewnętrznego procesora, do zewnętrznej komórki pamięci lub do rejestru buforowego urządzenia zewnętrznego. Z tych samych miejsc mogą być pobrane dane. Wyniki operacji określonej grupy rozkazów są reprezentowane charakterystycznymi wartościami bitów flagowych (warunków) rejestru wskaźników, jak: • wynik operacji równy zeru, wtedy Z = 1, • występuje przeniesienie na najstarszym bicie, CY = 1, • przeniesienie wewnętrzne na bicie czwartym, AC = 1, • parzysta liczba znaków wyniku operacji (zero lub jeden), P = 1, • znak wyniku operacji, S = 1 dla wartości 1 na najstarszym bicie wyniku operacji. Do wartości wskaźników odnoszą się rozkazy warunkowe, których wykonanie zależy od spełnienia założonego warunku. Interpretację wskaźników dokładniej omówiono w rozdziale opisującym autokod procesorów 8-bitowych firmy Intel. Mikroprocesor współpracuje z elementami zewnętrznymi gromadzącymi kody sterujące i dane, czyta z pamięci kody programu, interpretuje je, pobiera dane z pamięci lub układów sprzęgających (ze źródła informacji), wykonuje określone operacje i przekazuje wyniki do rejestrów przeznaczenia procesora: wewnętrznych lub zewnętrznych. Źródło i miejsce przeznaczenia informacji są wskazywane za pomocą wielobitowych wektorów adresowych o wartościach z przedziału 000...0 do 111...1. Współpracą procesora z urządzeniami zewnętrznymi kierują sygnały sterujące magistrali MS: wejścia i wyjścia jednostki sterującej mikroprocesora. Do najważniejszych z nich zaliczamy: • sygnał gotowości danych na magistrali (Ready), • sygnały obsługi przerwań (Interrupt - żądanie i potwierdzenie gotowości), • sygnały obsługi bezpośredniego dostępu do pamięci (DMA- Direct Memory Access). Sygnałem gotowości danych jest Ready (gotów). Transmisja danych za pośrednictwem magistrali równoległej odbywa się partiami 8-bitowymi, bajt po bajcie. Ponieważ szybkość pracy procesora znacznie przewyższa szybkość pracy urządzenia zewnętrznego, dlatego szybkość transmisji danych musi być dostosowana do parametrów pracy urządzenia najwolniejszego w systemie. Za synchronizację operacji transmisji danych jest odpowiedzialna linia gotowości danych (Ready), informująca procesor o gotowości danych na magistrali. 25 Na rys. 1.17 przedstawiono schemat blokowy systemu transmisji danych z potwierdzeniem ich gotowości na magistrali. Dwa urządzenia (A i B) przekazują sobie dane w takt zmian poziomów logicznych czterech sygnałów sterujących: Start, Gotów, Pełny i Takt. Na przykład urządzenie A załaduje dane do bufora układu sprzęgającego sygnałem Start, o ile bufor jest Gotów przyjąć dane, tzn. o ile poprzednia porcja danych została już przekazana do urządzenia B. Urządzenie B zostaje poinformowane o stanie zapełnienia aktywnym poziomem sygnału Pełny, co oznacza, że układ sprzęgający otrzymał nowe dane dla urządzenia B. Odbiornik B dokonuje odczytu danych za pomocą sygnału Takt. Gdy sygnał Gotów jest aktywny oznacza to dla urządzenia A zezwolenie na przesłanie następnej porcji danych sygnałem Start. Gotów Takt układ urządzenie A urządzenie B sprzęgający Start Pełny Rys.1.17. Schemat blokowy układu transmisji z potwierdzeniem gotowości danych Podobnie przebiega proces transmisji danych w drugą stronę. Urządzenie A czyta dane z bufora układu sprzęgającego sygnałem Start, o ile sygnał Gotów sygnalizuje stan zapełnienia układu sprzęgającego aktualnymi danymi. Po ich odczycie urządzenie B jest informowane (nieaktywny poziomem logicznym sygnału Pełny) o możliwości załadowania kolejnej porcji danych do układu sprzęgającego sygnałem Takt. INT (Interrupt) oznacza żądanie przerwania realizacji jednego programu w celu podjęcia realizacji innego programu. Podobnie do transmisji sterowanej stanem gotowości magistrali (Ready) przebiega przekazywanie danych w trybie obsługi żądania przerwania (rys. 1.18). Różnica polega jedynie na kolejności zgłoszeń poziomów aktywnych sygnałów sterujących. Na przykład, urządzenie A podejmuje proces czytania zawartości rejestrów układu sprzęgającego po otrzymaniu informacji o pojawieniu się nowych danych w układzie sprzęgającym. Żądanie czytania danych jest sygnalizowane poziomem aktywnym sygnału INT. Urządzenie A czyta dane sygnałem Start. Do urządzenia B zostaje przekazany sygnał gotowości (Pełny = nieaktywny) oznaczający wykonanie operacji odczytu i możliwości wpisania nowej porcji danych do układu sprzęgającego, sygnałem Takt. 26 INT Takt układ urządzenie A urządzenie B sprzęgający Start Pełny Rys.1.18. Schemat blokowy układu transmisji w trybie obsługi żądania przerwania Omówiony tu sposób przekazywania danych, między dwoma układami, nazywany jest trybem obsługi żądania przerwania. Dane wolno gromadzone w urządzeniu B są przekazywane do urządzenia A w określonym czasie. 27 1.4. Realizacja rozkazów w mikroprocesorze 8 – bitowym ___________________________________________________________ W celu wyjaśnienia zasad realizacji rozkazów w typowym mikroprocesorze 8bitowym posłużono się prostym schematem (rys. 1.19), zawierającym pięć podstawowych układów: • jednostka arytmetyczno-logiczna, ALU, • jednostka sterująca, CU, • licznik programu, PC, • pamięć operacyjna, PAO, • akumulator, A. Praca procesora rozpoczyna się z chwilą włączenia napięcia zasilania. Wszystkie elementy składowe komputera są wtedy ustawione w stan początkowy. Licznik rozkazów (zwany również licznikiem programu) adresuje komórki pamięci operacyjnej zawierającej wektory binarne, będące zakodowana formą programu. Gdy PC zawiera same zera wskazana zostaje zawartość zerowej komórki pamięci operacyjnej (faza 1) i pobrany zostaje pierwszy rozkaz programu - faza pobrania rozkazu (fetch). Kod rozkazu zostaje przekazany do jednostki sterującej procesora (faza 2). W jednostce sterującej następuje rozszyfrowanie znaczenia rozkazu i określenie kolejności kroków fazy wykonawczej (3, 4). Pokazany na rys. 1.19 przykład ilustruje wykonanie prostego rozkazu, polegającego na pobraniu (3) z PAO jednego operandu i przekazaniu go do ALU (4). 28 (1) (2) PAO PAO adres adres rozkaz rozkaz operand operand JS PC (3) (4) PAO rozkaz rozkaz adres A operand PC PAO JS operand ALU Rys 1.19. Schemat realizacji rozkazów w mikroprocesorze (1) - operacja pobrania rozkazu, (2),(3),(4) - fazy wykonania rozkazu W pamięci operacyjnej są przechowywane wektory binarne, których znaczenie jest interpretowane w jednostce sterującej. Część z tych wektorów reprezentuje kod rozkazu, a część dane na których wykonywane są kolejne operacje. W pamięci operacyjnej zapisywane są również wyniki operacji wykonywanych przez procesor. Adresy kolejnych komórek pamięci określa zawartość licznika programu. Faza pobrania rozpoczynająca każdy rozkaz, wykonywana jest zawsze w taki sam sposób. Faza wykonawcza jest inna dla każdego rozkazu. Rozgałęzienia i podprogramy Realizacja wielu zadań przebiega według jednego stałego schematu. Program jest ciągiem wektorów binarnych zapisanych w kolejnych komórkach pamięci. Jednak sposób realizacji niektórych segmentów programu zależy od spełnienia określonych warunków. Rozkazy warunkowe sprawiają, że realizacja programu może przebiegać w innej 29 kolejności niż jego zapis. Następuje rozgałęzienie programu, a więc licznik programu wskazuje komórki pamięci o adresie innym od kolejnego. Szczególnym przypadkiem rozwidlenia jest wywołanie podprogramu. Uproszczony schemat takiego rozwidlenia pokazano na rys 1.20. Przed podjęciem podprogramu ma miejsce zapamiętanie adresu komórki, na której została zatrzymana realizacja programu zasadniczego polegająca na przeniesieniu do specjalnego obszaru pamięci (3), zwanego stosem, ostatniej zawartości licznika rozkazów, a na jej miejsce zostaje wprowadzony (4) adres pierwszej komórki pamięci zawierającej podprogram. Po wykonaniu podprogramu do licznika rozkazów wraca (ze stosu) ostatni adres komórki programu zasadniczego i zostaje podjęta dalsza jego realizacja. rozkaz operand (1) PAO adres podprogram rozkaz rozkaz (4) operand PC PC n-2 STOS (3) n-1 n Rys 1.20. Uproszczony schemat realizacji skoku do podprogramu (1) - faza pobrania, (2) - jak na rys 1.19, (3) - odłożenie na stos adresu powrotu, (4) - skok do podprogramu. Przerwania Każdy z procesorów przyjmuje sygnały zewnętrzne ingerujące w realizację jego bieżącego programu. Przerwaniem nazywamy zawieszenie realizacji programu zasadniczego spowodowane sygnałem przerywającym. Może to być sygnał wewnętrzny generowany rozkazem zawartym w programie lub (i tak bywa najczęściej) sygnał zewnętrzny wywołujący rozwidlenie programu. Powyżej (rys. 1.20) omówiono zasady realizacji rozkazu warunkowego, w którym badanie warunku zostaje zainicjowane w jednostce sterującej kodem rozkazu. 30 Jednostka sterująca procesora jest wyposażona w układ inicjacji rozwidleń programu za pośrednictwem zewnętrznych sygnałów sterujących. Aktywny poziom logiczny takiego sygnału powoduje uruchomienie procedury przejścia do podprogramu o adresie przypisanym sygnałowi przerywającemu. Uruchomienie podprogramu nazywamy wywołaniem procedury obsługi przerwania. Budowa procesora 8 - bitowego Na rys. 1.21 przedstawiono uproszczony schemat przykładowego mikroprocesora 8bitowego 8080, opracowanego przez firmę Intel. Na nim oparta została architektura procesorów 8-bitowych wszystkich firm. Jego mechanizmy działania są podstawą pracy wszystkich magistralowych procesorów 8-bitowych, różnych firm. W dalszej cześci książki omówiono jego szczególną wersję, układ 8051 zintegrowaną z elementami otoczenia procesorów, zwaną sterownikiem lub komputerem jednoukładowym. Układ 8080 jest zasilany dwoma napięciami dodatnimi + 5V, +12 V oraz napięciem ujemnym -5V. Mikroprocesor składa się z czterech bloków: • bloku rejestrów i układu adresacji, • bloku arytmetyczno-logicznego, • bloku sterowania, • bufora magistrali danych. Blok rejestrów Blok rejestrów wewnętrznych mikroprocesora, to: • licznika programu (PC), • wskaźnika stosu (SP), • bloku rejestrów ogólnego przeznaczenia (B,C, D,E i H,L). Licznik programu wskazuje komórkę pamięci zawierającą adres następnego rozkazu. Jego zawartość zwiększana się automatycznie (Inc - inkrementowana) w trakcie realizacji operacji pobrania rozkazu. Wskaźnik stosu pokazuje lokację kolejnej wolnej komórki pamięci stosu. Wskaźnik automatycznie zmniejsza (Dec) zawartość po każdej operacji zapisu (Push) danych do stosu, zwiększa zawartość (Inc) po każdej operacji odczytu (Pop) wektorów danych ze stosu. Blok rejestrów zawiera trzy pary 8-bitowych rejestrów programisty, które można wykorzystywać jako rejestry pojedyncze lub łączyć je parami (BC, DE i HL) w rejestry 16- 31 bitowe. Komunikacja z rejestrami pojedynczymi lub parami rejestrów odbywa się za pośrednictwem układu selekcji (MUX). W rejestrach ogólnego przeznaczenia przechowywane są dane dla bieżących operacji programu. Do rejestru zatrzaskowego (Latch) przekazywane są 16-bitowe dane adresujące pamięć operacyjną komputera. Układy procesora Każdy procesor składa się z dwóch układów: jednostki arytmetyczno-logicznej (ALU) oraz ze sterowania (CU). ALU wykonuje operacje arytmetyczne, logiczne i przesunięcia. W skład zintegrowanego układu procesora wchodzą: • jednostka arytmetyczno-logiczna, zwana centralnym elementem przetwarzającym, • 8-bitowy rejestr akumulatorowy (A), • 8-bitowy rejestr przejściowy (RP), • rejestr wskaźników flagowych (RF). dane (D 0-D7 ) BMD RF RP A MUX RR/DR ALU B C D E H L SP sterowanie SYNC (RD) WR INT (INTA) INTE HOLD HOLDA READY RESET f 1 f 2 PC INC/DEC LATCH/BMA adres (A0 -A15 ) Rys. 1.21. Schemat blokowy przykładowego mikroprocesora 8-bitowego 32 W czasie operacji pobrania rozkazu pierwszy jego bajt zawiera kod rozkazu. Jest on przekazywany z pamięci operacyjnej, poprzez magistralę danych do rejestru rozkazów (RR), do dekodera rozkazów (DR) i jednostki sterującej (sterowania). Sterowanie procesora określa wartości wszystkich sygnałów sterujących elementów procesora biorących udział w realizacji operacji odpowiadającej kodowi rozkazu oraz wzajemne zależności czasowe tych sygnałów. Bufor magistrali danych Jest to 8-bitowy (D0 - D7), 3-stanowy bufor izolujący wewnętrzną magistralę procesora od magistrali zewnętrznej - magistrali komputera. W trybie wyprowadzania danych zawartość wewnętrznej magistrali danych jest zapisywana w 8-bitowym rejestrze zatrzaskowym (Latch), który na przewodach wyjściowych wyposażono we wzmacniacze trójstanowe. W trybie wprowadzania danych wzmacniacze pełnią rolę układu przełączającego dla linii magistrali zewnętrznej. W fazie nieaktywnej bufora przewody WE/WY (D0 - D7) są ustawiane w stan wysokiej impedancji (trzeci stan). Cykl pracy procesora Cykl rozkazu procesora składa się z operacji pobrania (Fetch) i wykonania (Execute) rozkazu. W czasie pobrania do rejestru rozkazowego procesora przenoszone są z pamięci operacyjnej jeden, dwa lub trzy bajty kodu rozkazu. W fazie wykonawczej rozkaz jest dekodowany i zamieniany na odpowiadający mu ciąg operacji. Każdy cykl rozkazowy przykładowego procesora 8-bitowego zawiera od jednego do pięciu cykli maszynowych. Faza pobrania składa się z tylu cykli maszynowych, ile bajtów musi być przesłanych z pamięci operacyjnej do procesora w ramach jednego rozkazu. Czas trwania cyklu wykonawczego zależy od rodzaju pobranego rozkazu. Każdy z cykli maszynowych (Mk ) obejmuje trzy, cztery lub pięć cykli zegarowych (Ti) procesora. Zintegrowane układy mikroprocesorowe są synchronizowane kilkoma fazami zegarowymi. Definicję dwufazowego cyklu zegara synchroninzującecgo pokazano na rys. 1.22a. Dwa przesunięte względem siebie impulsy zegarowe (φ1,φ2) określają jeden cykl zegarowy procesora - zwany również dwufazowym cyklem taktowania procesora. Na początku każdego cyklu maszynowego generowany jest impuls synchronizujący (SYNC) procesora. Czas trwania cyklu zegarowego nie jest zgodny z podaną definicją w trzech przypadkach wyjątkowych: w stanie oczekiwania (WAIT), w stanie trzymania (HOLD) i w stanie zatrzymania (HALT) pracy procesora, które opisano w dalszej części. 33 Liczba odwołań procesora do pamięci lub portu WE/WY określa minimalną liczbę cykli maszynowych rozkazu (wyjątkiem jest rozkaz DAD). Każdy rozkaz odwołuje się co najmniej raz do pamięci w celu pobrania jego kodu. Na przykład jednobajtowy rozkaz dodania zawartości rejestrów wewnętrznych procesora (ADD r) jest realizowany w jednym cyklu maszynowym. Pobrany rozkaz w pojedynczym słowie 8-bitowym zawiera kod rozkazu oraz adres rejestru, którego zawartość jest dodawana do bieżącej zawartości rejestru akumulatorowego (A). W trzech cyklach zegarowych odbywa się pobranie rozkazu, a w czwartym jego wykonanie. a) T1 T2 f1 f2 SYNC b) T1 T2 TW T3 T4 T5 f1 f2 A15 -0 zapis D 7- 0 odczyt SYNC READY WAIT DBIN dane WR informacja statusowa A15 -0 dla pamięci lub WE/WY D 7-0STATUS sprawdzenie READY,HOLD HALT dane HALT faza dodatkowa zapis lub odczyt faza dodatkowa wykonanie rozkazu Rys. 1.22. Przebiegi czasowe podstawowych sygnałów przykładowego procesora a) faza początkowa każdego cyklu maszynowego b) wybrane sygnały zewnętrzne i wewnętrzne w jednym cyklu maszynowym. Dodatkowe odwołanie do pamięci (dodatkowy cykl maszynowy) ma miejsce w przypadku rozkazu ADD M dla rejestru pamięciowego M. Rejestr pamięciowy (M) jest wskazywany w pamięci operacyjnej (ROM lub RAM) zawartościami rejestrów H i L. Do najdłuż- 34 szych rozkazów procesora 8080 można zaliczyć zapis zawartości rejestrów H i L do pamięci operacyjnej (rozkazem SHLD). Zawiera on pięć cykli maszynowych, w tym szesnaście cykli zegarowych. W rozkazach mikroprocesora można zanotować dziesięć różnych cykli maszynowych: (1) Pobranie - M1 (Fetch), (2) Czytaj pamięć (Memory Read), (3) Pisz do pamięci (Memory Write), (4) Czytaj stos (Stack Read), (5) Pisz do stosu (Stack Write), (6) Czytaj wejście (Input), (7) Pisz na wyjście (Otput), (8) Przerwij (Interrupt), (9) Zatrzymaj (Halt), (10) Zatrzymaj i Przerwij (Halt and Interrupt). Zaleznie od wykonywanego rozkazu wykonywana zostaję odpowiednia sekwencja cykli maszynowych. O stanie wewnętrznym procesora informuje słowo statusowe, które w opisywanym przykładzie jest generowane na magistrali danych, w cyklach zegarowych T1, T2 każdego cyklu maszynowego. Na rys. 1.22b pokazano przebiegi czasowe podstawowych sygnałów zewnętrznych i wewnętrznych w jednym cyklu maszynowym procesora. W cyklu T1 procesor wystawia na linie adresowe wektor lokacji źródła lub miejsca przeznaczenia informacji w pamięci lub w portach WE/WY. Na magistralę danych (D0 - D7) jest przekazywana informacja statusowa o aktualnie wykonywanym cyklu maszynowym. W cyklu T2 badane są wartości sygnałów sterujących: zewnętrzny sygnał Ready - gotowość źródła lub odbiornika informacji, zewnętrzny sygnał HOLD - żądania trzymanie, tzn. odłączenia procesora od magistral komputera oraz wewnętrzny sygnał HALT - zatrzymania pracy procesora odpowiadający rozkazowi HLT. Gdy dane nie są gotowe do odczytu, procesor zawiesza operację transmisji, a kolejne takty zegarowe nie są numerowane (na rysunku oznaczone przez Tw - stan oczekiwania (wait)). Jednocześnie w takt impulsu φ2 badana jest wartość sygnału gotowości danych (Ready); gdy Ready = H cykl maszynowy jest kontynuowany (pokazane także na rys. 1.17). Na rys. 1.22b pokazano również fazę wyprowadzania danych na przewody D0 - D7 opadającym zboczem sygnału WR. Ustalona wartość danych może zostać odczytana w cyklu 35 zegarowym T3. Przebieg dalszej część cyklu maszynowego (T4 ,T5) zależy od rodzaju rozkazu. Ważnym sygnałem sterującym pracą procesora jest INT, czyli sygnał żądania przerwania bieżącej pracy procesora w celu podjęcia realizacji zadania ważniejszego. Na rys.1.23 pokazano przebiegi czasowe podstawowych sygnałów procesora przed podjęciem realizacji programu o wyższym priorytecie. Na rysunku wyróżniono trzy cykle maszynowe (M1 - M3) procedury obsługi żądania przerwania oraz ostatni cykl zegarowy (T3) w rozkazie, po którym przerwanie programu zostanie wykonane. Ponieważ program przerywający może zawierać takie same rozkazy, jak program przerwany, musimy założyć, że wszystkie układy wewnętrzne procesora zostaną zapełnione nowymi danymi. Jak już wiadomo, cykl rozkazowy rozpoczyna operacja pobrania rozkazu, potem następuje jego zdekodowanie, i wykonanie. Nie jest zatem możliwe zawieszenie realizacji cyklu rozkazowego przed jego zakończeniem, w przypadku, gdy program przerywający może ingerować w zawartości wszystkich rejestrów wewnętrznych. Z tego względu procesor został wyposażony w mechanizm zabezpieczenia miejsca przerwania, umożliwiający kontynuację programu przerwanego po wykonaniu procedur związanych z obsługą żądania przerwania. Dyskusję obsługi żądania przerwania ilustruje rys.1.23, którą rozpoczyna analiza poziomu sygnału INTE (INTerrupt Enable - przerwanie dozwolone). Wartość wysoka tego sygnału pojawia się w czasie jednego cyklu zegarowego w określonych okolicznościach, które warunkowane są kilkoma elementami: 1. Procesor ustawia INTE = H po zakończeniu rozkazu poprzedniego, a przed podjęciem rozkazu następnego. 2. INTE = L (nieaktywne), jeśli zakończony został rozkaz poprzedni występujący w programie przerywającym. Innymi słowy INTE = H po zakończeniu rozkazu jest ustawiane tylko w programie głównym. 3. Przerzutnik warunku INTE = H zostaje wyzerowany (INTE = L) po uruchomieniu programu przerywającego. Można go odblokować programowo rozkazem EI (Enable Interrupt - przerwanie dozwolone). Po takim rozkazie INTE = H jest ustawiane tak samo jak w programie głównym. 4. INTE = H zostaje wyzerowane i zablokowane programowo rozkazem DI (Disable Interrupt - przerwanie zakazane, nieaktywne). 36 Jeśli mechanizm wystawiania INTE = H jest aktywny, zewnętrzne żądanie przerwania INT = H oczekuje zezwolenia na przerwanie. Zgodność poziomów wysokich na liniach: żądania przerwania INT i zezwolenia na przerwanie INTE ustawia wartość wysoką na wewnętrznym przerzutniku przerwań - INT F/F = H, który steruje dalszym przebiegiem obsługi przerwania. W trakcie realizacji programu zawartość licznika rozkazów podlega modyfikacji i wpisywane są do niego kolejne adresy sekwencji rozkazów. Podjęcie żądania przerwania uruchamia procedurę przerywającą, opisaną przebiegami czasowymi na rys.1.23. Zostaje ona wtrącona pomiędzy program główny a program przerywający. M1 T3 T1 T2 T3 T4 T5 T1 M2 T2 T3 T1 M3 T2 T3 f1 f2 A1 5- 0 D 7- 0 PC1 SP 1 PC RST D0 SP 2 PC H PC L (INTA) SYNC DBIN WR RM1 INTE INT INT F/F NIPC STATUS 8 5 5 Rys. 1.23. Przebiegi czasowe podstawowych sygnałów przykładowego procesora dla obsługi INT=H W takcie T2 cyklu maszynowego M1 zostaje zablokowany licznik rozkazów, którego zawartość ma być odłożona na stos. Jest to cecha programu, wykorzystywana do jego restartu po zakończeniu obsługi żądania przerwania. Na rys.1.21 pokazano sygnał INTA wyróżniony linią przerywaną i nawiasami, co oznacza, że nie jest on bezpośrednio dostępny na wyprowadzeniach procesora. Natomiast zaznaczony na rys.1.23 status 8 oznacza zezwolenie procesora na przerwanie, które jest reprezentowane bitem D0 = INTA w słowie statusowym (D0 - D7). 37 Sygnały słowa statusowego wraz z sygnałami jednostki sterującej procesora określają zasady jego współdziałania z otoczeniem. W tab.1.2 przedstawiono opis wektorów statusowych dla dziesięciu, wyróżnionych w pracy przykładowego procesora (8080), cykli maszynowych. Tablica 1.2 Wektory statusowe przykładowego procesora D0 D1 D5 D6 D7 INTA WO M1 INP MEMR (1) Pobranie - M1 0 1 0 0 0 1 0 1 (2) Czytaj pamięć 0 1 0 0 0 0 0 1 (3) Pisz do pamięci 0 0 0 0 0 0 0 0 (4) Czytaj stos 0 1 1 0 0 0 0 1 (5) Pisz do stosu 0 0 1 0 0 0 0 0 (6) Czytaj wejście 0 1 0 0 0 0 1 0 (7) Pisz na wyjście 0 0 0 0 1 0 0 0 (8) Przerwij 1 1 0 0 0 1 0 0 (9) Zatrzymaj 0 1 0 1 0 0 0 1 (10) Zatrzymaj i Przerwij 1 1 0 1 0 1 0 0 SŁOWO STATUSOWE CYKL MASZYNOWY D2 D3 D4 STACK HLTA OUT Większość sygnałów dostępnych w słowie statusowym ma oczywiste znaczenie. Co najmniej dwa z nich (WO i INP) są definiowane pośrednio. Niska wartość zmiennej WO oznacza wyprowadzanie danych z procesora do pamięci lub portu urządzenia zewnętrznego komputera. Wartość wysoka sygnalizuje operacje przesyłania danych w drugim kierunku. INP = H oznacza, że magistrala adresowa zawiera adres portu danych urządzenia wejściowego. Jeśli do urządzenia wystawiającego sygnał INT = H, zostanie przekazana informacja D0 = H (INTA aktywne), do procesora musi być podany wektor danych umożliwiający zlokalizowanie programu obsługi tego żądania. W cyklu zegarowym T3 zaznaczono kod rozkazu restartu RST, który czyta procesor za pomocą magistrali danych (DBIN = H - Data Bus In). Odłożenie zawartości 16-bitowego licznika programu (PC) na stos odbywa się poprzez 8-bitową magistralę danych w dwóch 38 krokach: starszy bajt adresowy (PCH) a następnie młodszy bajt (PCL). Zapis odbywa się opadającym zboczem sygnału WR - pisz. Kolejne lokacje komórek stosu wskazuje zawartość rejestru wskaźnika stosu: odpowiednio SP-1 i SP-2. Jednocześnie z impulsem synchronizującym SYNC na magistrali danych wystawiane jest słowo statusowe. Przekazywanie zawartości licznika programu na stos sygnalizowane jest statusem nr 5 - pisz do stosu. Na szczególną uwagę zasługuje sygnał INTE, który nie przyjmuje wysokiej wartości mimo zakończenia cyklu rozkazowego (M3). Powrót do cyklu pobrania sygnalizowany przez wysoką wartość wewnętrznego sygnału RM1 (odpowiednik D6 = M1 w słowie statusowym). Sygnał INTE zostaje zablokowany na wartości niskiej przez cały czas trwania obsługi przerwania (INTE = L), umożliwiając w ten sposób zakończenie procedur przerywających. Można również spowodować, że w trakcie obsługi żądania przerywania sygnał zezwolenia na przerwanie będzie wystawiany (INTE = H). W tym celu należy użyć rozkaz EI zezwolenia na przerwanie. W dowolnym miejscu programu można również użyć rozkazu DI przerwanie nieaktywne, co jest równoznaczne z programowym ustawieniem wartości INTE = L. Omówione zasady obsługi żądania przerwania obowiązują również w innych procesorach 8-bitowych oraz w większości procesorów 16-bitowych. Sekwencja operacji zilustrowanych przebiegami czasowymi na rys. 1.23 jest realizowana automatycznie przez procesor przed podjęciem programu związanego z wykonaniem procedur przerywających. Zamiast rozkazu RST - restart po sygnale INT można zastosować rozkaz wywołania CALL. Kod tego rozkazu wystawia urządzenie żądające przerwanie, a wtedy procesor zapyta o adres lokacji pamięci zawierającej program jego obsługi, do którego odwołuje się kod rozkazu CALL. Jest to metoda wywołania procedur przerywających z pełną adresacją restartu, która została szczegółowo omówiona w dalszej części podręcznika przy okazji opisu zasad działania sterownika priorytetów przerwań. Innym sposobem wywołania adresu restartu po przerwaniu jest stała jego lokacja. Jeśli na takim przewodzie żądania przerwania pojawi się sygnał aktywny, to obsługa programu dla tego przerwania rozpoczyna się zawsze od tej samej lokacji pamięci (stały adres). Współczesne mikroprocesory są również wyposażone w mechanizmy przesyłu danych do pamięci i ich odczytu z pamięci operacyjnej z pominięciem procesora. Jest to tzw. bezpośredni dostęp do pamięci (DMA - Direct Memory Access). Do jednostki sterującej omawianego procesora podłączono dwie linie sterujące: HOLD i HOLDA. Jeśli linia wejściowa HOLD = H, do procesora zostaje przekazane żądanie trzymania. Jest ono równoznaczne z ustawieniem linii adresowych procesora, linii danych oraz linii pisz/czytaj w trzeci stan, czyli stan 39 wysokiej impedancji. Na rys. 1.24 pokazano przebiegi czasowe wybranych sygnałów procesora ilustrujące zasady pracy procesora w trybie DMA. Procedurę przejścia do stanu trzymania rozpoczyna żądanie trzymania sygnałem HOLD Request. Ponieważ elementy wewnętrzne procesora nie biorą udziału w procesie transmisji danych w trybie DMA, trzymanie może być podjęte w trakcie realizacji cyklu rozkazowego - przed jego zakończeniem. Odłączenie procesora od magistral zostaje poprzedzone badaniem gotowości danych do transmisji sprawdzeniem, czy READY = H. Jeśli ten warunek jest spełniony procesor wystawia HLDA = H, potwierdzając tym samym przejście do stanu trzymania. T1 T2 Tw Mn T3 Mn +1 (T4)* (T5)* T T1 T2 lub f1 f2 A1 5- 0 zmienne D 7- 0 żądanie HOLD HOLD READY HOLD F/F HLDA Rys 1.24. Przebiegi czasowe podstawowych sygnałów przykładowego procesora dla obsługi HOLD=H Linie adresowe i linie danych są sterowane za pośrednictwem specjalizowanego elementu przepisującego dane ze źródła informacji do jej odbiornika (sterownik DMA). Proces bezpośredniej transmisji kończy poziom niski na linii HOLD żądania trybu DMA. Wzajemne zależności opisanych wyżej zasad realizacji cyklu rozkazowego mikroprocesora ilustruje sieć działań na rys. 1.25, na którym pokazano jeden cykl maszynowy procesora, zawierający od trzech do pięciu taktów zegarowych. Cykl maszynowy rozpoczęto stanem wyzerowania procesora - RESET = H. W cyklu T2 jest badany stan dwóch sygnałów: zewnętrznego READY i wewnętrznego HLTA. Sygnał READY = L oznacza zatrzymanie pracy procesora w oczekiwaniu na dane do transmisji. 40 Zatrzymanie pracy procesora może również spowodować rozkaz HLT (HALT - zatrzymanie). Jeśli procesor rozpozna rozkaz HLT ustawia wewnętrzny przerzutnik zatrzymania w stan HLTA = H. Jeśli jest aktywne READY lub HLTA, procesor ustanawia stan oczekiwania, Tw (czekaj) lub TwH (czekaj w stanie HLT). Jeśli zostanie zakończone oczekiwanie (Tw) badany jest stan sygnału HOLD. Jeśli HOLD = H, następuje przejście do stanu trzymania i transmisji danych poza tą siecią działań. Gdy HOLD zmieni wartość na nieaktywną, rozkaz zostanie dokończony. W zakończeniu cyklu maszynowego badany jest stan realizacji cyklu rozkazowego czy rozkaz został zakończony. Jeśli nie został wykonany ostatni krok w cyklu rozkazowym jest realizowany następny cykl maszynowy. Gdy procesor wykonał ostatni cykl maszynowy w cyklu rozkazowym, wystawiony zostaje INTE = H i badany jest stan jego jednoczesności z INT = H. Zgodność tych dwóch sygnałów oznacza podjęcie nowego cyklu rozkazowego w programie obsługi żądania przerwania. Przy aktywnym HLTA procesor wchodzi w stan zawieszenia (TwH), z którego można wyjść tylko przez przerwanie. W ten sposób działa większość programów zawierających szereg opcji wybieranych alternatywnie z MENU użytkownika. Zakończenie jednego z programów kończy przejście do stanu oczekiwania na kolejne wywołanie (przerwanie) z pulpitu operatora. W stanie HALT można oczywiście przejść do trybu DMA, a po jego zamknięciu nastąpi powrót do zatrzymania - HALT. Omówione zasady współdziałania bloków mikroprocesora oraz relacje czasów wykonania podstawowych procedur nie wyjaśniają wszystkich mechanizmów działania systemów mikroprocesorowych. Jest to jedynie opis reakcji procesora na stany aktywne trzech podstawowych sygnałów: żądania przerwania (INT), żądania trzymania (DMA) oraz badania stanu gotowości danych (Ready) do transmisji. Zasady wykorzystania mechanizmów przerwań w procesorach można zaliczyć do elementów kluczowych metod projektowania oprogramowania użytkowego i oprogramowania systemowego. Użytkownik oprogramowania często korzysta z przerwań procesora, nie zdając sobie sprawy z tego faktu. Miarą jakości procesora jest zwykle poziom rozbudowania systemu przerwań. 41 RESET T1 READY+HLTA T2 READY HLTA TAK HLTA HOLD INTA NIE READY Tw READY INT INTE Tw H HOLD HOLD TAK SET HOLD F/F SET HOLD F/F T3 T4 HOLD faza HOLD HOLD T5 RESET HOLD F/F HOLD F/F SET TAK NIE NIE RESET HLTA ROZKAZ WYKONANY TAK NIE HOLD INT INTE TAK RESET HOLD F/F SET INT F/F Rys. 1.25. Sieć działań przykładowego mikroprocesora 8-bitowego. 42 1.5. Techniki adresacji ___________________________________________________________ Program pracy komputera jest zapisany w postaci ciągu wektorów binarnych zapisanych („ulokowanych”) w pamięci wewnętrznej lub zewnętrznej procesora, czy komputera. Jest to ciąg wektorów binarnych, zwanych rozkazami, kodujących operacje na danych binarnych. Zasady uporządkowania programu regulują formaty rozkazów oraz mechanizmy procesora realizacji rozkazów, określające zasady dostępu do wektorów zapisanych w pamięci operacyjnej. Dla bardziej komunikatywnego zapisu kodów binarnych programu maszynowego stosuje się zapis szesnastkowy, zwany również heksadecymalnym (hexadecimal). Heksadecymalne odpowiedniki kodu binarnego przedstawiono w tab. 1. 3. Tablica 1.3 Zapis szesnastkowy kodu binarnego Kod binarny 0000 0001 0010 0011 0100 0101 0110 0111 Kod szesnastkowy 0 1 2 3 4 5 6 7 Kod binarny 1000 1001 1010 1011 1100 1101 1110 1111 Kod szesnastkowy 8 9 A B C D E F Dane do operacji są zawarte w pamięci operacyjnej, w rejestrach otaczających procesor lub buforach pośredniczących (sprzęgających) usytuowanych między procesorem i urzą- 43 dzeniami WE/WY. Lokację wektorów binarnych definiuje się za pomocą określonych kombinacji wartości zmiennych adresowych, a długość słowa adresowego określa liczbę adresowanych komórek informacji. Najprostsza deklaracja bieżącego adresu polega na podaniu w programie wartości wszystkich bitów adresu. Jest to jednak sposób najkosztowniejszy ponieważ zajmuje najwięcej pamięci operacyjnej a czas realizacji takiego programu jest najdłuższy. W celu skrócenia zapisu procedur adresacji wprowadzono metody pośredniego określania adresu bieżącego operandu. W procesorach 8-bitowych zastosowano kilka metod określania adresów, z których korzystają również procesory bardziej zaawansowane (16-, 32- i 64bitowe). Niemniej każda nowa generacja procesorów wnosi nowe sposoby określania adresów. Są to celowe zabiegi producentów układów elektronicznych i producentów oprogramowania czynione w celu przyspieszenia realizacji procedur przetwarzających komputera. W procesorach 8-bitowych można wyróżnić następujące metody adresacji wektorów binarnych (komórek pamięci lub rejestrów): • adresacja bezpośrednia, • adresacja natychmiastowa, • adresacja pośrednia, • adresacja indeksowana, Adresacja bezpośrednia Adresacja bezpośrednia (direct addressinig) polega na podaniu pełnego adresu operandu bezpośrednio w programie. Jest on bezpośrednim identyfikatorem lokacji komórki pamięci lub rejestru komputera. Na rys 1.26 pokazano przesunięcie danych między rejestrami wewnętrznymi procesora. BC 1 11 10 0 00 11 11 00 00 D E 1 01 01 0 10 10 10 10 10 H L 0 00 01 1 11 00 00 11 11 1 01 01 01 0 A M O V A ,D przesu n ię cie do A za w a rtości D Rys. 1.26. Przykład adresacji bezpośredniej, przesunięcia danych z rejestru D do rejestru A. Rozkaz MOV (przesuń) oznacza przesunięcie danych z jednej lokacji pamięci do drugiej; z rejestru D do rejestru akumulatorowego A. Podobnie jest realizowane przesunięcie 44 danych między dowolnymi rejestrami wewnętrznymi. Na rys. 1.27 pokazany został inny przykład adresacji bezpośredniej przesyłu danych z pamięci do rejestru akumulatorowego. PAO 0041 H 01010101 0042 H 00001111 0043 H 11110000 LDA 0044 H 11001100 16-bitowy adres wskazuje komórkę pamięci: 0042H 0045 H 11111111 kopiowanie 00001111 A 0042H ; adresy Rys. 1.27. Przykład adresacji bezpośredniej komórki pamięci. Adresacja natychmiastowa Umieszczenie danych w komórce pamięci następującej po kodzie operacji jest nazywane adresacją natychmiastową (immediate addressing). To znaczy, w polu operandu występującym po kodzie operacji zapisane są dane dla tej operacji. Jest to najprostszy sposób adresacji operandów polegający na ich zapisie bezpośrednio w ciągu wektorów binarnych programu. Rozkaz MVI r dokonuje przesunięcia bajtu danych z pamięci do wskazanego rejestru r. Zasadę realizacji tego trybu adresacji ilustruje przykład na rys. 1.28. PAO MVI A,D2H; 0042 H 00111110 0043 H 11000010 0044 H A 11000010 przesunięcie do rejestru A adresy Rys. 1.28. Przykład operacji przesunięcia drugiego bajtu do akumulatora Adresacja pośrednia Adresacja pośrednia (indirect addressing) dla procesorów 8-bitowych, polega na wskazywaniu lokacji operandu za pomocą zawartości określonego rejestru wewnętrznego 45 procesora (rys. 1.29). Szczególnym przypadkiem rozkazu przesunięć jest MOV M. Dotyczy on przesunięcia zawartości dowolnego rejestru wewnętrznego procesora do rejestru (M) w pamięci operacyjnej, lokalizowanego zawartością pary rejestrów H, L. Rejestry H i L po uprzednim załadowaniu spełniają funkcję wskaźnika adresu pośredniego komórki pamięci, do której przesuwamy zawartość wskazanego rejestru. zawartość rejestru A po wykonaniu operacji PAO 00001111 A 0042 H 00001111 0043 H 11110000 00000000 01000010 H,L MOV A,[HL] ; adresy Rys. 1.29. Przykład adresacji pośredniej zawartością HL wskazanego rejestru procesora. Adresacja indeksowana Adres indeksowany lub indeksowy (indexed addressing) obliczamy jako sumę podanego w rozkazie adresu (adr) i zawartości rejestru indeksowego RI, np: MOV r, adr[RI] ; oznacza wpisanie do rejestru r zawartości komórki pamięci adresowanej sumą adresu adr i [RI]. Na rys. 1.30 podano przykład adresacji indeksowanej z indeksem [RI]=3 dla transferu danych z komórki pamięci o adresie 44H do rejestru wewnętrznego r. 46 PAO 0041H 01010101 0042H 00001111 0043H 11110000 0044H 11001100 0045H 11111111 adr 11001100 r 00000011 RI MOV r, adr[RI] ; adresy adr=0041H+[RI]=44H [RI] = 3H Rys. 1.30. Przykład adresacji indeksowanej dla transmisji danych z pamięci do rejestru procesora. Ten tryb adresacji zaprojektowano tylko w jednym procesorze 8-bitowym Z80 firmy Zilog. Oprócz wymienionych czterech podstawowych trybów adresacji spotykamy różne kombinacje tych technik. Na przykład w mikroprocesorach firmy Intel można spotkać kombinację adresacji pośredniej z indeksowaną. W tym celu procesor wyposażono w specjalny rejestr bazowy BP (Base Pointer) - wskaźnik bazy. Różnorodność użytych trybów adresacji poprawia efektywność obliczeń komputera i zmniejsza zajętość pamięci operacyjnej. Przykładem 8-bitowego procesora bardziej sprawnego jest Z80. Dzięki bogatej liście rozkazów i dziesięciu różnych trybów adresacji wprawny programista może uzyskać program zajmujący o 40% pamięci mniej niż program opracowany dla procesorów 8080 czy 8085 firmy Intel. 47 1.6. Autokod procesorów 8-bitowych ___________________________________________________________ Pisanie programu na poziomie wektorów binarnych nazywamy kodowaniem programu. Program realizowany binarnie w takt zegara mikroprocesora jest nazywany mikroprogramem albo ciągiem mikrooperacji. Program zapisany w formie binarnej (kod maszynowy programu) jest budowany w oparciu o listę rozkazów procesora. Kody binarne programu zostają przetworzone na ciąg mikrooperacji procesora. Każdy z procesorów ma własną listą kodów operacji zwaną autokodem, stąd zapis programu w formie binarnej będzie inny dla każdego procesora. Większość procesorów 8-bitowych operuje 16-bitowym słowem adresowym (A0-A15) i 8-bitową magistralą danych (D0-D7). Informacja binarna jest umieszczona w zewnętrznej pamięci operacyjnej lub w rejestrach wewnętrznych mikroprocesora. Listę rozkazów mikroprocesorów 8080/85 można podzieli na cztery zasadnicze grupy: • rozkazy przesyłań danych, • rozkazy arytmetyczno - logiczne, • rozkazy rozwidleń i wywołań, • rozkazy wejściowo-wyjściowe i sterujące. Oznaczenia: rl, r2, r - rejestry A, B, C, ..., L; DDD - bity kodu rejestru przeznaczenia (D - destination), 48 S S S - bity rejestru źródłowego (S - source). Kody binarne rejestrów D i S przedstawiono w tab. 1.4 a). Rejestr M (memory) jest lokalizowany w pamięci operacyjnej pod adresem wskazywanym przez zawartość pary rejestrów HL. Rozkazy dla operandów 16-bitowych wykorzystują pary rejestrów, kodowanych zgodnie z zapisem tabl. 1.4 b). Tablica 1.4 Kody rejestrów wewnętrznych procesora a). DDD lub SSS 111 000 001 010 011 100 101 110 b). Rejestr RP Rejestr A B C D E H L (M) 00 01 10 11 B, C D, E H,L S, P Przez RP oznaczono kody pary rejestrów wewnętrznych procesora. Każdy rozkaz składa się z kodu oraz operandów, na których operacja jest wykonywany. Jest on kodowany pierwszymi bitami bajtu. Bajty następne, związane z rozkazem, definiują adres operandu. Zapis binarny programu, jest formą czytaną bezpośrednio przez procesor, jednak kod tak zapisanego programu pozostaje nieczytelny dla programisty. Aby ułatwić zapisu i analizę programu, wprowadzono formy symboliczne rozkazów. Kod heksadecymalny był pierwszym etapem formalizacji zapisu. Dalszym ułatwieniem dla programisty było wprowadzenie zapisów symbolicznych używających pewnych znaków mnemonicznych, jak MOV r1,r2 - oznaczające przesunięcie zawartości rejestru r2 do rejestru r1, LDA adr jest operacją załadowania zawartości akumulatora do komórki pamięci pod wskazanym adresem (adr). Język programowania na poziomie adresów symbolicznych nazwano językiem asemblera lub językiem kodów mnemonicznych procesora. Pisanie programów na tym poziomie nazywamy kodowaniem programu lub programowaniem w autokodzie maszyny. W trakcie objaśniania funkcji i zasad realizacji rozkazów maszynowych można spotkać pewne formy zapisu umownego (symbolicznego), w którym używa się następujących skrótów: A - rejestr akumulatora, adr - 16-bitowy adres, dane - 8-bitowe dane, dane 16 - 16-bitowe dane, 49 bajt 2, bajt 3 - drugi, trzeci bajt rozkazu, port - 8-bitowy adres rejestru WE/WY, rh - rejestr przyjmujący lub zawierający starszy bajt informacji, rl - rejestr przyjmujący lub zawierający młodszy bajt informacji, SP - wskaźnik stosu, PC - licznik programu, CY - przeniesienie, pożyczka, ← - przesłanie, rp/RP - oznaczenie stwierdzające, że rozkaz dotyczy pary rejestrów mikroprocesora, (R) - zawartość rejestru R, [R] - zawartość komórki pamięci wskazywana zawartością R. Formaty rozkazów W zapisie rozkazów mikroprocesorów posłużono się pewnymi regułami, których poznanie znacznie ułatwia operowanie autokodem. A. Przesył danych MOV dotyczy przesyłu danych między dwoma wskazanymi rejestrami. Zapis: Działanie: MOV r1, r2 r1: r1←(r2) - jest zapisem przesyłania zawartości rejestru r2 do rejestru r1. Format: 01 DDD SSS Kod: W miejsce bitów D i S podstawiamy wartości kodujące odpowiednie rejestry źródła i przeznaczenia danych (tabl.1.4a)) i na tej podstawie wyznaczamy wartość binarną lub heksadecymalną kodu rozkazu. Np.: przesłanie A←(B) zapiszemy binarnie: 01111000 lub heksadecymalnie 78H. MVI Dotyczy przesłania danych zawartych w drugim bajcie instrukcji do wskazanego rejestru. Zapis: MVI r, dane Działanie: r←dane - oznacza przesłanie drugiego bajtu rozkazu do, wskazanego kodem rozkazu, rejestru. 50 Format: Kod: 00 DDD dane 110 W miejsce D wstawiamy kod rejestrów przeznaczenia i na tej podstawie wyznaczamy wartość binarną lub heksadecymalną kodu rozkazu. Np. przesłanie bajtu danych do rejestru B można zapisać binarnie: 00 000 110 lub heksadecymalnie: 06H. LXI Dotyczy przesyłu danych zawartych w drugim i trzecim bajcie do pary rejestrów wskazanych rozkazem. Zapis: LXI rp, dane 16 Działanie: RP ← dane 16 oznacza przesył dwóch, następujących po bajcie kodu rozkazu, bajtów danych do zadanej pary rejestrów. Format: Kod: 00 RP 0001 dane - młodszy bajt dane - starszy bajt W miejsce RP wstawiamy kod pary rejestrów przeznaczenia danych (tabl.1.4 b). Np. przesył B, C ←dane 16 zapisujemy binarnie: 00000001 lub heksadecymalnie: 01H. LDA Dotyczy przesył danych do akumulatora, zawartych w komórce pamięci lokalizowanej drugim i trzecim bajtem Zapis: LDA adr Działanie: A←((bajt 3), (bajt 2)), Format: 00111010 Kod: Jest to rozkaz o stałym kodzie 3AH. Operacje przesyłu danych do komórki pamięci lokalizowanej adresem zadanym zawartością pary rejestrów ((RP)) wyrażają rozkazy przedstawione w tabl. 1.5. Zawartości rejestrów wyszczególnionych z prawej strony są wpisywane do komórek pamięci wskazywanych zawartościami rejestrów umieszczonych w kwadratowych nawiasach [ ]. Załadowanie rejestrów zawartością komórek pamięci wskazywanych zawartościami wskazywanych rejestrów odbywa się za pośrednictwem grupy rozkazów przedstawionych w tabl. 1.6. Tablica 1.5. Adresacja parą rejestrów, transmisja do pamięci 51 Rozkaz STAXB STAD SHLD adr Kod H 02 12 22 32 STA adr Operacje [B, C]←(A) [D, E]←(A) [bajt 3, bajt 2 ]←(L) [(bajt 3, bajt 2)+1]←(H) [bajt 3, bajt 2]←(A) Tablica 1.6. Adresacja parą rejestrów, transmisja do rejestru Rozkaz LDAXB LDAXD Kod H 0A 1A LHLD adr LDA adr XCHG Operacje A ←[B, C] A ←[D, E] L ←[bajt 3, bajt 2] 2A 3A H ←[(bajt 3, bajt 2)+1] A ←[bajt 3, bajt 2] Dotyczy wymiany zawartości między rejestrami H, L i D, E (odpowiednio) Zapis: XCHG Działanie (HL) ↔ (DE), wymiana informacji, Format: Kod: 11101011 Rozkaz o stałym kodzie - EBH B. Rozkazy arytmetyczne Większość mikroprocesorów 8-bitowych wykonuje tylko cztery operacje arytmetyczne: - dodawanie (ADD, ADC, DAD), - odejmowanie (SUB, SBB), - zwiększenie zawartości rejestru (INR, INX), - zmniejszenie zawartości rejestru (DCR, DCX). ADD Oznacza dodanie do zawartości akumulatora zawartości wskazanego rejestru (r), gdzie r jest lokalizowany kodem bitów S. 52 Zapis: ADD r Działanie: A ←(A) + (r), akumulacja danych. Format: 10000 SSS Kod: W miejsce S wstawiamy wartości odpowiadające odpowiednim rejestrom źródła informacji, wtedy: r B kod H 80 ADC C D E H L M A 81 82 83 84 85 86 87 Oznacza dodanie do zawartości akumulatora (A) zawartości wskazanego rejestru (r) i bitu przeniesienia (CY). Rejestr r jest lokalizowany kodem bitów S. Zapis: ADC r Działanie: A ←(A) + (r)+ (CY) Format: 10001 Kod: W miejsce S wstawiamy wartości odpowiadające odpowiednim SSS rejestrom źródła informacji r B kod H 88 ACI C D E H L 89 8A 8B 8C 8D M A 8E 8F Oznacza dodanie do zawartości akumulatora zawartości drugiego bajtu następującego po kodzie rozkazu. Do pozycji najmłodszej dodawany jest bit przeniesienia (CY). Zapis: ACI dane Działanie: A ← (A) + (bajt 2) + (CY), gdzie dane = bajt 2 Format: 11001110 dane Jest to rozkaz o stałym kodzie - CEH Kod: DAD Oznacza dodanie do rejestrów H i L zawartości wskazanej pary rejestrów Zapis: DAD rp Działanie: H, L ← (H,L) + (rp) Format: Kod: 00 RP 1001 Para rejestrów jest lokalizowana kodem bitów RP. RP B D H SP kod H 09 19 29 39 SUB Oznacza odejmowanie od zawartości akumulatora zawartości wskazanego rejestru Zapis: SUB r 53 Działanie: Format: Kod: A ← (A) - (r). 10010 SSS Rejestr r lokalizowany jest bitami S: r B C D E H kod H 90 91 92 93 L M A 94 95 96 97 Lokalizacja M w rozkazie SUB M jest taka sama jak w rozkazach INR M czy DCR M. SBB Oznacza odejmowanie od zawartości akumulatora zawartości wskazanego rejestru z uwzględnieniem pożyczki Zapis: SBB r Działanie: A ← (A) - (r) - (CY) Format: Kod: 10011 Rejestr r jest lokalizowany bitami S: r kod H INR SSS B C D E H L M A 98 99 9A 9B 9C 9D 9E 9F Oznacza zwiększenie zawartości wskazanego rejestru r o 1 Zapis: INR r Działanie: r ← (r) + 1. Format: Kod: 00 DDD 100 Rejestr r jest lokalizowany kodem bitów rejestrów przeznaczenia D: r B kod H 04 C D E H L M A 0C 14 1C 24 2C 34 3C Na uwagę zasługuje rozkaz INRM o kodzie 34H, w którym M jest rejestrem pamięci lokalizowanym zawartością pary rejestrów H i L. Operację tę zapisujemy: ((H, L))←((H, L))+1; co oznacza rozkaz zwiększenia o 1 zawartości komórki pamięci wskazywanej zawartością rejestrów HL. DCR Oznacza zmniejszenie zawartości wskazanego rejestru o 1 Zapis: DCR r Działanie: r ←(r)-1 Format: Kod: 00 DDD Rejestr r jest lokalizowany przez bity rejestrów przeznaczenia D: r kod H 54 101 B C D E H L M A 05 CD 15 1D 25 2D 35 3D INX Oznacza zwiększenie zawartości pary rejestrów o 1 Zapis: INX rp Działanie: rp ← (rp) + 1 Format: Kod: 00 RP Para rejestrów lokalizowana jest kodem RP: RP BC DE HL SP kod H DCX 1011 03 13 23 33 Oznacza zmniejszenie zawartości pary rejestrów lokalizowanej bitami RP rozkazu o 1. Zapis: DCX rp Działanie: rp ← (rp) - 1 Format: Kod: 00 RP RP kod H 1011 B D H 0B 1B 2B SP 3B Oprócz wymienionych operacji arytmetycznych dokonywanych na zawartościach akumulatora i wskazanych rejestrów r lub rp istnieje możliwość wykonania tych samych operacji na zawartościach akumulatora i bezpośrednio następującym po kodzie rozkazu bajcie danych. ADI Oznacza dodawanie do zawartości akumulatora drugiego bajtu rozkazu Zapis: ADI dane Działanie: A ← (A) + (bajt2) Format: Kod: 11000110 Jest to rozkaz o stałym kodzie: C6H. Podobnie działają trzy inne rozkazy arytmetyczne, jak: ACI dane - A ← (A) + (bajt 2) + (CY). Kod rozkazu: CEH. SUI dane - A ← (A) - (bajt 2). SBI dane - A ← (A) - (bajt 2) - (CY). Kod rozkazu: DEH. Kod rozkazu: 06H. C. Rozkazy dla operacji logicznych Omówione wyżej rozkazy oraz zasady ich tworzenia ilustrują zasady kodowania mikrooperacji przesyłu danych i wykonywania obliczeń arytmetycznych w procesorach 8bitowych. Te same reguły obowiązują przy kodowaniu operacji dla procesorów 16- czy 32- 55 bitowych. Różnica dotyczy możliwości ilościowych tych procesorów, o czym będzie mowa w kolejnych rozdziałach podręcznika. Jeśli przeanalizujemy zasady działania algorytmów obliczeń stwierdzimy obecność ogniw decyzyjnych. Następny krok będzie uzależniony od wyników przetwarzania w kroku poprzednim. Poniżej omówiono cztery podstawowe operacje logiczne i odpowiadające im rozkazy dla procesorów 8-bitowych, tj.: ANA, XRA, ORA i CMP, bardzo często współpracujących z rozkazami dla rozwidleń i wywołań warunkowych podprogramów. ANA Oznacza iloczyn logiczny zawartości akumulatora z zawartością wskazanego rejestru Zapis: ANA r Działanie: A ← (A) ∧ (r). Format: Kod: 10100 r SSS B C kod H A0 A1 XRA ... M A ... A6 A7 Oznacza sumę logiczną zawartości rejestru akumulatorowego i zawartości wskazanego rejestru Zapis: XRA r Działanie: A ← (A) ⊕ (r). Format: Kod: 10101 r SSS B C kod H A8 A9 ORA ... M A ... AE AF Oznacza sumę logiczną zawartości rejestru akumulatorowego i zawartości wskazanego rejestru: Zapis: ORA r Działanie: A ← (A) ∨ (r). Format: Kod: 10110 r SSS B kod H B0 CMP ... B1 ... M A B6 B7 Oznacza odjęcie zawartości wskazanego rejestru od zawartości akumulatora Zapis: 56 C CMP r Działanie: (A) - (r) przy nie zmienionej zawartości akumulatora. Równość porównywanych operandów sygnalizowana jest wartością 1 na bicie C rejestru flagowego. C = 1, gdy (A)<(r) Format: Kod: 10111 r SSS B C ... kod H B8 B9 ... M A BE BF Możliwe jest też wykonywania operacji logicznych na zawartości akumulatora i na zawartości drugiego bajtu rozkazu: ANI dane - A ← (A) ∧ (bajt 2). Kod rozkazu: E6H. XRI dane - A ← (A) ⊕ (bajt 2). Kod rozkazu: EEH. ORI dane - A ← (A) ∨ (bajt 2). Kod rozkazu: F6H. CPI dane - (A) - (bajt 2). Kod rozkazu: FEH. Zawartość akumulatora pozostaje bez zmian, a rezultat porównania sygnalizowany jest na bitach wskaźnikowych - Z i CY. D. Rozkazy dla rozgałęzień programów Rozgałęzienia programów oznaczają wybór wariantu obliczeń w punkcie decyzyjnym. Decyzja dla kroku następnego zależy od wyniku kroku poprzedniego. Tego typu operacje są wykonywane przy przetwarzaniu zadań numerycznych zapisanych w dowolnym języku programowania. Różnica polega jedynie na sposobie zapisu tego samego problemu. Rozgałęzienia programów stosuje się przy przejściach do realizacji podprogramów lub przy wyborze wariantu programu. Do tej grupy należą: skok (JMP), wywołania adresów (CALL), rozkaz powrotu (RET) i rozkaz restartu (RST). Wybór wariantu programu zależy od spełnienia określonych warunków. W szczególnym przypadku skok może być bezwarunkowy (JMP adr) zwany również skokiem z warunkiem zerowym. W rozkazach warunkowych procesor korzysta z informacji zawartej w rejestrze flagowym charakteryzującej wynik operacji poprzedniej. W rozkazach warunkowych procesorów 8-bitowych firmy Intel (oraz Zilog) badania rejestrów flagowych zakodowano na trzech bitach CCC zdefiniowanych w tabl. 1.7. JMP Oznacza bezwarunkowy skok do komórki pamięci adresowanej drugim i trzecim bajtem rozkazu. Zapis: JMP adr Działanie: PC←(bajt 3, bajt 2). 57 Format: 11000011 Kod: Rozkaz o stałym kodzie - C3H. Skoki warunkowe: JNZ, JZ, JNC, JC, JPO, JPE, JP i JM, o kodach odpowiednio: C2, CA, D2, DA, E2, EA, F2, FA. Odnoszą się one do warunków zakodowanych na bitach CCC zawartych w pierwszym bajcie rozkazu: Format rozkazów skoków : 11 CCC 010 bajt młodszy bajt starszy CALL Jest to rozkaz bezwarunkowy o podobnym działaniu jak skok JMP adr, z tym że w przypadku CALL następuje przekazanie do stosu zawartości licznika programu, czego nie wykonuje procesor w trakcie realizacji rozkazu JMP. Procesor wykonuje te same operacje jak przy żądaniu przerwania. Powrót z wywołanego podprogramu wykonuje jednobajtowy rozkaz RET, który zdejmuje ze stosu zawartość licznika programu z adresem komórki miejsca przerwania. Zapis: CALL adr Działanie: [SP]← (PCH ), [SP-1]← (PCL), PC ← (bajt 3, bajt 2), Format: Kod: 11001101 Jest to rozkaz o stałym kodzie CDH. Wywołania warunkowane: CNZ, CZ, CNC, CC, CPU, CPE, CP i CM o kodach odpowiednio: C4, CC, D4, DC, E4, EC, F4 i FC mają takie samo znaczenie jak odpowiednie skoki warunkowe z taką samą uwagą jak dla rozkazu CALL. RET Oznacza powrót bezwarunkowy do programu, którego adres jest określany przez zawartość rejestrów stosu, wskazywanych wskaźnikiem stosu. 58 Zapis: RET Działanie: (PCL) ← [SP] i (PCH ) ← [SP+1] Format: Kod: 11001001 Rozkaz o stałym kodzie - C9H. Powroty warunkowe: RNZ, RZ, RNC, RC, RPO, RPE, RP i RN, o kodach odpowiednio: C4, CC, D4, DC, E4, EC, F4, FC. Uwarunkowania powrotu są takie same jak dla poprzednio omówionych rozkazów warunkowych. Restart Obsługa żądania przerwania została omówiona przy okazji dyskusji zasad działania sygnałów sterujących mikroprocesora 8-bitowego. W wyniku potwierdzenia przyjęcia żądania INT (INTR) urządzenie które wysłało sygnał INT= H, otrzymuje sygnał INTA = H potwierdzający gotowość restartu procesora od komórki pamięci zawierającej początek procedury przerywającej. Lokacja tego restartu zostaje wskazana rozkazem RSTn, czytanym na magistrali danych procesora. Na rys 1.31 pokazano tablicę ośmiu restartów mikroprocesorów zastosowaną w procesorach 8-bitowych firmy Intel i firmy Zilog. W podobny sposób działa mechanizm obsługi restartów dla procesorów wyższej generacji (INT), dlatego temu zagadnieniu poświęcono nieco więcej uwagi. Rozkaz jest kodowany na pozycjach NNN, które określają osiem lokacji restartu, po osiem bajtów w każdym bloku. RST Oznacza programowe wywołanie jednej z ośmiu lokacji restartów (odpowienio do żądania przerwania sygnałem INT). Zapis: RSTn Działanie: ((SP)) ← (PCH ), ((SP-1)) ← (PCL), PCH←00H, PCL←(00NNN000) Format: 7 6 Kod: 5 4 3 2 1 0 1 1 N N N 1 1 1 RST 0 1 2 3 4 5 6 7 kod H C7 CF D7 DF E7 EF F7 FF Pozycje NNN kodu rozkazu RST określają osiem lokacji restartu. 59 Lokacja rejestru (w pamięci) RSTO O RST1 TRAP RST2 RST7,5 RST3 RST6,5 RST4 RST5,5 RST5 RST6 RST7 RST 8 16 24 32 36 40 44 48 52 56 60 Rys. 1.31. Tablica restartów procesorów 8-bitowych firmy Intel Na rys. 1.32 przedstawiono zasadę wywołania podprogramu przerywającego dla procesora 8-bitowego. PC pola dla RSTn RST C3 Adr L Adr H k k+ 1 k+ 2 Podprogram obsługi przerwania k+ 8 Rys. 1.32. Procedura wywołania podprogramu przerywającego E. Rozkazy specjalne Rozkazy specjalne są związane bezpośrednio z operacjami arytmetycznymi, choć nimi nie są. Do tej grupy można zaliczyć rozkazy: DAA, CMA, STC, CMC oraz RLC, RRC, RAL i RAR. DAA - zamiana operacji binarnych na dziesiętne. Kod rozkazu: 27H. CMA - dopełnienie zawartości akumulatora: A ← (A). Kod rozkazu: 2FH. - ustawienie bitu przeniesienie: CY ← 1. Kod rozkazu: 37H STC CMC - dopełnienie wartości bitu przeniesienia: CY← (CY). 60 Kod rozkazu: 3FH Przesunięcia zawartości akumulatora reprezentują następujące rozkazy: Rozkaz Kod H Operacje RLC 07 An+1← (An), A0 ← (A7), CY← (A7) RRC 0F An ← (An+1), A7 ← (A0), CY← (A0) RAL 17 An+1← (An), CY← (A7), A0 ← (CY) RAR 1F An ← (An+1), CY← (A0), A7 ← (CY) F. Rozkazy dla sterowań i urządzeń WE/WY Ta grupa rozkazów służy do obsługi urządzeń wejściowo-wyjściowych, obsługi stosu i rejestru flagowego. PUSH Oznacza przesłanie dwóch bajtów informacji do stosu adresowanego przez zawartości rejestru wskaźnika stosu SP pomniejszone odpowiednio 1 i o 2. Zapis: PUSH rp Działanie: ((SP) - 1) - starszy bajt, ((SP) - 2) - młodszy bajt, SP ← (SP) – 2 Format: 11 Kod: Kod pary rejestrów wyznaczają dwa bity RP. R P RP kod H POP 0101 B C5 D D5 H E5 PSW F5 Oznacza operację odwrotną do wywołanej przez instrukcję: PUSH rp. Zawartość dwóch bitów stosu zostaje przekazana do wskazanej kodem RP pary rejestrów. Zapis: POP rp Działanie: RP ← ((SP)) Format: 11 Kod: XHLT RP kod H R P B C1 0001 D D1 H E1 PSW F1 Dokonuje wymian zawartości pary rejestrów HL odpowiednio z ostatnimi zawartościami stosu. Zapis: XTHL Kod: E3H 61 SPHL Dokonuje przesłania zawartości rejestrów H i L do rejestru SP. Zapis: SPHL Kod: F9H. OUT Oznacza przesłanie bajtu informacji z akumulatora do zaadresowanego wyjścia. Port (rejestr) wyjściowy adresowany jest słowem 8-bitowym, następującym po bajcie kodu rozkazu. Zapis: OUT port Działanie: port ← (A) Format: 110 100 11 adres wyjścia Kod: D3H IN Oznacza przesłanie bajtu informacji ze wskazanego 8-bitowym słowem adresowym portu do rejestru akumulatorowego. Zapis: IN port Działanie: A ← (port). Format: 110 110 11 adres wejścia Kod: DI DBH. Oznacza zablokowanie systemu przerwań instrukcją DI procesora od chwili wprowadzenia do akumulatora kodu instrukcji do czasu odblokowania momentu systemu przerwań Kod: NOP FBH, jednobajtowy rozkaz o stałym kodzie. Oznacza brak operacji. Rozkaz umieszczany najczęściej przy korekcie programu jako wypełniacz w miejsce usuniętych rozkazów. Kod: HLT OCH. Jest rozkazem zatrzymywania realizacji programu, wywołując stan czekania TwH (oczekiwanie w stanie Halt). Wyjście z tego stanu jest możliwe tylko poprzez przerwanie (lub przez Reset). Kod: 62 76H, rozkaz o stałym kodzie. RIM Rozkaz obowiązujący dla procesora 8085. Jest to informacja statusowa ładowana do akumulatora relacjonująca możliwość obsługi restartów: RST 7,5 RST 6,5 oraz RST 5,5. Kod: 20H. Rozkaz o stałym kodzie RIM wprowadza do akumulatora bajt o następującym znaczeniu poszczególnych bitów: Bit 7 6 5 4 3 SID I7,5 I6,5 I5,5 IE 2 1 0 M7,5 M6,5 M5,5 maski dla przerwań, zezwolenie na przerwanie, zarejestrowane przerwania (nie zrealizowane), szeregowe wejście informacyjne. SID Przyjmuje wartość szeregowego sygnału wejściowego procesora o tej samej nazwie. Bit SID umożliwia szeregowe wprowadzanie informacji do procesora. I7,5/6,5/5,5 - reprezentuje żądania nie zrealizowanych przerwań - nie obsłużone ze względu na ich zamaskowanie. Linia RST 7,5 jest wyposażona w przerzutnik reagujący na zbocze sygnału przerywającego. Oznacza to zapamiętanie przerwania przemijającego. IE Jest sygnałem zezwolenia przerwania. Wartość 1 na tym bicie oznacza, że przerwania są możliwe, a wartość 0 oznacza, że obowiązują zadane maski przerwań. Warunek nie dotyczy przerwania TRAP. M7,5/6,5/5,5 reprezentują zadane maski przerwań. Wartość 1 na wybranym bicie oznacza, że odpowiednia pozycja RST jest maskowana. Maski przerwań są ustawiane rozkazem SIM. SIM Jest to rozkaz, który służy do ustawiania maski dla przerwań procesora 8085 RST 7,5 RST 6,5 i RST 5,5. Kod: 30H, rozkaz o stałym kodzie. Przed użyciem w programie rozkazu SIM należy ustawić wartości 1 na poszczególnych bitach akumulatora według następujących zasad: Bit 7 6 5 SOD SOE X 4 3 2 1 0 R 7,5 MSE M7,5 M6,5 M5,5 63 maski restartów zezwolenie na ustawienie maski zerowanie przerzutnika RST 7,5 zezwolenie na szeregowe wyprowadzenie danych wyjście szeregowe SOD Może być użyty do szeregowego wyprowadzania danych przewodem o tym samym oznaczeniu na przewodach zewnętrznych procesora (SOD). SOE Wartość 1 na pozycji SOE jest zezwoleniem na transmisję szeregową danych. R7,5 Wartość 1 na tej pozycji oznacza wyzerowanie przerzutnika żądania przerwania RST7,5 ustawianego dynamicznie narastającym zboczem żądania przerwania. Pozostałe wejścia przerwań są obsługiwane statycznie. MSE Ustawienie wartości 1 na tej pozycji oznacza zezwolenie (akceptację) na maskowanie restartów (przerwań). M7,5/6,5/5,5 Wartości 1 na tych pozycjach oznaczają maskowanie odpowiedniego restartu. Język symboli mnemonicznych Pomimo dużej szybkości wykonywania programu zapisanego binarnie język tego poziomu jest mało użyteczny dla programisty. Przyczyną tego jest skomplikowana forma zapisu, w której bardzo łatwo o pomyłkę. Dlatego nie używa się formy binarnej kodów maszynowych jako języka programowania. Dla wygody programisty opracowano bardziej przyjazne formy języka programowania; wzorowane na elementach języka naturalnego. Są nimi języki wysokiego poziomu programowania. Można jednak znaleźć wiele przykładów, gdzie niezbędne jest operowanie wektorem binarnym zapisywanym w rejestrze wewnętrznym procesora. Dlatego opracowano język bliski schematów wewnętrznych mikrokomputera, zwany językiem kodów mnemonicznych albo językiem asemblera. Programowanie na tym poziomie języka sprowadza się do wykonywania operacji binarnych, zapisanych w formie symboli mnemonicznych, dla przesłań międzyrejestrowych. 64 Kod mnemoniczny języków maszynowych zapisuje skrótem sens każdej operacji. MOV jest skrótem z języka angielskiego: move - przesuń lub prześlij. AND jest operacją logiczną dwóch operandów na bitach o tych samych numerach, LDA (od load - załaduj) na które składa się LD - ładuj i A - akumulator, OUT - wyjdź lub wyprowadź na wyjście (port) zewnętrzne, itp. Bywa jednak, że symbol mnemoniczny jakiegoś rozkazu ma mniej czytelne, a bardziej umowne znaczenie. Język asemblera operuje symbolami mnemonicznymi i operandami występującymi w określonej kolejności za kodami. Ponieważ procesor czyta tylko wektory binarne, każdy inny zapis programu musi być przetłumaczony do poziomu binarnego. Tłumaczenie takie odbywa się automatycznie, za pomocą programu (translatora) zwanego asemblerem. lub „ręcznie” przez programistę. Przykład programu zapisanego w języku asemblera przedstawiono poniżej. Jest to operacja załadowania akumulatora zawartością wskazanej adresem komórki pamięci oraz dodania do niej innego wektora binarnego : LDA 3000; (załaduj akumulator zawartością komórki pamięci o adresie 3000) MOV B, A; (przesuń do rejestru B zawartość akumulatora) LDA 4500; (załaduj akumulator zawartością komórki pamięci o adresie 4500) ADD B; STA (operacja (A) + (B)) 8000; (zapisz do pamięci wynik operacji - zawartość A) Przeanalizujmy zapis operacji załadowania zawartości komórki pod adresem 4011H: Symbol mnemoniczny. Adres operandu Komentarz ↓ ↓ ↓ TEST: LDA 4011H ; załaduj akumulator ↑ ↑ ↑ ↑ ↑ ↑ etykieta dwukropek średnik odstępy W zapisie asemblera można wyróżnić pewien charakterystyczny szyk (format) następujących po sobie danych. W formacie języka asemblera wyróżniono cztery pola, z tego dwa podstawowe: • pole kodu operacji, • pole operandów lub adresu, oraz dwa pola dodatkowe: • pole etykiety, • pole komentarza. Zasadniczy program jest zawarty pomiędzy znakiem dwukropka a znakiem średnika. 65 Pole kodu operacji zawiera mnemoniczny skrót operacji. Pole operandów zawiera jeden lub dwa operandy przedzielone przecinkami. Pole operandów dla niektórych rozkazów jest puste. Wartości zapisywane w tym polu mogą również wskazywać lokacje operandów (są adresami). Pole etykiety występuje przed znakiem dwukropka. Etykieta zaczyna się od litery a kończy dwukropkiem. Etykieta jest symbolicznym adresem komórki w której jest umieszczony kod binarny rozkazu/instrukcji, np: TEST - nazwa symboliczna linii programu. Pole komentarza jest tekstem pomijanym w wersji wynikowej programu. Komentarz ma ułatwić analizę programów napisanych - w trakcie ich uruchamiania lub modyfikacji w formie źródłowej (tekstowej). Pole komentarza zamyka znak zmiany linii (nowej linii). Tekst pojawiający się po znaku nowej linii (Enter) jest traktowane jako etykieta następnej linii programu. Mikroprocesory 8-bitowe są dziś stosowane wyłącznie w małych systemach rejestracji danych binarnych lub w prostych urządzeniach pomiarowo-sterujących. Jednak z uwagi na ich prostą architekturę i nieskomplikowane działanie ich dyskusja ma swoje uzasadnienie w walorach dydaktycznych. Ponieważ podręcznik jest zorientowany na rodzinę komputerów osobistych opracowanych przez firmę IBM większość wywodów na temat zasad działania komputerów nawiązuje do mikroprocesorów firmy Intel, montowanych w tych komputerach. Asembler jest translatorem zamieniającym zapis źródłowy programu na kody operacji w zapisie binarnym; zapis obiektu (procesora) zwany wersją "Object" programu. Loader jest translatorem zamieniającym zapis z kodu hexadecymalnego programu na zapis binarny. Zapis etykiety jest ciągiem znaków o ograniczonej długości, zwykle do 5-ciu, lub 6-ciu znaków. Pierwszy znak etykiety najczęściej jest literą. Zastrzeżone są również pewne znaki specjalne - zależnie od wersji asemblera. Jednak w każdym przypadku w pole etykiety zostaje wpisany, za pomocą asemblera, adres pierwszego bajtu programu w wersji object. Zaleca się używanie etykiet wyrażających sens logiczny operacji, ale różnych od nazw mnemonicznych rozkazów asemblera. Skoki wykorzystują pole etykiety, w którym zapisany jest adres powrotu do poprzednio realizowanego fragmentu programu lub adres specjalnej części programu podprogramu. 66 W zapisie źródłowym programu asemblera stosujemy szereg zapisów uzupełniających i upraszczających redakcję programu. Są to pseudorozkazy, które nie dotyczą samej realizacji programu, ale znacznie upraszczają jego opracowanie. Pseudooperacje są reprezentowane przez rozkazy nie przenoszone przez asembler na kod maszynowy obiektu. Są to tzw. dyrektywy asemblera, które definiują specjalne obszary pamięci, przenoszą tablice lub inne dane do pamięci - definiują symbole. Przykłady komend dla pseudooperacji: DATA, EQUATE, DEFINE, ORIGIN, RESERVE, END, LIST, NAME, PAGE, SPACE, TITLE., DATA Jest to pseudooperacja, która otwiera proces wprowadzania danych przez użytkownika programu np.: CON DATA ; oznacza wpisanie liczby do pierwszej wolnej komórki pamięci i oznaczenie jej adresem symbolicznym CON. POM DATA 'ERROR', PIERW DATA 1,4,3,5,7 Długość łańcucha znaków w parametrach DATA jest ograniczona długością 1 linii edycyjnej. NAPIS DATA TABLICA WYNIKOWA, DATA POMIARU PIERWSZEGO, DATA BEZ KOMENTARZA, DATA LICZB, EQU Jest pseudooperacją (EQUATE / EQUALS), która służy do przypisania nazw etykiet lub innych nazw, fizycznym adresom lub danym. Np.: TTY EQU 5 OSTATNI EQU 2000, ST1 EQU START + 1, Tablicę pseudo operacji EQU najczęściej umieszczamy na początku programu, choć nie jest to wymóg konieczny. ORG Określa pseudo operację (ORIGIN), służącą do określania lokacji pamięci dla programu/podprogramu napisanego w języku assemblera. 67 RESET Jest zerowaniem adresów. RESERVE Służy do przydzielania obszarów RAM zbiorom o określonych nazwach, np.: 1) POMIAR RESERVE 100, TEMPER RESERVE 40, ZNAK 2) ORG RESERVE 1, 3000, POMIAR RESERVE 100, TEMPER RESERVE 40, ZNAK RESERVE 1, Tablica POMIAR rozpoczyna się od adresu 3000 i ma zarezerwować dla danych 100 komórek pamięci. Tablica TEMPER ma przyporządkować dla danych 40 komórek, poczynając od adresu 3100. Znak jest wpisywany do komórki pamięci o adresie 3141. Ważniejsze słowa kluczowe komend systemowych: END Pseudooperacja oznaczająca koniec programu źródłowego. LIST Jest komendą zezwalającą na drukowania programu źródłowego. NAME/TITLE Podaje na każdej stronie wydruku nazwę programu źródłowego. PAGE/SPACE Komendy redakcyjne stron. DB Umieszcza 8-bitowe dane w pamięci. DW Umieszcza 16-bitowe dane w pamięci. Przykłady: 1) ERROR DB 'ERROR' w pamięci zostają zapisane kody ASCII E, R, R, O, R (E) zosta je przypisana etykieta o nazwie ROR, 2) DANE DB 32, liczba 32 zostaje wpisana do komórki pamięci oznaczona adresem symbolicznym DANE Większość asemblerów akceptuje wartości danych w zapisie: 68 • binarnym; z identyfikatorem B, np. 10010010B, • oktalnym; z identyfikatorem Q lub C, np. 07Q, • heksadecymalnym; z identyfikatorem H, np. 0E7H, • dziesiętnym; z identyfikatorem D. np. 1240D, • ASCI 'w cudzysłowie'. 69