etr_ciga.doc

(1197 KB) Pobierz
1) Funkcja rejestrów uniwersalnych i akumulatora:

1) Funkcja rejestrów uniwersalnych i akumulatora:



Rejestry uniwersalne są wykorzystywane głównie jako pamięć podręczna dla przechowywania częściowych wyników obliczeń, stałych itp. Wykonywanie rozkazów działających na argumentach znajdujących się w rejestrach uniwersalnych (operacje arytmetyczne, logiczne, przesłania) nie wymaga dostępu mikroprocesora do pamięci, jest więc znacznie szybsze niż wykonywanie analogicznych rozkazów działających na argumentach zawartych w pamięci zewnętrznej. Z80 ma sześć ośmiobitowych rejestrów uniwersalnych B, C, D, E, H, L, które mogą być wykorzystywane również parami BC, DE, HL jako rejestry uniwersalne 16-bitowe. Pary rejestrów mogą ponadto spełniać rolę -wskaźników danych. Zawartość ich jest interpretowana wówczas jako adres komórki pamięci, w której jest zapisany argument danej operacji. Dokładniej zostanie omówione to przy opisie trybów adresowania. Mikroprocesor Z80 ma jeden ośmiobitowy akumulator A. Akumulator jest jednym z najważniejszych dla użytkownika rejestrów mikroprocespra. Spełnia on funkcja takie, jak rejestry uniwersalne. Ponadto w akumulatorze jest zwykle zawarty jeden z argumentów oraz jest on miejscem wpisu wyniku operacji arytmetycznych i logicznych wykonywanych przez mikroprocesor. Długość (liczba bitów) akumula­tora i rejestrów uniwersalnych wyznacza podstawowy parametr mikro­procesora — długość słowa.

W mikroprocesorze Z80 istnieją dwa zbiory rejestrów (z których każdy zawiera sześć rejestrów uniwersalnych, akumulator i rejestr wskaźników) — zbiór główny i pomocniczy. Zawartość wszystkich rejestrów zbioru głównego i pomocniczego może być wy­mieniana między sobą przy użyciu jednego rozkazu, przy czym bezpo­średni programowy dostęp jest możliwy tylko do rejestrów zbioru głównego.

 

2) Jednostka arytmetyczno-logiczna.

Jednostka arytmetyczno-logiczna — ALU (ang. arithmetic and logie unit) jest zespołem funkcjonalnym, w którym są wykonywane wszystkie operacje arytmetyczne i logiczne. Wielkość (długość słowa i rodzaje wykonywanych operacji) ALU decydują o mocy obliczeniowej mikro­procesora. Z80 zawiera 8-bitową jednostkę arytmetyczno-logiczną.

 

3) Jakie informacje zawiera rejestr znaczników?

Do rejestru znaczników są wpisywane informacje o przebiegu i wyniku operacji arytmetycznych i logicznych (np. było przeniesienie, nadmiar, wynik zerowy, dodatni itp.) wykonywanych przez jednostkę arytmetyczno-logiczną. Rejestr składa się z sześciu znaczników rozmieszczonych w ośmiobitowym słowie tak, jak pokazano na rys.

S

 

Z

 

 

 

H

 

 

 

P/V

 

N

 

C

 

 

4) Do czego służą rejestry specjalne?

W grupie rejestrów specjalnych każdy spełnia swoją ściśle określoną funkcję i nie może być wykorzystywany w innych celach.

Licznik rozkazów (PC) zawiera adres komórki pamięci, z której będzie pobrany kod rozkazu do wykonania. Po każdym pobraniu kodu rozkazu zawartość licznika rozkazów jest zwiększana o l. Długość licznika rozkazów wyznacza zwykle maksymalną pojemność pamięci, jaką można bezpośrednio dołączyć do mikroprocesora. Przy długości licznika rozkazów lpc = 16 bitów maksymalna pojemność pamięci wyniesie 216 = 65536 słów

Adresy pamięci o maksymalnej pojemności tworzą przestrzeń adresową mikroprocesora.

                                             

