aski

laboratorium nr 1
Architektura mikroprocesora 8086 i pochodne
Poniżej został przedstawiony schemat blokowy mikroprocesora 8086. Funkcje mikroprocesora są wykonywane przez dwa główne układy: jednostkę łączności z magistralą (BIU) oraz jednostkę wykonawczą (EU). Obie jednostki współpracują ze sobą, jednakże większość operacji wykonują oddzielnie (asynchronicznie). W jednostce EU znajduje się 16-bitowa jednostka ALU, która aktualizuje stan znaczników stanu i sterujących. Jednostka ALU ma do dyspozycji rejestry ogólnego przeznaczenia oraz operuje argumentami rozkazów. Wszystkie rejestry oraz przesyłane przez EU dane są 16-bitowe.

Obecnie jądro mikroprocesora 8086 stanowi niewielką część nowoczesnych mikroprocesorów. Jednakże lista instrukcji oraz sposoby ich działania nie zostały znacząco zmienione. W nowszych typach mikroprocesorów zostało wprowadzone 32-bitowe słowo maszynowe, a co za tym idzie zostały wprowadzone rejestry o takim rozmiarze, oraz odpowiednie tryby adresowania i zarządzania pamięcią.

  1. Należy wprowadzić następujące instrukcje (od adresu poczatkowego):
    rdtsc
    mov ds:[00403000], eax
    mov ds:[00403004], edx
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    mov eax, 100
    rdtsc
    sub eax, ds:[00403000]
    sbb edx, ds:[00403004]
    jmp 00401000

Architektura Systemów Komputerowych - Instrukcja do laboratorium nr 2

Adresowanie pamięci operacyjnej w procesorze x86

Pamięć operacyjną komputera możemy wyobrazić sobie jako tablicę, do której mikroprocesor może zapisywać, lub z której może odczytywać informacje. Aby określić miejsce do którego ma trafić zapisywana informacja, lub z którego ma być odczytana należy podać jej adres (odwołując się do analogii do tablicy-indeks). Najmniejszą porcją danych jaką może zaadresować mikroprocesor w pamięci jest jeden bajt (8 - bitów), ale możemy przesyłać informacje większymi porcjami, jak np. słowo (16-bajtów), wówczas wystarczy podać tylko adres przeznaczenia dla pierwszego bajta przesyłanej informacji (Sprawa jest trochę bardziej skomplikowana, ponieważ wszystkie procesory firmy Intel używają sposobu zapisu, który jest określany w języku angielskim jako little endian. Oznacza to, że najbardziej znaczący bajt informacji będzie zapisany w miejscu pamięci o najwyższym adresie, a więc niejako „od końca”. Przykładowo, liczba szesnastkowa 1234h zostanie zapisana w pamięci jako 3412h. Należy pamiętać o tym w niektórych sytuacjach, np.: zapisujemy do pamięci słowo (2 bajty), a następnie odczytujemy je bajt po bajcie.).

Adres z procesora do pamięci przesyłany jest za pomocą magistrali adresowej. Procesor 8086 dysponuje 20-bitową magistralą adresową. Ponieważ jeden bit może przyjmować tylko wartości 1 i 0, za pomocą liczby 20-bitowej możemy zapisać maksymalnie 220 różnych adresów. Ponieważ jeden adres identyfikuje w sposób jednoznaczny tylko jeden bajt, mikroprocesor 8086 może zaadresować pamięć o maksymalnym rozmiarze 220 B, czyli 1 MB (megabajt). Programista piszący program w asemblerze procesora Intel ma do dyspozycji tylko rejestry szesnastobitowe. Konsekwencją tego jest, że w adresie umieszczonym na magistrali adresowej możemy wyróżnić dwie składowe. Pierwsza składowa zawiera 16 starszych bitów adresu, druga natomiast ma rozmiar czterech bitów. Pamięć operacyjną można więc wyobrazić sobie jako podzieloną na 65536 (216) obszarów, z których każdy ma rozmiar 16 bajtów (24). Pierwsze 16 bitów adresu określa adres początku odpowiedniego obszaru, natomiast ostatnie cztery wskazują konkretny bajt w jego obrębie.

