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