5)Wskaźnik stosu (SP) zawiera adres pamięci zewnętrznej przeznaczonej na stos. Przy każdej operacji zapisu informacji na stos i pobrania informacji ze stosu adres jest odpowiednio modyfikowany tak, że zawsze pokazuje na „wierzchołek" stosu. Dokładna organizacja i wykorzystanie stosu będzie opisana dalej. Rejestry indeksowe (IX i IY) zawierają zawsze adres bazowy do adresowania indeksowego (patrz tryby adresowania). Wektor przerwań (I) zawiera 8-bitową część adresu programu obsługi przerwania. Rejestr odświeżania (R) zawiera siedmiobitowy adres do auto­matycznego odświeżania pamięci dynamicznej. Można tu stwierdzić, że rejestry specjalne są używane przez programistę głównie dla celów sterowania programem (skoki, podprogramy) i organizacji pamięci. Korzystanie z rejestrów specjalnych jest często pośrednie przy okazji wykonywania jakiejś operacji (np. skok do podprogramu) i stosunkowo rzadko następuje jawne wpisanie liczby do któregoś z tych rejestrów. Rejestr R nie jest praktycznie w ogóle wykorzystywany przez programistę.

 

6) Jaką rolę spełnia układ sterowania?

Układ sterowania (ang. control unit) jest podstawowym zespołem funkcjo­nalnym mikroprocesora kierującym pracą wszystkich pozostałych blo­ków, zarówno wewnętrznych, jak i zewnętrznych. Przez generację odpowiednich wewnętrznych sygnałów sterujących układ sterujący

— określa rodzaj operacji wykonywanych przez ALU,

— steruje pracą wszystkich rejestrów mikroprocesora,

— steruje przesyłaniem informacji po wewnętrznej magistrali danych. Wysyła on również sygnały sterujące do elementów zewnętrz­nych (pamięć, wejście-wyjście), określając rodzaj operacji jaką mają one wykonać.

W skład układu sterowania wchodzi dekoder rozkazów (ang. instruction decoder) i rejestr rozkazów (ang. instruction register). Do rejestru rozkazów jest wpisywany pobrany z pamięci kod rozkazu, który jest dekodowany przez dekoder, po czym układ sterowania wytwarza odpowiednie sygnały sterujące konieczne do wykonania rozkazu.

 

7) Co to jest rozkaz?

Rozkaz (ang. instruction) jest elementarną - z punktu widzenia progra­misty - operacją, jaką może wykonać mikroprocesor. Rozkazy odpo­wiadają prostym operacjom wykonywanym na danych (argumentach) umieszczonych w pamięci lub rejestrach procesora. Na przykład:

PRZEŚLIJ z B do C - prześlij zawartość rejestru B do rejestru C,

PRZEŚLIJ z A do M30 — prześlij zawartość akumulatora A do komórki pamięci o adresie 30,

DODAJ do A 25 - dodaj do akumulatora A liczbę 25, wynik wpisz do A,

SKOCZ do 100 - wpisz do licznika rozkazów licz­bę 100.



Zbiór wszystkich rozkazów jakie mogą być wykonywane przez mikro­procesor nazywa się jego listą rozkazów. Zbiór taki powinien być funkcjonalnie pełny, to znaczy taki, aby dowolnie złożony algorytm przetwarzania informacji można było przedstawić jako ciąg rozkazów. Taki ciąg rozkazów tworzy program. Ciąg rozkazów tworzący program jest umieszczony w kolejnych komórkach pamięci.





Każdy rozkaz jest umieszczony w pamięci zakodowany, jako ciąg zerojedynkowy. Kod jednego rozkazu może zajmować jedną lub kilka kolejnych komórek pamięci. Kod rozkazu PRZEŚLIJ z B do C zajmuje jedno słowo pamięci, rozkazu DODAJ do A 25 — dwa słowa, a rozkazów PRZEŚLIJ z A do M30 i SKOCZ do 100 po trzy słowa.

W kodzie rozkazu można wydzielić dwa pola (rys.):

— pole kodu operacji zajmujące zwykle jedno lub dwa pierwsze słowa,

— pole adresu argumentu lub argumentu zajmujące kolejne jedno lub dwa słowa pamięci.

 



Kody części rozkazów (jak np. PRZEŚLIJ z B do C) nie mają drugiego pola, ponieważ treść rozkazu jest jednoznacznie określona przez kod operacji. Programista pisząc program nie używa zerojedynkowych ko­dów rozkazów, które są mało czytelne dla człowieka, lecz łatwych do zapamiętania ich symbolicznych nazw. Takie symboliczne nazwy nazywa się skrótami mnemonicznymi rozkazów. Skrót mnemoniczny rozkazu zawiera:

— symboliczny (kilkuliterowy) skrót operacji wykonywanej przez rozkaz, pochodzący zwykle od słownej nazwy tej operacji. Na przykład LD — load (ładuj), ADD — add (dodaj), JP —jump (skocz),

— argumenty operacji podane bezpośrednio jako liczba lub symbolicznie jako miejsce ich umieszczenia. Na przykład A, B, C są nazwami rejestrów, w których umieszczone są argumenty, (30) — oznacza komórkę pamięci o adresie 30.

Napisany przez człowieka program w postaci symbolicznej musi być przed wpisaniem go do pamięci zamieniony na postać zerojedynkową (kod maszynowy) zrozumiałą dla procesora. Proces ten może być wykonywany ręcznie przez programistę, ale częściej stosuje się do tego celu specjalne programy tłumaczące — asemblery umożliwiające auto­matyczne tłumaczenie programu z postaci symbolicznej na binarną.

 

8) W jaki sposób mikroprocesor wykonuje rozkazy?

Rozkazy są wykonywane przez mikroprocesor cyklicznie w cyklu rozkazowym. Uproszczona sieć działań cyklu rozkazowego jest pokazana na rys. Wyróżnia się dwie fazy cyklu rozkazowego:

— faza pobrania kodu operacji,

—         faza wykonania operacji.

Cykl rozkazowy mikroprocesora

 

W fazie pobrania są wykonywane następujące czynności:

— wysłanie na magistralę adresową stanu licznika rozkazów AD←PC,

— wpisanie do rejestru rozkazów pobranego z magistrali danych kodu operacji RR←D,

— zwiększenie o 1 licznika rozkazów PC← PC+1 ,

zdekodowanie rozkazu.

Faza pobrania przebiega identycznie dla wszystkich rozkazów. Po jej wykonaniu licznik rozkazów zawiera adres następnej komórki pamięci po kodzie operacji.

W fazie wykonania następuje wykonanie operacji wskazanej przez pobrany rozkaz. Faza ta przebiega różnie dla różnych rozkazów. Jeżeli argumenty są umieszczone w rejestrach procesora, operacja jest wykonywana natychmiast, jeżeli zaś są umieszczone w pamięci, to przed wykonaniem operacji muszą być do rejestrów procesora sprowadzone. Wysyłany jest wtedy na magistralę adresową adres argumentu, po czym argument ten jest pobierany z magistrali danych. Czynności te (dostęp do pamięci) mogą się powtórzyć kilkakrotnie aż do sprowadzenia do rejestrów mikroprocesora wszystkich argumentów. Jeżeli wykonanie operacji wymaga zapisania informacji do pamięci, to adres jest wysyłany na magistralę adresową, a informacja — na magistralę danych, i czynności te są powtarzane tyle razy, ile jest konieczne dla przesłania informacji. Za każdym razem układ sterowania wysyła do pamięci sygnały sterujące informujące o rodzaju wykonywanej operacji. Wyko­nywaniem cyklu rozkazowego kieruje układ sterowania, który jest synchronizowany sygnałem zegarowym. Jeden cykl rozkazowy trwa zwykle kilka do kilkunastu taktów zegarowych. Należy zwrócić uwagę na fakt, że umieszczone w pamięci kody operacji i liczby (argumenty) są nierozróżnialne. O tym, czy dany ciąg bitów umieszczony w słowie pamięci będzie potraktowany jako kod rozkazu, czy jako liczba, decyduje faza, w której jest on pobrany przez mikroprocesor. Jeżeli odczytanie następuje w fazie pobrania, to ciąg bitów zostanie umieszczony w rejestrze rozkazów i potraktowany jako kod rozkazu. Jeżeli pobranie następuje w fazie wykonania, to ciąg bitów jest umieszczony w jednym z innych rejestrów mikroprocesora i jest interpretowany jako liczba (adres lub argument).

 

9) Jak mogą być adresowane umieszczone w pamięci argumenty rozkazów?

Argumenty wielu rozkazów są umieszczone w pamięci. Adres komórki pamięci, gdzie jest umieszczony kod wykonywanego rozkazu, jest zawsze zawarty w liczniku rozkazów (PC). Natomiast adres argumentu może być określony w różny sposób, zależnie od zastosowanego w rozkazie trybu adresowania. Tryb adresowania określa miejsce, gdzie jest umieszczony adres argumentu lub sposób, w jaki jest on obliczany.