Niestety model ten nie uwzględnia faktu, że druga składowa adresu jest zapamiętywana również w rejestrze 16 bitowym. Do zapamiętania adresu początku obszaru możemy użyć rejestrów segmentowych i ten obszar będziemy nazywać segmentem. Ponieważ procesor nie dysponuje rejestrami czterobitowymi, to drugą składową, nazywaną offsetem przechowujemy w jednym z rejestrów ogólnego przeznaczenia, na przykład w BX. Oznacza to, że mamy do czynienia z dwoma rodzajami adresów: rzeczywistymi 20-bitowymi, które są wystawiane na magistralę adresową i adresami logicznymi, 32-bitowymi, które są przechowywane w rejestrach procesora. Należy zauważyć, że segmenty mają maksymalny rozmiar wynoszący 64KB (216B) i może ich być maksymalnie 65536. Ponieważ pamięć, w której się mieszczą ma maksymalną wielkość 1MB, więc oznacza to, że segmenty nakładają się na siebie. Wprowadza to niejednoznaczność do adresów logicznych, tzn. to samo miejsce w pamięci operacyjnej można określić za pomocą kilku różnych adresów logicznych. Dąży się więc do tego, aby adresy logiczne były zapisywane w formie kanonicznej, czyli należy je tak zapisać, aby offset był liczbą 4 bitową, a segment 16 bitową. Przykład: adres zapisany szesnastkowo 1AEEh:001Ch w postaci kanonicznej ma wartość 1AEFh:000Ch, gdzie znak ':' oddziela segment od przesunięcia. Przeliczenia dokonuje się w taki sam sposób, w jaki komputer przelicza adres logiczny na fizyczny: przesuwa się wartość segmentu o cztery bity w lewo (uzupełniając puste miejsce zerami) i dodaje się wartość przesunięcia. Cztery ostatnie bity wyniku stanowią offset adresu, a szesnaście pierwszych segment.

Program, który jest wykonywany przez mikroprocesor jest zapisany w całości w pamięci operacyjnej. Gdybyśmy próbowali odczytać dowolną, losowo wybraną komórkę obszaru pamięci, w którym znajduje się program, to nie bylibyśmy w stanie stwierdzić, czy zawiera ona kod rozkazu, czy kod danej (Jest to zgodne z założeniami architektury von Neumanna.).

Procesor musi jednak wiedzieć gdzie w pamięci znajdują się instrukcje programu, a gdzie przeznaczone dla niech dane. W każdym programie znajdującym się w pamięci możemy wyodrębnić trzy obszary: kodu, danych i segmencie). Adresy początków odpowiednich segmentów umieszczane są przez program ładujący w odpowiednich rejestrach segmentowych procesora. Adresowanie poszczególnych komórek pamięci w segmentach kodu i danych przebiega tak, jak opisano to powyżej. Osobnego omówienia wymaga adresowanie danych w segmencie stosu. Dane na stosie zapamiętywane są według schematu LIFO (ang. Last In First Out). Oznacza to, informacja, która została umieszczona na stosie jako ostatnia zostanie odczytana z niego jako pierwsza. Dodatkowo operacje zapisu i odczytu danych dotyczą szczytu stosu, a więc możemy jedynie umieścić informację na szczycie stosu, lub pobrać ją ze szczytu stosu (Często przytaczaną analogią do opisu tego rodzaju pamięci jest stos talerzy. Jeśli chcemy na nim umieścić dodatkowy talerz, to musimy położyć go na wierzchu stosu. Podobnie wygląda pobieranie talerzy ze stosu.).

Adres początku segmentu stosu znajduje się w rejestrze segmentowym SS, natomiast adres szczytu stosu w rejestrze SP.

Tryby adresowania

W mikroprocesorze 8086 istnieje 9 różnych sposobów na przesłanie danych z rejestrów do pamięci lub w odwrotnym kierunku. Te sposoby określa się mianem trybów adresowania i określają one w jaki sposób należy wyliczyć adres (tzw. adres efektywny) danej znajdującej się w pamięci komputera:

tryb domyślny-stosowany jest rozkazach operujących na pewnych, z góry ustalonych rejestrach, których nie trzeba wymieniać jako argumentów (zwanych też operandami) tych rozkazów,

tryb natychmiastowy-dana zawarta jest bezpośrednio w rozkazie mikroprocesora, ten tryb służy do załadowania do rejestru wartości inicjującej,

tryb bezpośredni-adres danej jest zawarty w kodzie programu,

indeksowy-adres danej zawarty jest w rejestrze SI lub DI,

bazowy-adres danej zawarty jest w rejestrze BX lub BP,

indeksowy z przemieszczeniem-adres danej jest sumą zawartości rejestru indeksowego i przemieszczenia, które może być bajtem lub słowem,

bazowy z przemieszczeniem-adres danej jest sumą zawartości rejestru bazowego (jeśli przyjmiemy za rejestr bazowy BP, to rejestrem segmentowym będzie SS) i przemieszczenia,

bazowy indeksowany-adres danej jest sumą zawartości rejestru bazowego i rejestru które może być bajtem lub słowem, indeksowego,

bazowy indeksowany z przemieszczeniem-adres danej jest sumą zawartości rejestrów bazowego i indeksowego oraz wartości przesunięcia.

Adres danej, który trzeba wyznaczyć przez przeprowadzenie odpowiednich operacji arytmetycznych nazywamy adresem efektywnym.

Uwaga:

Powyższy opis odnosi się do procesora 8086. Współczesne procesory Intela są z nim wstecznie kompatybilne, jeśli pracują tzw. trybie rzeczywistym. Na laboratorium będziemy się posługiwać debuggerem pracującym w trybie chronionym, w którym obowiązuje inny model adresowania pamięci. Ćwiczenia zamieszczone poniżej zostały tak sformułowane, aby nie wymagały głębszej wiedzy na temat tego modelu. Jedyna zmiana polega na tym, że w rozkazach adresujących pamięć będziemy się posługiwać rejestrami rozszerzonymi: ebx, eax, esi, itd.

MOV - rozkaz przesyłania danych pomiędzy pamięcią i rejestrami lub pomiędzy rejestrami.
Rozkaz MOV jest rozkazem dwuargumentowym. Oba argumenty (operandy) tej instrukcji muszą mieć jednakowy rozmiar i mogą określać rejestr lub miejsce w pamięci. Pierwszy operand stanowi przeznaczenie, a drugi źródło. W przypadku tego rozkazu można stosować wszystkie tryby adresowania z wyjątkiem trybu domyślnego, jednakże przy niektórych kombinacjach operandów użycie niektórych trybów jest zabronione, np. nie można zastosować trybu natychmiastowego, jeśli argument docelowy jest rejestrem segmentowym.

XCHG - rozkaz zamienia wartości rejestrów, które są podane jako jego argumenty.

XCHG - rozkaz zamienia wartości rejestrów, które są podane jako jego argumenty.

LEA - ładuje adres efektywny do rejestru

LDS - rozkaz ładuje daleki wskaźnik (adres) do rejestru segmentowego ds i wybranego rejestru ogólnego przeznaczenia.

LAHF - załaduj rejestr ah zawartością młodszego bajta rejestru flag

laboratorium nr 3

  1. Architektura systemu komputerowego - model RTL
    Mikroprocesor jest układem sekwencyjnym składającym się z bloków funkcyjnych. Typowy układ mikroprocesora zawiera następujące elementy:

    • układ pobierający instrukcje,

    • układ sterujący (wykonujący instrukcję),

    • układ arytmetyczno-logiczny,

    • blok uniwersalnych rejestrów,

    • blok akumulatora,

    • układy sterujące przepływem danych na magistralach.
      Pomiędzy poszczególnymi blokami występują ściśle określone zależności. Każdy z bloków posiada odpowiednie wejścia i wyjścia oraz linie sterujące. Komunikacja między blokami odbywa się z użyciem sygnałów elektrycznych, których wartość jest oznaczana następująco:
      1, H - logiczny stan wysoki, odpowiada przepływowi prądu elektrycznego,
      0, L - logiczny stan niski, odpowiada brakowi przepływu prądu elektrycznego.
      Wymienione stany logiczne służą do kodowania wartości cyfrowych i odpowiadają jednemu bitowi danych. Należy to rozumieć w taki sposób, że mający jedno wejście układ jest w stanie zakodować 1 bit informacji, więc wartość 0 lub 1, natomiast układ mający 8 wejść potrafi zakodować 28 informacji (każda linia może pracować w dwóch stanach, linii jest 8).

      Mikroinstrukcją nazywa się niepodzielną operację, która jest wykonywana przez mikroprocesor. Najczęściej jest to wzbudzenie jednego z bloków funkcyjnych mikroprocesora. Rozkazy mikroprocesora są zbudowane z jednej lub wielu mikroinstrukcji, które są wykonywane w odpowiednich cyklach pracy danego mikroprocesora. Poniżej został przedstawiony układ rejestrów i sumator oraz mikrooperacje jakie można wykonać przy pomocy tego układu.

    • Multiplekser jest przekaźnikiem, działa natychmiastowo,

    • Rejestr na wyjściu stale generuje pamiętaną wartość, podczas narastającego zbocza zegara i przy wartości LD=1 następuje zapamiętanie w rejestrze danych znajdujących się na wejściu.

    • Sumator działa natychmiastowo i ma dwa wejścia.
      Poniżej zostały przedstawione przykładowe operacje oraz mikrooperacja właściwe dla danego rozkazu:

    • A = WE B = WE
         t0: ADR1=0, ADR2=0 t0: ADR1=0, ADR2=1
         t1: LDA=1 t1: LDB=1

    • A = A+B
         t0: ADR3=1
         t1: LDRwy=1
         t2: ADR1=1, ADR2=0
         t3: LDA=1