Najprostszym trybem adresowania jest adresowanie za pomocą wskaźników  przedstawione schematycznie na rys. Adres argumentu jest umieszczony w rejestrze procesora zwanym wskaźnikiem danych (lub licznikiem danych).

 

W mikroprocesorze Z80 jako wskaźniki danych mogą być użyte pary rejestrów uniwersalnych BC, DE oraz głównie HL. Na zawartości rejestru wskaźników można wykonywać operacje arytmetyczne (np. dodawanie jedności), czyli modyfikować adres. Możliwość modyfikacji adresu jest ważną cechą trybu adresowania, ułatwia bowiem wykony­wanie operacji na złożonych strukturach danych.

Innym sposobem adresowania pamięci jest adresowanie natych­miastowe przedstawione schematycznie na rys. W tym przypadku argument jest umieszczony w pamięci bezpośrednio za kodem operacji, czyli po pobraniu kodu operacji adres argumentu jest zawarty w liczniku rozkazów. Rozkazy o adresowaniu natychmiastowym nazywa się rozkazami z argumentem bezpośrednim. Argument bezpośredni może być 8- lub 16-bitowy i w zależności od tego, jest umieszczany w jednym lub dwóch słowach pamięci bezpośrednio za kodem operacji. Każdorazowo po pobraniu argumentu bezpośredniego zawartość licznika rozkazów jest automatycznie zwiększana o l, analo­gicznie jak po pobraniu kodu operacji. Jako argumenty bezpośrednie umieszcza się w pamięci głównie dane stałe.

Na rysunku 2.13C przedstawiono schematycznie adresowanie bezpośrednie. Adres argumentu jest umieszczony w tym przypadku w pamięci, jako część kodu rozkazu, bezpośrednio za kodem operacji (analogicznie jak argument bezpośredni). Szesnastobitowy adres zajmuje dwa kolejne słowa pamięci (dla mikroprocesorów 8-bitowych). W pierwszym jest umieszczona mniej znacząca część adresu (bity 0-7), a w drugim — bardziej znacząca (bity 8- 15). Przy adreso­waniu bezpośrednim teoretycznie jest możliwość modyfikacji adresu. Praktycznie z tego się nie korzysta, ponieważ wymaga to zmian w kodzie rozkazu, co jest bardzo niedogodne i w razie pomyłki może doprowa­dzić do zmian treści rozkazu. Poza tym program mikroprocesora umieszcza się zwykle w pamięci stałej, co uniemożliwia modyfikację.

Adresowanie bezpośrednie Jest stosowane często w rozkazach skoku, a także do adresowania danych skalarnych (zajmujących pojedyncze słowa pamięci).

Kolejny tryb adresowania jest pokazany na rys. 2.13D. Jest to adresowanie indeksowe. Adres argumentu jest tu sumą adresów umieszczonych w rejestrze indeksowym i w kodzie rozkazu bezpośrednio za kodem operacji. W mikroprocesorze Z80 istnieją dwa 16-bitowe rejestry indeksowe IX i IY, a składnik adresu w kodzie rozkazu jest ośmiobitowy (bity 0-7). Adresowanie indeksowe stanowi więc połączenie adresowania bezpośredniego i adresowania za pomocą wskaźników. Istnieje tu możliwość łatwej modyfikacji adresu. Stosowane jest głównie do adresowania umieszczonych w pamięci tablic. Wtedy adres początku tablicy umieszcza się w rejestrze indeksowym, a w kodzie rozkazu umieszcza się numer pozycji w tablicy.



Przy adresowaniu względnym (rys. 2.13E) adres argumentu jest wynikiem dodania liczby umieszczonej w kodzie rozkazu za kodem operacji (przesunięcia) do zawartości licznika rozkazów. Przesunięcie jest zwykle liczbą ośmiobitową (zajmującą jedno słowo w pamięci) w zapisie uzupełnień do dwóch.

 

Adresowanie względne

W chwili obliczania adresu licznik rozkazów wskazuje następną ko­mórkę pamięci po przesunięciu. Przy założeniu, że kod operacji zajmuje jedno słowo, adres efektywny może więc zawierać się w przedziale [A- 126, A + 129], gdzie A jest adresem, pod którym jest umieszczony kod operacji rozkazu. W mikroprocesorze Z80 adresowanie względne stosuje się tylko w rozkazach skoków. Program, w którym wszystkie rozkazy skoku są adresowane względnie, może być umieszczony w dowolnym miejscu pamięci — jest programem relokowalnym.