Architektura systemu komputerowego - układ sterujący
Jednym z elementów mikroprocesora jest układ sterujący, którego zadaniem jest odpowiednie włączanie lub wyłączanie rejestrów lub bloków funkcjonalnych. Najczęściej układ sterujący jest połączony z dekoderem instrukcji. Na podstawie pobieranych rozkazów układ sterujący podejmuje decyzję o tym jaki w danym momencie blok funkcjonalny ma być aktywny. Poniżej zostało przedstawione słowo instrukcji z pewnego procesora. Przy pomocy tego słowa zostały zakodowane następujące instrukcje:

Słowo instrukcji:

|kkk|d|aa|bb|llllllll|

gdzie:

kkk- 3 bity oznaczające kod instrukcji,
d- bit informujący o rozkazie z domyślnymi argumentami,
aa- 2 bity oznaczające numer pierwszego rejestru,
bb- 2 bity oznaczające numer drugiego rejestru,
llllllll- 8 bitów oznaczających wartość natychmiastową,

Wiadomo, że każdy rozkaz wykonuje się w 5 cyklach zegara. Z przedstawionych informacji należy zbudować fragment układu wykonawczego oraz wskazać sposób sterowania poszczególnych elementów tego układu. Z opisu instrukcji oraz opisu rozkazów wynika, że układ posiada 4 uniwersalne rejestry oraz akumulator. Do powyższych założeń został zaproponowany następujący układ:

Zaprojektowany układ posiada wejście z dekodera instrukcji, przez które podawana jest wartość natychmiastowa oraz wyjście w postaci magistrali. W zaprojektowanym układzie jest dodatkowo możliwe wykonywanie następujący operacji: wyzerowanie akumulatora oraz negacja akumulatora.

Do układu został zaproponowany następujący sposób kodowania instrukcji:

kkk d aa bb llllllll Instrukcja
000 0 aa bb - - - - - -l1l0 Rl1l0 = Raa+Rbb, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
001 0 aa bb - - - - - -l1l0 Rl1l0 = Raa-Rbb, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
010 0 -- -- - - - - - -l1l0 Rl1l0 = 0, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
011 0 -- -- - - - - - -l1l0 Rl1l0 = not Rl1l0, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
000 1 -- -- l7l6l5l4l3l2l1l0 A = A+L
001 1 -- -- l7l6l5l4l3l2l1l0 A = A-L
100 0 aa -- l7l6l5l4l3l2l1l0 Raa = Raa+L
101 0 aa -- l7l6l5l4l3l2l1l0 Raa = Raa-L
110 0 aa -- l7l6l5l4l3l2l1l0 Raa = L
110 1 -- -- l7l6l5l4l3l2l1l0 A = L
010 1 -- -- - - - - - - - - A = 0
011 1 -- -- - - - - - - - - A = not A
111 0 aa -- - - - - - - - - WY = Raa
111 1 -- -- - - - - - - - - WY = A

gdzie:

aa- numer rejestru: 0 = R0, 1 = R1, 2 = R2, 3 = R3,
bb- numer rejestru: 0 = R0, 1 = R1, 2 = R2, 3 = R3,
lx- x-ty bit wartości natychmiastowej,
-- wartość nieistotna,
L- wartości natychmiastowa,


Wyszukiwarka

Podobne podstrony:
Chirurgia wyk. 8, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 pos
Nadczynno i niezynno kory nadnerczy, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Austral
2 Momenty bezw éadno Ťci figur p éaskich
Harmonogram ćw. i wyk, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat
KONCEPCJA aski
egzamin fizjologia - czerwiec od Aski, Egzamin- pielęgniarstwo czerwiec 2008
chirurgia wyk 7, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 pose
Chirurgia wyk. 5, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 pos
chirurgia 03.03 3006 urazy gAowy by SHU ., In Search of Sunrise 1 - 9, In Search of Sunrise 10 Austr
CHirurgia wyk. 4, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 pos
leki w stanach nagłych, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat
rynek walutowy, finanse i rachunkowość, od Aski, bankowość
interna pytania, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, interna, GI
farma, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 posegregowane]
testymedyczne2006, In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 po
PIERWSZA-POMOC[1], In Search of Sunrise 1 - 9, In Search of Sunrise 10 Australia, Od Aśki, [rat 2 po
nerka aski

więcej podobnych podstron