Obok omówionych dotąd trybów adresowania (wszystkich jakie występują w mikroprocesorze Z80) w innych mikroprocesorach można spotkać jeszcze na przykład:

— adresowanie pośrednie,

— adresowanie z modyfikacją, które nie będą tu omawiane.

Tryb adresowania rozkazu działającego na argumencie umie­szczonym w pamięci ma decydujący wpływ na czas wykonania rozkazu. O czasie tym decyduje przede wszystkim liczba dostępów do pamięci (operacji czytania lub pisania) koniecznych do wykonania rozkazu. Najszybsze są rozkazy o adresowaniu za pomocą wskaźników i na­tychmiastowym, dla wykonania których konieczne są tylko dwa dostępy do pamięci — pobranie kodu rozkazu i przesłanie argumentu. W pozostałych trybach adresowania w pamięci jest umieszczony adres. argumentu (lub jego część), do pobrania którego konieczne są dodatko­we dostępy do pamięci. Omówione tryby adresowania mogą dotyczyć nie tylko pamięci, a również rejestrów wejścia-wyjścia. Zwykle jednak do układów wejścia-wyjścia nie stosuje się tak bogatych trybów adresowania. W mikroprocesorze Z80 stosuje się dwa tryby adresowania układów wejścia-wyjścia:

adresowanie bezpośrednie,

— adresowanie za pomocą wskaźnika, przy czym rolę wskaź­nika danych spełnia rejestr uniwersalny C.

 

10) C to jest stos?

Stos jest to pamięć, do której dostęp jest możliwy tylko z jednej strony. Informację można zapisać tylko na wierzchołku stosu i odczytać również tylko z wierzchołka (rys. 2.14A). Pamięć tak zorganizowaną można przyrównać do stosu książek leżących jedna na drugiej. Zapis informacji odpowiada położeniu nowej książki, odczyt - zdjęciu książki z wierzchu. Każdy zapis informacji na stos powoduje zwiększenie jego zawartości (przesunięcie wierzchołka do góry). Każdy odczyt powoduje zmniejszenie zawartości stosu (przesunięcie wierzchołka do dołu). Informacja może być tylko raz odczytana („zdjęta") ze stosu. Po odczytaniu odsłaniana jest informacja zapisana na pozycji niższej. Informacje odczytywane są ze stosu w kolejności odwrotnej niż były na stos zapisane — jako pierwsza będzie odczytana informacja zapisana ostatnio.

Stos jest umieszczony w pamięci mikroprocesora. Zadaniem programisty jest taki podział pamięci, aby stos nie pokrywał się z częściami pamięci przeznaczonymi na program i dane. Stos jest adresowany za pomocą wskaźnika stosu SP (rys. 2.14B). Zawartość SP jest zawsze adresem wierzchołka stosu. Przy rozpoczęciu pracy program powinien wpisać do wskaźnika stosu adres początku (dna) stosu. Przy każdej operacji zapisu na stos następuje automatyczne zmniejszenie zawartości SP o l, przy każdej operacji odczytu następuje automatyczne zwiększenie o l, zawartości SP.

 

Stos jest stosowany przede wszystkim dla zapamiętywania śladu (stanu licznika rozkazów) przy skoku do podprogramu. Zostanie to omówione dokładnie przy opisywaniu odpowiednich rozkazów.

 

11) Do czego jest używany rozkaz skoku?

Rozkazy skoków służą do sterowania wykonywanym programem. Za pomocą tych rozkazów można realizować pętle programowe (które są wykonywane zadaną liczbę razy lub do chwili spełnienia jakiegoś warunku), rozgałęzienia warunkowe programu itp.

Jako przykład zostanie przedstawiony program mnożenia dwóch liczb (dodatnich różnych od zera) umieszczonych w rejestrach C i D: Wynik ma być umieszczony w rejestrze C. Jeżeli w wyniku mnożenia zostanie przekroczony zakres, to zawartość rejestrów C i D nie powinna być zmieniana. Program zostanie umieszczony w pamięci od adresu 100. Z lewej strony są podane adresy



W programie mnożenie jest wykonywane metodą wielokrotnego doda...

Zgłoś jeśli naruszono regulamin