Powyższy podział jest podziałem ze względu na typ mapy pamięci. Mapa pamięci (memory map) w sposób graficzny przedstawia rozmieszczenie poszczególnych pamięci w przestrzeni adresowej jednostki centralnej. Oprócz adresów obszarów RAM, ROM i innych rodzajów pamięci, mapa ta podaje usytuowanie rejestrów uniwersalnych, adresów procedur obsługi przerwań, rejestrów układów we/wy (dostępne przez adresowanie pamięci RAM).
rodzaj architektury komputera, przedstawionej po raz pierwszy w 1945 roku przez Johna von Neumanna stworzonej wspólnie z Johnem W. Mauchly'ym i Johnem Presper Eckertem.
Polega na ścisłym podziale komputera na trzy podstawowe części:
procesor (w ramach którego wydzielona bywa część sterująca oraz część arytmetyczno-logiczna)
Pamięć komputera (zawierająca dane i sam program)
Urządzenia wejścia/wyjścia
System komputerowy zbudowany w oparciu o architekturę von Neumanna powinien:
Mieć skończoną i funkcjonalnie pełną listę rozkazów
Mieć możliwość wprowadzenia programu do systemu komputerowego poprzez urządzenia zewnętrzne i jego przechowywanie w pamięci w sposób identyczny jak danych
Dane i instrukcje w takim systemie powinny być jednakowo dostępne dla procesora
Informacja jest tam przetwarzana dzięki sekwencyjnemu odczytywaniu instrukcji z pamięci komputera i wykonywaniu tych instrukcji w procesorze.
Architektura Von-Neumanna cechuje się jednolitą przestrzenią adresową, w której wszystkie pamięci, rejestry i układy we/wy są umieszczone w jednej, wspólnej przestrzeni adresowej. W architekturze tej zakłada się, że podział przestrzeni adresowej na pamięć programu, pamięć danych oraz obszar we/wy jest czysto umowny i zależy wyłącznie od rozmieszczenia tych elementów w obszarze adresowym podczas projektowania systemu. Mk ma jedną szynę danych wspólną dla danych i programu
System komputerowy von Neumanna nie posiada oddzielnych pamięci do przechowywania danych i instrukcji. Instrukcje jak i dane są zakodowane w postaci liczb. Bez analizy programu trudno jest określić czy dany obszar pamięci zawiera dane czy instrukcje. Wykonywany program może się sam modyfikować traktując obszar instrukcji jako dane, a po przetworzeniu tych instrukcji - danych - zacząć je wykonywać.
Architektura von Neumanna tworzy w pewnym miejscu tzw. wąskie gardło ograniczające moc procesora. Tym miejscem jest szyna, czyli kanał, przez który procesor komunikuje się z pamięcią i urządzeniami zewnętrznymi. Rozważmy (często spotykaną) instrukcję procesora, która pobiera jedno słowo danych z pamięci. Taka instrukcja wymaga:
Podania pamięci adresu tej instrukcji,
Pobrania kodu operacji z pamięci,
Podania pamięci adresu danej,
Pobrania danej z pamięci,
Podania pamięci adresu następnej instrukcji itd.
W architekturze harwardzkiej adres danej można podawać do pamięci danych już w czasie podawania adresu następnej instrukcji pamięci programu. Taka architektura ułatwia przetwarzanie potokowe.
Rozwiązaniem jest zastosowanie pamięci podręcznej cache.
Programowanie jest ułatwione, gdyż dostęp do danych, programu i urządzeń we/wy odbywa się przy użyciu zunifikowanych rozkazów wykorzystujących te same tryby adresowania. Zatem nie istnieje tu potrzeba wprowadzania specjalnych rozkazów pozwalających na przepływ danych pomiędzy pamięcią ROM i RAM.
Cechy architektury von Neumana
Brak podziału pamięci na pamięć danych i programu,
Możliwość wykonywania kodu programu zarówno z pamięci Flash jak i RAM (możliwość modyfikacji kodu w trakcie wykonywania programu).
Przykłady mikroprocesorów: ARM
Opiera się na użyciu dwóch oddzielne układów pamięci (osobny układ do operacji na rozkazach i osobny do operacji na danych) i dwóch magistral łączących te pamięci z procesorem, dzięki czemu w trakcie pobierania argumentów wykonywanej właśnie instrukcji można równocześnie zacząć pobieranie następnego słowa rozkazowego (pre-fetch). Skraca to cykl rozkazowy i zwiększa szybkość pracy. Obszary adresowe pamięci danych i programu (wewnętrznych i czasami zewnętrznych) są rozdzielone. Pociąga to za sobą niejednoznaczność adresów, ponieważ pod tym samym adresem jednostka centralna widzi pamięć RAM i ROM.
W tym przypadku stosuje się inne rozkazy dla pamięci programu i inne dla pamięci danych. Ponadto magistrala danych i rozkazów mają różną szerokość (długość słowa).
Separacja pamięci danych od pamięci rozkazów sprawia, że architektura harwardzka jest obecnie powszechnie stosowana w mikrokomputerach jednoukładowych, w których dane programu są najczęściej zapisane w nieulotnej pamięci ROM (EPROM/EEPROM), natomiast dla danych tymczasowych wykorzystana jest pamięć RAM (wewnętrzna lub zewnętrzna).
W architekturze typu Harvard komputer ma możliwość jednoczesnego dostępu do danych oraz do rozkazów programu co bardzo zwiększa jego efektywność. Procesory o takiej strukturze stosowane są przede wszystkim w obróbce sygnałów, w tak zwanych procesorach DSP (Digital Signal Processing ).
Architektura harwardzka jest także stosowana przy dostępie procesora do pamięci cache.
Przykłady mikroprocesorów: AVR, DSP
Jest rozwiązaniem pośrednim, starającym się połączyć zalety architektury harwardzkiej i Von-Neumanna. Obszary pamięci ROM i RAM są rozdzielone, ale charakteryzują się taką samą długością słowa. Wykorzystują one wspólne magistrale danych i adresową.
Dzięki multiplekserom MUX i odpowiedniej organizacji magistrali pamięci ROM i RAM możliwe jest z pewnymi ograniczeniami przesyłanie stałych z pamięci ROM do rejestrów i pamięci RAM. Jedynym rejestrem niewidocznym jako komórka pamięci RAM jest rejestr akumulatora A.
Przykłady mikroprocesorów: rodzina mikrokontrolerów 8051
czyli o zredukowanej liście instrukcji.
Cechy RISC:
Procesor jest zbudowany zgodnie z architekturą harwardzką,
Procesor wykorzystuje przetwarzanie potokowe (pipeling) w celu zwiększenia szybkości wykonywania programu,
Zbiór realizowanych instrukcji jest ograniczony i spełnia warunki ortogonalności (symetrii).
Procesor tego typu zamiast prostego rejestru instrukcji stosuje się pamięć FIFO (first-in first-out), która gromadzi kolejkę instrukcji.
Pojęcie ortogonalności oznacza unifikację instrukcji według następujących zasad:
Każda instrukcja może operować na dowolnym rejestrze roboczym. Procesor nie ma więc wyróżnionych rejestrów, które są specjalizowane do wykonywania określonych rodzajów operacji,
Każda instrukcja może wykorzystywać dowolny tryb adresowania argumentów, nie ma ukrytych związków między instrukcjami (efektów ubocznych), które powodowałyby nieprzewidziane reakcje systemu w zależności od kontekstu użycia rozkazów w programie,
Kody rozkazów i formaty instrukcji są zunifikowane. W szczególności wszystkie instrukcje zajmują w pamięci programu taką samą liczbę bajtów.
RISC a CISC – Podstawowe różnice:
CISC – Complete Instruction Set Computer | RISC – Reduced Instruction Set Computer |
---|---|
|
|
Podejście stosowane w latach 60tych i 70tych XX wieku.
Zakłada odpowiedniość między instrukcjami procesora i instrukcjami języka wysokiego poziomu (instrukcja wysokiego poziomu jest zamieniana na jedną lub kilka instrukcji procesora).
Rejestru służą tylko do tymczasowego przechowywania wyników pośrednich i adresów, dane znajdują się w pamięci (instrukcje operują na danych w pamięci).
Instrukcje operują na argumentach o różnych długościach: bajty, słowa 16-, 32- ew. 64-bitowe (długość argumentu jest zapisana w kodzie instrukcji).
Bogaty repertuar trybów adresowania.
Maksymalnie 16 rejestrów
Operacje warunkowe - najczęściej z użyciem znaczników.
Dominują instrukcje warunkowe - wynik zastępuje argument źródłowy.
Specyfikacja dwóch argumentów wymaga mniejszej liczby bitów w obrazie binarnym instrukcji niż specyfikacja trzech argumentów.
Rejestry przechowują wyniki obliczeń - nowy wynik tymczasowy zastępuje poprzedni.
Skomplikowane instrukcje wymagają złożonej jednostki wykonawczej.
Duża liczba odwołań do danych w pamięci spowalnia wykonanie programu.
Duża liczba i złożoność trybów adresowania powoduje wydłużenie pól specyfikacji argumentów w zapisie binarnym instrukcji.
Podejście RISC wprowadzono na początku lat 80-tych XX wieku
Ważniejsze współczesne architektury RISC: MIPS, SPARC, ARM
Skalarne dane lokalne procedury są przechowywane w rejestrach. Odwołania do pamięci głównie w prologu i epilogu procedury - przeładowanie ramki stosu.
Duży zestaw rejestrów - minimalnie 16, zwykle przynajmniej 32 (rejestry powinny mieścić skalarne argumenty i lokalne procedury).
Instrukcje trójargumentowe - nie niszczą argumentów źródłowych (dane lokalne nie są zamazywane podczas wykonywania na nich operacji).
Rzadkie odwołania do pamięci nie wymagają złożonych trybów adresowania (proste kodowanie instrukcji).
Proste instrukcje dają się wykonać w prostej i szybkiej jednostce wykonawczej.
Każda instrukcja ma tylko jeden argument docelowy
Najwyżej jedno odwołanie do pamięci.
Złożone operacje można zsyntetyzować z kilku instrukcji.
Instrukcje arytmetyczne i logiczne operują tylko na dancyh w rejestrach i argumentach natychmiastowych (długość argumentu jest zwykle równa długości rejestru, brak operacji 8-, i 16bitowych).
Tylko dwa rodzaje instrukcji operują na pamięci: Load – ładuj, Store – składuj
Więcej instrukcji - dłuższa postać binarna programu.
Wszystkie instrukcje mają taką samą długość obrazu binarnego (zwykle 32 bity).
Jeden lub dwa tryby adresowania pamięci - rejestrowy pośredni z przemieszczeniem, ew. dwurejestrowy pośredni.
Microprocessor without Interlocked Pipeline Stages - (Kaliornijski Uniwersytet Stanford)
Pomiędzy poszczególnymi fazami potoku nie występują relacje wymagające sprzętowego uzależnienia.
Obowiązek odpowiedniego ułożenia kodu programu spada na kompilatory - Idea w praktyce b. trudna do spełnienia.
Najnowsze z procesorów MIPS - R10000 i R12000 (64 bitowe)- wyposażone są w zwielokrotnione jednostki zmiennoprzecinkowe, oraz w superskalarne jednostki wykonawcze (do 5 instrukcji równocześnie).
Układy MIPS stanowią serce graficznych stacji roboczych Silicon Graphics. (Filmy „Toy Story", „Jurassic Park", „Dawno temu w trawie".)
Explicitly Parallel Instruction Computing - przetwarzanie jawnie równoległe
(Intel Itanium)
Grupowanie instrukcji i oznaczaniu ich wzajemnych relacji już na etapie kompilacji programu. Instrukcje są zamknięte w tzw. paczkach (po trzy instrukcje), które są ładowane do procesora równocześnie.
Każda paczka zawiera przedrostek - grupę bitów informujących procesor o tym, do których jednostek ma skierować poszczególne rozkazy.
W przedrostku znajdują się też informacje o tzw. barierach wykonań służących do koordynacji wykonywania poszczególnych instrukcji. Jeśli pomiędzy dwoma ciągami rozkazów znajdują się bariery wykonania, to drugi ciąg zostanie wykonany dopiero wtedy gdy znane będą wyniki działania rozkazów z pierwszego ciągu.
Skalowalność: Kod nie jest on dostosowany ściśle do budowy procesora (jak w układach VLIW) - zamiast równoległych instrukcji i odwołań zawiera tylko informacje, które instrukcje mogą się wykonać równolegle
Wada: brak skalowalności
Np. TMS320C6211(?)
Obecnie procesory VLIW są oparte na architekturze RISC, zazwyczaj z czterema lub maksymalnie ośmioma jednostkami obliczeniowymi. Po normalnej kompilacji programu, kompilator VLIW porządkuje kod na ścieżki, które wprost nie posiadają jakichkolwiek zależności. Następnie są one dzielone na cztery lub więcej części (jeden dla każdej jednostki obliczeniowej CPU) i pakowane razem w większe instrukcje z dodatkową informacją odnośnie do jednostki, na której ma być wykonywana. Rezultatem tego jest pojedynczy wielki opcode (stąd nazwa "Very Long").
Procesor TriMedia firmy Philips jest przedstawicielem architektury VLIW, tak samo jak Intel Itanium IA-64.
Mikroprocesor 68000 nie ma wyróżnionego wśród rejestrów akumulatora. Funkcje tę może pełnić dowolny z ośmiu dostępnych 32-bitowych rejestrów danych D0-D7.
Rejestry A0-A6 to 32-bitowe rejestry adresowe - adresowane programowo.
Rejestr A7 - dwa rejestry 32-bitowe, z których tylko jeden działa w danym momencie.
W trybie użytkownika A7 jest wskaźnikiem stosu użytkownika (USP)
W trybie nadzorcy A7 jest wskaźnikiem stosu nadzorcy (SSP).
Tworzony stos rozciąga się w dół pamięci.
Dane przechowywane w tych rejestrach mogą być:
Niezależnymi bitami - 32 bity,
Liczbami BCD (4-bity) - 8 liczb,
Słowami words (16-bitów) - 2 słowa,
Podwójnymi słowami long words (32-bity) - 1 słowo.
Organizacja danych w pamięci
Dane mogą mieć rozmiar 8, 16 lub 32 bitów (bajt, słowo, długie słowo)
Instrukcja MOVE, przesyłająca daną binarną z jednego miejsca do drugiego, posiada trzy formy:
MOVE.B - przesyła daną o długości bajtu,
MOVE.W - przesyła daną o długości słowa,
MOVE.L - przesyła daną o długości długiego słowa.
Kolejnymi rejestrami są:
32-bitowy licznik programu PC (Program Counter).
16-bitowy rejestr statusowy (rejestr stanu) SR (Status Register) podzielony na dwa bajty:
Bajt systemowy (bity od 8 do 15 rejestru statusowego):
Bit 15 stanowi sprzętową pomoc dla debugerów. Zwany jest on bitem śledzenia (Trace bit). Umożliwia on przejmowanie sterowania przez debuger po wykonaniu każdej kolejnej instrukcji śledzonego programu.
Bit 13 używany jest do kontrolowania dostępu do określonych instrukcji i do bajtu systemowego rejestru statusowego. Bit ten jest nazywany bitem nadzorcy (Supervisor bit). Jeśli bit ten jest ustawiony, dostęp jest dozwolony. Gdy jest on wyzerowany oznacza to, że procesor pracuje w trybie użytkownika.
Bity 10 do 8 zwane są maską przerwań. Określają one priorytet obsługiwanego aktualnie przerwania. Pozostałe bity bajtu systemowego nie są w procesorze 68000 używane
Bajt użytkownika (bity od 0 do 7 SR): rejestrem kodów warunków CCR (Condition Codes Register).
Bit 0, bit przeniesienia C (Carry).
Bit 1, bit nadmiaru V (Overflow).
Bit 2, bit zera (Zero).
Bit 3, bit mniejszości od zera (Negative).
Bit 4, bit rozszerzenia X (Extend). Jest on kopią bitu C.
Tryby adresowania
Obsługa przerwań:
Obsługa zdarzeń wyjątkowych inicjują:
Przerwania sprzętowe,
Sygnały błędów układowych (np. BERR),
Pułapki programowe (np. generowane automatycznie przy dzieleniu przez zero).
O priorytecie danego przerwania sprzętowego decydują sygnały na wejściach IPL0 - IPL2.
Istnieje 256 lokacji wektorów przerwań, z których każda zajmuje po 4 bajty.
Odpytywanie – polling
Program czeka na nadejście danych z urządzenia i nie może wykonywać innych zadań
Urządzenie zewnętrze dostarcza dane w trudnym do przewidzenia momencie, ale program jest gotowy w każdej chwili na ich odbiór
Program odbiera dane z urządzenia i musi natychmiast się nimi zająć aby jak najszybciej być gotowym na odbiór następnych danych
Nie wiadomo kiedy nadejdą dane, więc program znów czeka i nie może wykonywać innych zadań
Sytuacja wyjątkowa / przerwanie (Exception / Interrupt)
Program nie czeka na nadejście danych z urządzenia i może wykonywać inne zadania
Urządzenie zewnętrze dostarcza dane w trudnym do przewidzenia momencie, ale sygnalizuje ten fakt do programu i jest on gotowy na ich odbiór wtedy, gdy dane się pojawiają.
Program odbiera dane z urządzenia
… i musi się nimi zająć
… aby po chwili powrócić do poprzednio wykonywanych zadań.
Sytuacja wyjątkowa - odstępstwo od normalnego wykonywania ciągu instrukcji programu w celu obsługi nieprzewidzianego lub/i krytycznego zdarzenia w systemie mikroprocesorowym
Sytuacje wyjątkowe powstają na skutek:
Zdarzenia powstałego na zewnątrz mikroprocesora
Nieprzewidzianego błędu podczas wykonywania programu
Celowego wywołania za pomocą specjalnych instrukcji
Typy sytuacji wyjątkowych:
Reset - sytuacja wyjątkowa polegająca na rozpoczęciu pracy systemu (np. po włączeniu zasilania lub przycisku Reset). Bit S i T rejestru SR ustawiane są na 1 i 0, a maska przerwań na 111, a następnie z pamięci ładowane są zawartości rejestrów:SP (spod adresu 0) i PC (spod adresu 4)
Bus error - sytuacja wyjątkowa występująca przy próbie odwołanie się procesora do obszaru pamięci nieistniejącego fizycznie w systemie. Może być wykorzystywane do realizacji pamięci wirtualnej.
Interrupt - sytuacja wyjątkowa służąca do komunikacji z urządzeniami zewnętrznymi, jeśli dane z urządzenia napływają bardzo wolno lub/i w niemożliwych do przewidzenia momentach.
Przerwania wektorowe polegają na tym, że urządzenie identyfikuje się do procesora podając, po zgłoszeniu i przyjęciu przerwania, swój unikalny numer.
Przerwania autowektorowe polegają na tym, że identyfikacja urządzenia do procesora, po zgłoszeniu i przyjęciu przerwania, określona jest bezpośrednio na podstawie priorytetu zgłaszającego się przerwania
Normal interrupt - przerwanie, którego cykl zgłoszenia, przyjęcia i identyfikacji przebiega bez zakłóceń.
Spurious interrupt - przerwanie, które zostaje zgłoszone i przyjęte, ale procesor nie otrzymuje jego numeru (np. z powodu przerwania sygnalizacji przerwania przez urządzenie lub jego uszkodzenia)
Uninitialized - przerwanie, które może być zgłoszone przez niezainicjowane urządzanie. Przerwanie może być wówczas zgłoszone i przyjęte, ale jako numer przesyłana jest wartość $0F, pozwalająca na odpowiednia reakcję systemu
Trace - sytuacja wyjątkowa wywoływana po wykonywaniu każdej instrukcji programu użytkownika, pozwalająca na uruchamianie programów w trybie pracy krokowej. Oczywiście program obsługi tej sytuacji (już w trybie nadzorcy) przerywany nie jest.
Privilage violation - sytuacja wyjątkowa wywoływana przy próbie wykonywania przez program w trybie użytkownika instrukcji zastrzeżone dla trybu nadzorcy
Illegal instruction - sytuacja wyjątkowa wywoływana przy próbie wykonywania instrukcji, której kod nie odpowiada żadnej istniejącej instrukcji
DIVS,DIVU / Divide by Zero - sytuacja wyjątkowa wywoływana przy próbie wykonania instrukcji dzielenia DIVS, DIVU, jeśli dzielnik jest równy 0.
TRAPV, TRAPcc - sytuacja wyjątkowa wywoływana przez instrukcję TRAPV (ogólnie TRAPcc dla 68020+), jeśli testowany warunek cc jest spełniony.
TRAP #n - sytuacja wyjątkowa wywoływana przez instrukcję TRAP #n (n=0..15). Pozwala na poszerzenie listy instrukcji o 16 nowych pozycji. Wykorzystywane np. do pisania programów przenośnych pomiędzy różnymi systemami (z tym samym procesorem ale różnymi urządzeniami we/wy)
CHK, CHK2 - sytuacja wyjątkowa wywoływana przez instrukcję CHK (i CHK2 dla 68020+), która porównuje operand z podaną wartością, ( CHK <ea>,Dn ). Jeśli operand w Dn.W jest wartością spoza zakresu 0 - <ea>, wywoływana jest sytuacja wyjątkowa.
Line 1010 (A) emulator - sytuacja wyjątkowa wywoływana przy próbie wykonania instrukcji, której kod zaczyna się od wzorca 1010. Pozwala to na zdefiniowanie grupy nowych instrukcji, np. emulujących możliwości nowszych procesorów tej rodziny.
Line 1111 (F) emulator - sytuacja wyjątkowa wywoływana przy próbie wykonania instrukcji, której kod zaczyna się od wzorca 1111. Wykorzystywana zwykle do emulacji instrukcji koprocesora arytmetycznego w systemie z procesorem 68000.
Obsługa sytuacji wyjątkowej:
Dokończenie aktualnie wykonywanej instrukcji,
Wewnętrzne wygenerowanie numeru sytuacji wyjątkowej, rozstrzygnięcie priorytetu,
Odłożenie na stos zawartości rejestrów procesora (zawsze SP i PC, dodatkowe rejestry odkładane są w zależności od typu sytuacji wyjątkowej) tzw. ramka stosu,
Odczytanie z tablicy wektorów adresu procedury obsługi dla danego numeru sytuacji wyjątkowej,
Skok, wykonanie procedury obsługi i powrót z odtworzeniem ramki stosu.
Priorytety sytuacji wyjątkowych:
Sytuacja wyjątkowa o priorytecie niższym może być przerwana przez sytuację o priorytecie wyższym (np. obsługa błędu programowego może być przerwana przez przerwanie zewnętrzne).
Priorytet | Sytuacja wyjątkowa |
---|---|
Najwyższy | Reset Bus error error |
Średni | Trace Interrupt Illegal instruction Privilege violation |
Najniższy | TRAPcc, TRAP #n Divide by Zero, CHK |
Skonstruowany całkowicie od podstaw w 1986 roku przez brytyjską firmę Acorn.
Acorn RISC Machine, „przechrzczony” po kupieniu Acorna przez Olivetti na Advanced RISC Machine.
Każda z instrukcji zawiera 4-bitowy kod, określający warunki jej wykonania, a także bit wskazujący na to, czy dana instrukcja może zmienić zawartość rejestru stanu procesora. Konstrukcja taka pozwala na eliminację wielu rozgałęzień programu, upraszcza znacznie logikę procesora, a równocześnie przyspiesza wykonanie programu dzięki zmniejszeniu objętości kodu.
Procesor Strong ARM, pracuje obecnie z zegarami w zakresie 100-300 MHz przy poborze mocy rzędu zaledwie 1 W !!!
Architektura RISC (Reduced Instruction Set Computers)
Ograniczona lista wykonywanych rozkazów,
Ograniczona ilość trybów adresowania,
Operacje wykonywane na rejestrach (brak rozkazów operujących na pamięci – poza LOAD i STORE)
Operacje na danych w pamięci wykonywane są według schematu Read-Modify-Write,
Proste kody rozkazów -> uproszczenie dekodera rozkazów,
Prosta budowa rdzenia -> mniejsza ilość elementów -> zmniejszony pobór prądu.
Architektura von Neumana
Brak podziału pamięci na pamięć danych i programu,
Możliwość wykonywania kodu programu zarówno z pamięci Flash jak i RAM (możliwość modyfikacji kodu w trakcie wykonywania programu).
Rejestry mikrokontrolerów RISC
Zwiększona liczba rejestrów roboczych,
Wszystkie rejestry są 32-bitowe.
32-bitowa magistrala danych – możliwość jednoczesnego odczytu i zapisu danych, jednostkami 8, 16 lub 32-bitowymi (problem wyrównywania danych).
Wyjątki obsługiwane przez rdzeń ARM7TDMI
SWI – napotkanie specjalnej instrukcji SWI,
Abort – próba wykonania instrukcji, przy pobieraniu której wystąpił błąd w dostępie do pamięci lub próba zapisu/odczytu niewyrównanych danych,
Undefined – napotkanie instrukcji, której rdzeń nie jest w stanie zdekodować,
nIRQ – przerwanie – pojawienie się na linii wejściowej nIRQ stanu niskiego,
nFIQ – przerwanie o wyższym priorytecie od nIRQ – wykorzystywane tam gdzie konieczna jest szybka reakcja,
Tryby pracy rdzenia
Tryby zależne od rodzaju obsługiwanego wyjątku (np. po wystąpieniu wyjątku Abort rdzeń pracuje w trybie Abort),
Tryby pracy w czasie wykonywania programu głównego: Supervisor, System, User (różnią się poziomem praw dostępu do zasobów oraz obszarów pamięci mikrokontrolera),
Tryby pracy rdzenia (z punktu widzenia instrukcji)
Tryb ARM – rozkazy zakodowane na 32 bitach:
Dostępna pełna lista rozkazów,
Rozkazy mogą przyjmować większą liczbę parametrów,
Program złożony z instrukcji ARM działa szybciej,
Rozmiar programu jest większy.
Tryb Thumb – rozkazy zakodowane na 16 bitach:
Program wykonywany jest wolniej ze względu na konieczność konwersji każdej instrukcji do pełnej instrukcji ARM przed jej wykonaniem,
Rozmiar programu jest mniejszy.
Cykl | Rozkaz 1 | Rozkaz 2 | Rozkaz 3 |
---|---|---|---|
1 | Pobranie | ||
2 | Dekodowanie | Pobranie | |
3 | Wykonanie | Dekodowanie | Pobranie |
4 | Wykonanie | Dekodowanie | |
5 | Wykonanie |
Fazy wykonania rozkazu – praca potokowa
Każdy rozkaz wykonywany jest w trzech cyklach
Pobranie,
Dekodowanie,
Wykonanie,
Przetwarzanie odbywa się z zastosowaniem potoku trójpoziomowego,
Efektywny czas wykonania rozkazu to jeden cykl.
Kodowanie rozkazów arytmetycznych i logicznych w trybie ARM:
Regularna budowa kodu – uproszczenie dekodera rozkazów -> zmniejszenie rozmiarów struktury krzemowej -> zmniejszenie poboru prądu
Przesuwnik bitowy:
Wykonuje przesunięcia logiczne, arytmetyczne oraz rotacje użytego w rozkazie operandu,
Uzupełnia możliwości rdzenia o brakujące na liście rozkazów przesunięcia i rotacje,
Służy do skalowania jednego z argumentów w rozkazach arytmetycznych i logicznych,
Umożliwia skalowanie wartości przesunięcia (offsetu) w rozkazach przesłań, pozwala to łatwo indeksować dane o różnych rozmiarach.
STARTUP – początek pracy
Oprogramowanie wektora resetu oraz wektorów przerwań – (dla nieużywanych przerwań umieszczenie pustych funkcji)
Oprogramowanie (konfiguracja) układów peryferyjnych procesora np. zegar, RST, watchdog itp.
Alokacja miejsca na stosy oraz inicjalizacja wskaźników stosów dla wszystkich trybów pracy procesora
skok do dalszej części programu - dla C – skok do procedur inicjalizujących biblioteki i zmienne globalne
Typowy system cyfrowego przetwarzania sygnałów (DSP – Digital Signal Processing) – budowa:
Procesor – układ scalony DSP
CPU – Central Processing Unit
AAU – Auxiliary Arithmeric Unit
SP – Serial Ports
IM – Internal Memory
Pamięć zewnętrzna (w architekturze harwardzkiej pamięć programu i pamięć danych
Porty komunikacji
Szeregowy (np. modem)
Równoległy (np. drukarka)
Przegląd właściwości:
Wydajność 40 MIPS
Statyczny układ CMOS -> 2 tryby zmniejszania poboru mocy(5µA /60mA / 100mA)
Zgodny z TMS3201x, 2x, 2xx
Emulacja przez wydzielony port
Poszerzony zestaw instrukcji
1-9 K słów pamięci RAM (on-chip)
224 K słów adresowalnej pamięci zewnętrznej (64 K - program, 64 K -dane, 64 K - I/O, 32 K – pamięć globalna)
32 b jednostka arytmetyczno-logiczna (ALU)
Akumulator i bufor akumulatora
16 b równoległa jednostka logiczna (PLU)
Instrukcje mnożenia i dodawania w jednym cyklu rozkazowym
8 rejestrów pomocniczych (AR0-AR7) z dedykowaną jednostką arytmetyczną (ARAU) do adresowania pośredniego
11 rejestrów przełączania kontekstu (shadow registers) wspomagających obsługę przerwań
Ośmiopoziomowy stos sprzętowy
Rejestr przesuwający w lewo i w prawo o wartość od 0 do 16 b
2 bufory kołowe do adresowania kołowego
Zdolność powtarzania pojedynczej instrukcji i bloku instrukcji
Instrukcje przesuwania (move) bloków pamięci programu i danych
Dwukierunkowy synchroniczny port szeregowy
Port szeregowy z podziałem czasu
Wewnętrzny zegar
16 portów równoległych we/wy
16 programowalnych generatorów cykli opóźniających (wait-state)
Tryb adresowania indeksowego
Tryb adresowania z rewersją bitów
Przegląd właściwości c.d.:
Pamięć RAM:
Krótki dostęp czasu („on chip RAM”)
Część pamięci może być skonfigurowana jako pamięć programu lub pamięć danych
1056 słów pamięci RAM można zapisywać i odczytywać w pojedynczym cyklu („Dual Access Ram”)
Zwykle po uruchomieniu procesora program, dane oraz informacje o konfiguracji są ładowane do pamięci RAM, skąd program jest uruchamiany
Pamięć ROM
Wewnętrzna pamięć programu (inicjalizacja i test) od 2 do 16K słów 16-bitowych
Programowanie możliwe tylko podczas produkcji (można zamawiać w TI)
Możliwość dołączenia zewnętrznej pamięci ROM
Rdzeń – Zestaw równolegle działających układów arytmetycznych, logicznych i rejestrów (duża prędkość). Zgodny z TMS3201x/2x:
Układ mnożący:
Wykonuje mnożenie dwóch liczb 16-bitowych (U2) dając 32-bitowy iloczyn
Umożliwia filtrację sygnałów o dużej częstotliwości próbkowania (splot, korelacja)
Zawiera:
Rejestr pomocniczy T (Temporary register) do zapamiętania mnożnej
Rejestr P (Product register) do przechowania iloczynu
Mnożarkę równoległą 16x16b
Jednostka arytmetyczno-logiczna (ALU)
Współpracując z akumulatorem wykonuje dodawanie, odejmowanie i działania boolowskie, np. AND i OR
Wyniki są zapisywane z akumulatorze
Rejestr przesuwający (shifter)
Umożliwia skalowanie danych – poprzez przesunięcie ciągu bitów w lewo i w prawo
Mniej znaczące bity są wypełniane zerami
Pozwala na uniknięcie przepełnienia
Akumulator
Rejestr pamięciowy 32-bitowy
Współpracuje z układem mnożącym, pamięcią, ALU i rejestrem skalującym
Możliwy jest dostęp do części MSB (ACCH) i LSB (ACCL) akumulatora
Akumulator posiada bufor 32-bitowy (pamięć tymczasową)
Rejestry pomocnicze
AR0-AR7: pamięć pomocnicza danych lub pamięć wskaźników do danych (przy adresowaniu pośrednim)
Rejestry AR mogą być łatwo inkrementowane lub dekrementowane
Operacje na danych w rejestrach pomocniczych są wykonywane przez ARAU – niezależną jednostkę arytmetyczną (działającą w kodzie naturalnym)
Równoległa jednostka logiczna (PLU)
Umożliwia wykonywanie operacji logicznych bez zmiany zawartości akumulatora (np. bity rejestru stanu mogą być zmieniane bez spowalniania obliczeń)
Rejestry stanu i sterowania
Rejestry stanu ST0 i ST1
Rejestr stanu trybu procesora (PMST)
Rejestr sterujący buforów kołowych (CBCR)
Ustawiając lub zerując bity w rejestrach można rekonfigurować procesor
Układy peryferyjne – umożliwiają współpracę z urządzeniami zewnętrznymi
Port szeregowy
Synchroniczny
Dwukierunkowy i podwójnie buforowany
Służy np. do współpracy z układami A/C i C/A, kodekami
Port szeregowy TDM
Do komunikacji między układami w systemie wieloprocesorowym
Obsługuje do 7 procesorów zewnętrznych
Układ czasowy
Programowalny
16-bitowy
Umożliwia podział częstotliwości zegara w stosunku od ½ do 1/32,
(np. do sterowania zewnętrznych układów A/C i C/A)
Generator opóźnień
Do współpracy procesora z wolniejszymi pamięciami zewnętrznymi (procesor może czekać 1, 2, 3 lub 7 cykli)
Porty równoległe
Do komunikacji z urządzeniami o prostych układach dekodujących (instrukcje IN oraz OUT)
Przerwania:
Zawartość licznika rozkazów zostaje zapamiętana (na 8-poziomowym stosie sprzętowym razem z adresami procedur – uwaga przy ich wywoływaniu z procedury przerwania)
Zapamiętanie kontekstu: zawartość rejestrów rdzenia zostaje zapamiętana (na stosie 1-poziomowym -> ‘C50 nie obsługuje przerwań zanurzonych)
Licznik rozkazów zostaje załadowany adresem procedury obsługi przerwania (ISR)
Procesor wykonuje program procedury przerwania aż do napotkania instrukcji RETE lub RETI
Zapamiętany na stosie kontekst przerwania: PC, ACC, ACCB, PREG, ST0-1, PMST, TREG0-2, INDX, ARCR.
Tryby adresowania:
Bezpośredni (direct)
2 części adresu bezpośredniego
9-bitowy wskaźnik strony pamięci
7-bitowy adres komórki na bieżącej stronie (DMA – Data Memory Address)
Instrukcje wykorzystujące adresowanie bezpośrednie:
AND (akumulator i zaadresowana komórka)
ADD (akumulator i zaadresowana komórka)
OR (akumulator i zaadresowana komórka)
LST (załaduj rejestr stanu zawartością zaadresowanej komórki)
Pośredni (indirect)
Rejestr AR zostaje wybrany przez załadowanie jego numeru (0..7) do rejestru ARP
Zawartość rejestrów ARx jest obliczana przez ARAU, niezależnie od AL.
Instrukcja LAR ładuje żądany adres do aktualnie wskazywanego rejestru AR
Instrukcje operujące na rejestrach pomocniczych:
LAR (załaduj daną do ARx)
ADRK (dodaj stałą do ARx)
SBRK (odejmij stałą od ARx)
MAR (zmodyfikuj ARx lub ARP po skopiowaniu ARP do ARB)
Natychmiastowy (immediate)
Instrukcja zawiera wartość operandu
Rejestrami dedykowanymi (dedicated register)
Istnieje 9 instrukcji, które korzystają z rejestrów dedykowanych
Rejestry dedykowane:
BMAR (rejestr adresu przesuwani bloku)
BLDD, BLDP, BLPD – przesunięcie danych (zawartość BMAR wskazuje adres źródłowy i docelowy)
MADD (multiply and accumulate with data move and dynamic addressing)
MADS (multiply and accumulate with dynamic addressing)
DBMR (rejestr dynamicznych manipulacji bitowych)
APL, OPL, CPL, XPL – operacje logiczne na danych z pamięci i zawartości rejestru DBMR
Rejestrami umieszczonymi w pamięci (memory-mapped register)
Rejestry te są umieszczone na stronie zerowej.
Dostęp do nich nie wymaga modyfikacji DP
Instrukcje
LAMM (załaduj do akumulatora wartość rejestru w pamięci)
SAMM (przechowaj zawartość akumulatora w rejestrze pamięci)
LMMR (załaduj rejestr umieszczony w pamięci)
SMMR (zapisz wartość rejestru umieszczonego w pamięci)
Kołowy (circular)
Tryb adresowania użyteczny w realizacji splotu, korelacji, filtrów i do generowania sygnałów okresowych.
OGÓLNA CHARAKTERYSTYKA
Konstrukcja z roku 1989
Mikroprocesor zawierający mechanizmy wspomagające prace wielozadaniowa
Mikroprocesor 32-bitowy
Praca w trybach:
Rzeczywistym (ang. real)
Chronionym (wirtualnym) (ang. protected / virtual) z możliwością pracy w wirtualnym trybie 8086
Możliwość zaadresowania do 4GB pamięci fizycznej
Podział pamięci na segmenty oraz na strony
Wbudowana pamięć podręczna (ang. cache)
Wbudowana jednostka operacji zmiennopozycyjnych
ARCHITEKTURA
Integracja bloków operacji stało oraz zmiennoprzecinkowych pamięcią podręczną
Szerokie magistrale wewnętrzne, przetwarzanie potokowe
Współpraca z zewnętrzną pamięcią w obu kierunkach przez bufory – jądro procesora i pamięć pracują asynchronicznie
Seryjne przesłania po szynie do/z pamięci (ang.burst)
REJESTRY
Zawartość rejestrów ogólnego przeznaczania zależna od aktualnie wykonywanego zadania – ich zawartość automatycznie przeładowywana w trakcie zmiany aktualnie wykonywanego zadania (zmiana kontekstu)
Rozkazy wykonują operacje 1, 8, 16, 32 oraz 64 bitowe oraz operacje na polach bitowych od 1 do 32 bitów w obrębie rejestrów ogólnego przeznaczenia
Rejestry segmentowe umożliwiają jednoczesny dostęp do 6 segmentów pamięci (każdy do 4GB); dwa z nich umożliwiają dostęp do kodu programu i stosu; rejestry deskryptorów nie są dostępne programowo i są automatycznie ładowane podczas przeładowania selektora
Zależnie od trybu pracy zawartość rejestrów segmentowych jest różnie interpretowana; w trybie rzeczywistym segmenty maja długość 64KB; w trybie chronionym dowolna d4ugość a* do rozmiaru ca4ej pamięci
Wskaźnik rozkazów zawiera przesuniecie (ang. offset) nast2pnej do wykonania instrukcji. Przesuniecie jest liczone wzgl2dem segmentu CS
REJESTRY – REJESTR FLAGOWY
ID – możliwość zmiany tego bitu oznacza wspieranie instrukcji CPUID
VIP/VIF – zachowują w systemie wieloprocesorowym wirtualny obraz flagi IF
AC – wymusza generacje niepowodzenia (fault) w przypadku niepoprawnego ulokowania argumentów
VM – flaga pracy w wirtualnym trybie 8086 (tylko w trybie chronionym)
RF – wykorzystywana wraz z rejestrami od punktów zatrzymania (ang. brakpoint)
NT – informuje, ze wykonanie aktualnego zadania odbywa się w sposób zagnieżdżony w innym zadaniu
IOPL – maksymalna wartość CPL (Current Privilege Level) zezwalajca na wykonanie instrukcji I/O
OF – flaga przepełnienia dla liczb w kodzie U2 (ustawiana gdy następuje przeniesieniu/pożyczka z na/z bitu znaku a nie następuje poza bit znaku lub vice-versa)
DF – określa kierunek przesłań podczas operacji blokowych
IF – odblokowuje przerwania od zewnętrznego pinu INTR
TF – flaga pracy krokowej SF, ZF, AF, PF oraz CF – flagi znaku, zera, przeniesienia pomocniczego, parzystości oraz przeniesienia
REJESTRY – STERUJACE, TABLIC DESCRYPTORÓW
Rejestry sterujące CRx – CR1 zarezerwowany dla przyszłych wersji procesora
CR0.PR (Paging Enable) – steruje mechanizmem stronicowania,
CR0.CD (Cache Disable) – steruje wewnętrzną pamięcią notatnikowa
CR0.NW (Not-write Through) – jednoczesny zapis do pamięci zewnętrznej w przypadku trafionego zapisu do pamięci „cache”
CR0. AM (Alignment Mask) – steruje kiedy bit flagowy AC generuje niepowodzenie braku wyrównania argumentu
CR0. WP (Write Protect) – umożliwia zapis stron „read-only” z poziomów ochrony od 0 do 2
CR0. NE (Numerics Exception) – steruje zgłaszaniem przerwań od koprocesora numerycznego
CR0. TS (Task Switched) – ustawiany automatycznie podczas przełączenia zadania
CR0. EM (Emulate Coproces or) – umożliwia generacje wyjątku podczas próby wykonania operacji zmiennopozycyjnej (istotne dla 486 SX)
CR0. MP (Monitor Coproces or) – w połączeniu z flaga CR0.TS określa, kiedy instrukcji koprocesora WAIT wymaga obsłużenie
CR0. PE – (Protection, Enable) – steruje przełączaniem w tryb chroniony
CR2 – zawiera adres liniowy, który spowodował ostatnie niepowodzenie dostępu do strony
CR3 – zawiera adres fizyczny katalogu tablic stron. Katalog jest zawsze wyrównany do 4kB – najmłodsze 12 bitów nie ma znaczenia.
CR3.PCD (Page Cache Disable), CR3. PWT (Page Write-Through) – sterują zasadami zapisu katalogu tablic do pamięci notatnikowej i zewnętrznej
CR4.PSE (page Size Extensions) – zezwala na 4MB rozmiar strony
CR4.PVI (Protected mode Virtual Inter upts) – umożliwia pewnym programom zaprojektowanym do pracy na poziomie ochrony 0 pracować na poziomie 3
CR4.VME (Virtual-8086 Mode Extensions) – zarządza wirtualna flaga przerwania w wirtualnym trybie 8086
GDTR (Global Descriptor Table Register) – zawiera 32-bitowy adres liniowy oraz 16-bitowy rozmiar globalnej tablicy deskryptorów (globalny obszar pamięci w systemie)
IDTR (Inter upt Descriptor Table Register) – zawiera 32-bitowy adres liniowy oraz 16-bitowy rozmiar tablicy deskryptorów przerwań (globalny obszar pamięci w systemie)
LDTR (Local Descriptor Table Register) – zawiera selektor dla lokalnej tablicy deskryptorów (obszar pamięci w systemie związany z aktualnie wykonywanym zadaniem)
TR (Task Register) – zawiera selektor dla segmentu TSS (Task Switching Segment) (obszar pamięci w systemie związany z aktualnie wykonywanym zadaniem zawierający kontekst zadania)
ORGANIZACJA PAMIECI
Pamięć podzielona jest na bajty, słowa (dwa bajty w kolejnych komórkach) oraz podwójne słowa (cztery bajty o kolejnych adresach)
Dodatkowo pamięć może by. podzielona na zmiennej ale określonej długości segmenty, które mogą być „wymiatane” na dysk i współdzielone miedzy zadaniami
Dodatkowo pamięć jest dzielona na 4kB strony
Segmentacja jest użyteczna dla programistów użytkowych (logiczny podział na moduły), stronicowanie dla programistów systemowych (optymalizacja wykorzystania fizycznej pamięci operacyjnej)
W trybie rzeczywistym adres fizyczny liczony jest z zawartości przesuniętego rejestru segmentowego oraz wartości przesunięcia (maksymalnie 1MB pamięci fizycznej); jest to tryb procesora po włączeniu zasilania (niemal identyczny z praca procesora 8086)
W trybie chronionym wyróżnia się przestrzenie adresowe:
Logiczna (wirtualna),
Liniowa
Fizyczna (maksymalnie 4GB pamięci fizycznej i 64TB pamięci wirtualnej!)
ORGANIZACJA PAMIECI – TRYBY
Tryb rzeczywisty
Pamięć podzielona jest na stałej długości segmenty po 64kB
Na zawartości segmentów można dowolnie wykonywać operacje odczytu, zapisu lub wykonania kodu
Segmenty mogą na siebie zachodzić; fizyczna komórka pamięci może posiadać 2 różne adresy logiczne
Adresy od 00000H do 003FFH są zarezerwowane na tablice wektorów przerwań
Adresy FFFFFFF0F do FFFFFFFFH zarezerwowane są dla inicjacji systemu
Stronicowanie nie jest dozwolone w trybie rzeczywistym
Tryb chroniony
Rozszerzenie pamięci widocznej dla programu z maksymalnej pamięci fizycznej 4GB do pamięci wirtualnej 64TB (2^46)
Mechanizmy ochrony pamięci oraz dostępu do urządzeń we/wy
Praca w trybie wirtualnym 8086 umożliwiająca wielozadaniowe uruchamianie programów utworzonych dla procesora 8086
Składowe adresu to 16-bitowy selektor oraz 32-bitowe przesunięcie
Stronicowanie pracuje na adresie liniowym powstałym na skutek segmentacji
SEGMENTACJA
Segmentacja służy do enkapsulacji regionów pamięci np. kod wykonywalny programu powinien być zawarty w jednym segmencie
Informacja o segmencie zawarta jest w 8-bajtowej strukturze danych zwanych deskryptorem
Wszystkie deskryptory przechowywane są w tablicach obsługiwanych bezpośrednio przez mikroprocesor
Tablice Global Descriptor Table, Local Descriptor Table i Interrupt Descriptor Table; każda zawiera od 1 do 8192 8-bajtowe descryptory; najstarszych 13 bitów selektora stanowi indeks w odpowiedniej tablicy deskryptorów
Każda tablica ma z sobą związany rejestr (GDTR, LDTR i IDTR) zawierający informacje o fizycznym adresie bazowym i rozmiarze odpowiedniej tablicy; wyjątkiem LDTR będący selektorem do GDT z informacja o położeniu LDT
Rozmiar pamięci wirtualnej: 2*(2^13)*(2^32) = 2^46 (lokalna/globalna pamięć * liczba segmentów * mak. Rozmiar segmentu)
GDT zawiera informacje dostępne dla wszystkich zadań w systemie (zadanie – program wykonywany niezależnie od innych (lub o ściśle zdefiniowanych powiązaniach)
LDT zawiera informacje widoczne wyłącznie dla aktualnie wykonywanego zadania – segment pamięci może być dostępny wyłącznie, gdy jego deskryptor znajduje się w GDT lub LDT
IDT zawiera deskryptory wskazujące na miejsca w pamięci zawierające procedury obsługi 256 przerwań
Rejestry segmentowe zawierające selektory posiadają pamięć umożliwiającą zapamiętanie wszystkich 8 bajtów odpowiedniego deskryptora
DESKRYPTORY
Deskryptor zawiera atrybuty wskazywanego obszaru pamięci liniowej
Deskryptory niesystemowe zawierają kod programu lub dane; zawierają informacje czy segmenty danych można zapisywać, czy segmenty kodu można odczytywać i czy segment danych znajduje się poniżej czy powyżej adresu bazowego
DESKRYPTORY SYSTEMOWE
Deskryptor LDT– wskazuje na segmenty w pamięci zawierajce tablice LDT
Deskryptor TSS (Task State Segment) – TSS zawiera kontekst zadania (wszystkie rejestry) oraz pola łączące umożliwiające zagnieżdżanie zadań; rejestr TR zawiera selektor wskazujący na TSS aktualnego zadania
Deskryptory bram (gate) – używane w celu kontroli dostępu do punktów wejścia do segmentów kodu; kontrola dostępu umożliwia sprawdzenie uprawnień do wykonania kodu w segmentach użytkowników i systemu operacyjnego; różne typy deskryptorów bram:
call (używane do zmiany poziomu dostępu),
task (używane do przełączania zadań),
interrupt (obsługa przerwań + blokada przerwań)
trap (obsługa przerwań, ale bez blokady przerwań)
INICJALIZACJA - PRZEJSCIE DO TRYBU CHRONIONEGO
Procesor po sygnale RESET znajduje się w trybie rzeczywistym
Inicjalizacja wymaga, aby GDTR oraz IDTR pokazywały na poprawne GDT i IDT; IDT musi zawierać co najmniej 32 deskryptory (256 bajtów); GDT musi zawierać deskryptory dla inicjującego segmentu danych oraz kodu
GDT zawiera deskryptor segmentu kodu i danych/stosu każdy o długości 4GB na poziomie ochrony 0
Przełączanie trybów następuje poprzez ustawienie bitu PE w CR0 instrukcja MOV CR0, R/M; następnie wykonuje się międzysegmentowy skok JMP w celu załadowania CS oraz finalnie ładuje wartości selektorów do rejestrów segmentowych
STRONICOWANIE
Podział na strony nie ma odniesienia do podziału programu na moduły – stałej długości strona to tylko fragment modułu kodu lub danych
Tylko niewielka liczba stron programu musi jednocześnie przebywać w pamięci – nie musi to być cały segment
Stronicowanie przekształca adres liniowy na adres fizyczny i jest dwupoziomowe: katalog tablic stron i tablice stron; każda z tych struktur zajmuje jedna 4kB stron2
Rejestr CR3 zawiera 20 starszych bitów rejestru bazowego katalogu tablic stron
Rejestr CR2 zawiera 32-bitowy adres liniowy, który spowodował niepowodzenie dostępu do strony
Tablice stron same są stronami i mogą być wymiatane na dysk
STRONICOWANIE - POLA KATALOGU TABLIC I TABLICY STRON
Pola wpisu w katalogu tablic stron i tablicy stron:
20 starszych bitów to adres bazowy tablicy stron lub strony
OS RESERVED – do swobodnego wykorzystania przez system operacyjny np. do wyznaczania strony najdawniej używanej
P (Present) – czy pole tablicy wskazuje na stronę; jeżeli nie pole może być swobodnie wykorzystane przez OS
A (Access ) – ustawiany automatycznie przez procesor podczas dostępu (odczyt lub zapis) do wskazywanej strony
D (Dirty) – ustawiany automatycznie przed zapisem do wskazywanej strony; niezdefiniowane zachowanie dla katalogu tablic stron
PWT – nadzoruje strategie współpracy z pamięcią podręczną drugiego poziomu
PCD – nadzoruje współpracę z pamięcią notatnikowa na poziomie strony
Mechanizmy ochrony podczas stronicowania pracuje na 2 poziomach:
Użytkownika dla segmentów o poziomie ochrony 3
Administratora dla segmentów na poziomie 0, 1 i 2; w ustalaniu zasad ochrony współdziała również bit WP z rejestru flagowego
STRONICOWANIE - OPIS
Podział segmentów na strony pozwala na zapisanie segmentu niekoniecznie w postaci ciągłej. Poszczególne jego strony zapisywane są w nieobsadzone 4kB obszary pamięci dysponowanej.
Stronicowanie powoduje oczywiście wprowadzenie dodatkowego etapu przy adresacji. Mianowicie przeliczenie adresu logicznego na fizyczny. Proces przeliczania powoduje wydłużenie czasu realizacji dostępu, a także narzuca wymogi na posiadanie dodatkowego obszaru pamięci operacyjnej, gdzie znajduje się „przewodnik” po stronach. Są to tak zwane tablice translacji (struktura dwupoziomowa) umożliwiające przeliczenie adresu liniowego na fizyczny. Aby przeliczyć adres konieczne są kontakty z tzw. katalogiem tablic i indywidualną tablicą stron. Należy pamiętać, że każde zadanie może (nie musi) dysponować własnymi tablicami translacji. Adres bazowy tablicy wyższego rzędu (tzw. katalog tablic) zawarty jest w rejestrze CR3.
Inicjacja stronicowania to po prostu ustawienie bitu PG w rejestrze CR0 (rozkaz LMSW nie może być w tym przypadku użyty, ponieważ ma on dostęp tylko do młodszego słowa CR0, a bit PG znajduje się w starszym słowie). Oczywistym jest, że należy przynajmniej częściowo mieć przygotowaną tablicę translacji, zapisaną wartość w rej. CR3, a samo przełączenie nie może spowodować zmiany adresu, tzn. przeskoku µP w inne miejsce. Następujący po ustawieniu bitu PG proces translacji musi spowodować przejście z adresu (jest to od tego momentu adres liniowy) na ten sam adres fizyczny. Oznacza to, że przełączenia dokonujemy na tzw. stronie transparentnej.
Ustawienie bitu PG nie może nastąpić wcześniej niż przejście do trybu wirtualnego (możemy uczynić to równocześnie). Pierwszą instrukcją po ustawieniu PG musi być skok (najczęściej do następnej lokacji). Wycofanie się ze stronicowania to wyzerowanie bitu PG (tryb wirtualny dalej aktualny). Możliwe jest oczywiście równoczesne przejście w tryb rzeczywisty z wyłączeniem stronicowania. Operacja ta musi być zrealizowana także na stronie transparentnej.
Gdyby µP przy translacji każdego adresu (kodu, danych i stosu) sięgał dwukrotnie do tablic translacji, działanie takie nie miałoby sensu (kilkakrotne spowolnienie pracy µP). Dlatego też dysponuje on wewnętrzną, szybką pamięcią asocjacyjną, w której zapisuje opisy ostatnio używanych stron. Jeżeli przykładowo pamięć zawiera 128 pozycji, to można zapamiętać sposób translacji obszaru o rozmiarze 512kB. µP na początku translacji szuka oczywiście opisów stron w pamięci asocjacyjnej, a dopiero potem sięga do tablic zewnętrznych.
Oczywistym jest, że po takim kontakcie uzupełnia pamięć asocjacyjną ewentualnie usuwając z niej opisy stron najdawniej używanych (gdy pamięć jest „pełna”). W przypadku, gdy podczas wykonywania instrukcji µP stwierdzi równocześnie błąd związany z segmentacją i stronicowaniem, to pierwszy zgłaszany jest błąd segmentacji, a po jego obsłudze i ponowieniu wykonania instrukcji zgłaszany jest stan wyjątkowy błędu stronicowania. W tym przypadku rejestr CR2 podaje nam błędny adres liniowy, który spowodował ten wyjątek. Wyjątek stronicowania ma numer 14 i umieszcza na stosie dodatkowe informacje o szczegółowej przyczynie.
PAMIEC NOTATNIKOWA (CACHE)
Cztery bloki pamięci po 2kB każdy; każdy blok podzielony na 128 16- bajtowych zestawów
Z każdym blokiem pamięci związany blok katalogu – tu przechowywane 21- bitowe adresy pamięci fizycznej, której „lustrem” jest zestaw oraz bit znacznika i 3 bity LRU
Wszystkie dane różniące się na 21 bardziej znaczących bitach
Odwzorowywane na 4 zestawy; bity LRU modyfikowane są podczas operacji dostępu do pamięci tak, aby wskazywały na najdawniej używany zestaw; w przypadku chybienia dane zapisywane są do zestawu najdawniej używanego
Włączenie mechanizmu pamięci notatnikowej oznacza, ze procesor zawsze odczytuje dane z pamięci w porcjach po 16 bajtów w szybkich operacjach transferów blokowych
W przypadku zmiany danej znajdującej się w pamięci notatnikowej zmieniana jest jednocześnie pamięć notatnikowa jak i pamięć główna
Wbudowane mechanizmy śledzenia zmian pamięci w przypadku dostępu do niej urządzeń innych niż procesor
Wbudowane mechanizmy współpracy z zewnętrzną pamięcią drugiego poziomu
Struktura potoku jednostki centralnej procesora RISC
Struktura cyklu rozkazowego procesora
Rozkaz realizuje się w czterech etapach:
cykl pobrania rozkazu,
dekodowanie rozkazu,
wykonanie rozkazu,
zwiększenie licznika rozkazów.
Cykl rozkazowy procesora
W wykonaniu każdej instrukcji przez procesor można wyróżnić kilka faz. Typowo wyróżnia się następujące fazy:
FETCH - pobranie instrukcji
DECODE - dekodowanie obrazu binarnego instrukcji
READ - odczyt argumentów instrukcji z rejestrów procesora lub z pamięci
EXECUTE - wykonanie operacji arytmetycznej lub logicznej
WRITE - zapis wyniku do rejestru lub pamięci
Należy zauważyć, że dla wielu instrukcji niektóre z wymienionych faz są zbędne, np. instrukcja przesłania międzyrejestrowego nie wymaga użycia jednostki arytmetyczno-logicznej.
Potok o „głębokości” 5: Wykonywanie każdej instrukcji trwa 5 cykli, ale efektywnie tylko jeden.
Podstawowe problemy:
Oczekiwanie na wyniki
synchronizacja potoku - "odczyt po zapisie„ (RAW - Read After Write)
SCOREBOARDING - flagi wskazujące na ważność zawartości rejestrów procesora
BYPASSES (obejścia) - dodatkowe szyny wewnątrz procesora
Rozgałęzienia programu
Sposoby minimalizacji wad:
Przewidywanie skoków - Współczesne procesory potrafią przewidywać skoki z 90% skutecznością
Wykonywanie jednoczesne obu rozgałezień programu (architektura hiperskalarna) do czasu sprawdzenia warunku rozgałęzienia
Opóźnienie skoków w potoku - Skok opóźniony (delayed branch): wykonaj następną instrukcję za bieżącą, a potem skocz
Magistrala - „wąskie gardło”
Różna długość instrukcji
Podwójne pobranie z pamięci
Efekt ten NIE WYSTĘPUJE w procesorach o architekturze RISC (LES)
konieczność pobierania równocześnie instrukcji (kodu) oraz argumentów instrukcji (danych) z tej samej pamięci
MNEMONIK | OPIS | OPERACJA | KOD (HEX ) |
BAJTY/ CYKLE |
UWAGI |
ACALL adr11 | Subroutine call on page | SP ←SP+1 (SP)← PC7-0 SP← SP+1 (SP)← PC 15-8 PC10-0←adr11 |
11,31,51 71,91, B1,D1, F1 |
2/2 | adr11- adres 11 - bitoey |
LCALL adr16 | Subroutine call | SP ←SP+1 (SP)← PC7-0 SP← SP+1 (SP)← PC 15-8 PC ← adr16 |
12 | 3/2 | adr16 - adres 16 - bitowy |
RET | Return from subroutine |
PC15-8←(SP) SP← SP-1 PC7-0←(SP) SP← SP-1 |
22 | 1/2 | |
RETI | Return from interrupt |
PC15-8←(SP) SP← SP-1 PC7-0←(SP) SP← SP-1 |
32 | 1/2 | |
PUSH ad | Push onto stack | SP ←SP+1 (SP)← <ad> |
C0 | 2/2 | ad - bezpośredni adres 8 - bitowy |
POP ad | Pop from stack | <ad>← (SP) SP← SP-1 |
ad - bezpośredni adres 8 - bitowy |
Mikrooperacje to elementarne sygnały elektryczne, służące do sterowania przepływem danych pomiędzy rejestrami. Realizowanie są synchronicznie razem z sygnałem zegarowym (RISC) lub sygnałem fazy (CISC).
Mikrooperacja – elementarna czynność układu sekwencyjnego, którą układ ten może zrealizować bez potrzeby rozkładania na czynności prostsze
Oznaczenia:
→ kier. transferu A → B
( ) część rejestru MBR(H), MBR(L)
: warunek f. sterującej P: A → B
, oddzielenie mikrooperacji
A → B, PC ← PC + 1
=> Przesłanie wielobitowe
Mikrooperacje:
TRANSFERU
ARYTMETYCZNE
LOGICZNE
NA BITACH
PRZESUNIĘĆ
W modelu von Neumanna zadaniem procesora jest przetworzenie danych, których jedynym źródłem jest pamięć. Wykonanie rozkazu zaczyna się od pobrania z pamięci słowa traktowanego jako kod instrukcji. Kolejno następuje pobranie danych z pamięci, ich przetworzenie i zapis wyniku do pamięci. Wynik rozkazu zależy od wykonania rozkazów poprzednich. Chwilowe umieszczenie danych w rejestrach procesora służy zmniejszaniu obciążenia magistrali i nie jest sprzeczne z modelem przetwarzania.
Podstawową rolę pełni pamięć zorganizowana zgodnie z następującymi zasadami:
Informacja jest przechowywana w komórkach o jednakowych rozmiarach, każda komórka zawiera jednostkę informacji zwaną słowem
Znaczenie słów nie jest przypisane ich treści, sposób przechowania danych i nstrukcji jest identyczny (kod informacji nie zawiera żadnej etykiety)
Struktura (kod) słowa nie pozwala odróżnić instrukcji od danych, interpretacja zależy tylko od stanu maszyny w momencie pobierania słowa z pamięci
Komórki tworzą zbiór uporządkowany, a każdemu słowu można jednoznacznie przypisać unikatowy wskaźnik lokacji (adres) określający pozycję w sekwencji
Zawartość komórki pamięci może zmienić tylko procesor dokonując (w wyniku wykonania rozkzu) przesłania słowa do pamięci
W koncepcji von Neumanna termin pamięć oznacza tę część magazynu informacji, którą procesor może zaadresować podczas wykonywania pojedynczego rozkazu.
Informacje z innych części magazynu informacji (nazywanych pamięcią wtórną lub masową) mogą być przetworzone dopiero po ich uprzednim skopiowaniu do adresowanej przez procesor pamięci głównej (zwaną operacyjną lub pierwotną)
Program jest sekwencją rozkazów/poleceń, zatem podczas wykonywania rozkazu powinien być znany adres lub sposób wyznaczania kolejnego rozkazu. Układ wytwarzający adres kolejnego rozkazu podczas wykonywania poprzedniego nosi nazwę licznika rozkazów
W architekturze Harwardzkiej rozdzielono pamięć główną na osobne pamięci danych i rozkazów. Umożliwia to nie tylko równoczesne pobieranie kodu rozkazu i argumentów, ale także zabezpieczenie kodu przed przypadkowym zniszczeniem.
Oprócz funkcji przetwarzania wynikający z realizowanego algorytmu, komputer powinien wypełniać również wiele innych zadań, związanych zwłaszcza z kontrolą poprawności wykonania rozkazów.
W architekturze Harward mamy 2 szyny danych oraz 2 szyny adresowe. Transmisja danych i instrukcji odbywa się w sposób równoległy. Architektura ta jest prostsza od von Neumanna i ma dużo większą szybkość działania oraz obsługuje mechanizm potokowy.
Cykl – stan pomiędzy kolejnymi zmianami stanu. Najkrótszy czas między zmianami stanu procesora to cykl procesora, czas potrzebny na zmianę stanu pamięci to cykl pamięci (cykl rozkazowy), który może obejmować kilka cykli procesora
Rozkaz – jest funkcją rx∊R:M->M, która przeprowadza stan wejściowy na wyjściowy. Rozkazy są zakodowane i umieszczone w pamięci jak inne dane. Sekwencja rozkazów tworzy makrorozkaz. Wykonanie każdego rozkazu rozpoczyna się od pobrania jego kodu z pamięci. Kolejnym etapem jest dekodowanie rozkazu w celu wytworzenia sygnałów sterując, zwykle połączone z wytworzeniem adresów argumentów. Po ewentualnym odczycie argumentu z pamięci następuje wytworzenie wyniku. Wynik musi zostać zapamiętany w pamięci lub rejestrze procesora. Wykonanie każdego rozkazu powoduje zmianę stanu procesora, nawet gdy pozornie nie jest wytworzony żaden wynik.
Przetwarzanie (proces kojarzenia). Wykonanie każdego etapu przetwarzania wymaga użycia układu funkcjonalnego realizującego potrzebną funkcję i dostarczenia do tego układu danych stanowiących argumenty funkcji. Proces przetwarzania jest ciągiem kojarzeń ortogonalnych zasobów: danych oraz układów/jednostek wykonawczych.
Zależnie od etapu wykonania rozkazu wystąpi w tym procesie jedna z dwóch opcji:
Znana jest funkcja i należy dokonać wyboru jej argumentów
Znane są argumenty i należy wskazać właściwą funkcję.
Drugi sposób przetwarzania może wystąpić w etapie wykonania, a także w etapie dekodowania. W innych etapach potrzebne działania są dokładnie określone.
Czas cyklu procesora zależy od złożoności instrukcji i konstrukcji układów je realizujących oraz technologii wykonywania.
Przetwarzania rozkazu: Kolejnymi rozkazami przetwarzania rozkazu są: pobranie rozkazu z pamięci, dekodowanie i wykonanie (w szczególności transfer rejestr-pamięć)
Tryby adresowania:
Bezpośredniego rejestru
Danych (1)
Adresowego (2)
Pośredniego
Rejestrem adresowym (3)
Z postinkrementacją (4)
Z predekrementacją (5)
Z przesunięciem (6)
Z indeksem (7)
Licznikiem programu
Z przesunięciem (8)
Z indeksem (9)
Absolutne
Krótkie (10)
Długie (11)
Natychmiastowe (proste)
Krótkie (12)
Długie (13)
Implikowane (niejawne) (14)
4 rodzaje rejestrów:
8 32-bitowych rejestrów danych (D0-D7)
8 32-bitowych rejestrów adresowych (A0-A7)
32 bitowy rejestr licznika programu (PC)
16-bitowy rejestr statusowy (SR)
Rejestry ogólnego przeznaczenia = adresowe + danych
W procesorach ARM stosuje się mechanizm bankowania rejestrów, który polega na tym, że gdy procesor zmienia tryb ochrony zestaw niektórych rejestrów jest podmieniany na inny. W efekcie każdy tryb ochrony posiada własny rejestr, który jest widoczny tylko w tym trybie.
Potok trójpoziomowy (pobranie->dekodowanie->wykonanie)
Cechy ARM:
32-bitowy procesor zgodny z RISC
Procesor zoptymalizowany pod względem poboru mocy
Różne tryby pracy
32-bitowe instrukcje ARM
16-bitowe instrukcje Thumb
Praca w trybie Big lub Little Endian
Szybka obsługa przerwań, aplikacje czasu rzeczywistego
Pamięć wirtualna
Lista wydajnych instrukcji (optymalizacja na podstawie RISC i CISC)
Sprzętowe wsparcie dla języków wyższego poziomu
Rejestry:
PC – licznik programu
CPSR – licznik statusowy, obecny status
SPSR – licznik statusowy, dostępny w różnych trybach uprzywilejowania
LP – licznik powrotu, wykorzystywany podczas wywołania funkcji
SP – wskaźnik stosu
R0-R12 – rejestry ogólnego przeznaczenia
7 trybów pracy:
User
System
Supevisor
Abort
Undef
IRQ
FIQ
Mechanizm segmentacji: tłumaczy adres wirtualny na liniowy
Mechanizm stronicowania (?): tłumaczy adres liniowy na fizyczny
Adresowanie wirtualne (translacja adresu logicznego na liniowy)
Segment jest wybierany za pomocą 16-bitowego selektora. Selektor wskazuje na deskryptor opisujący segment. Deskryptor jest umieszczony w tablicy deskryptorów. W deskryptorze jest zawarty adres początku segmentu.
W trybie chronionym rejestry segmentowe zawierają selektory, które wskazują na pole w tablicy deskryptorów. Ze wskazanego element tablicy deskryptorów procesor pobiera 32-bitowy adres bazowy, który sumowany jest z przesunięciem. Tak powstaje adres liniowy, który przywłączonym mechaniźmie stronicowania zostaje poddany transformacji na adres fizyczny.
W trybie rzeczywistym adres mają 20 bitów. Natomiast rjestry mają 10 bitów. Zatem by uzystać fizyczny adres komórki pamięci zawartość rejestru segmentowego mnoży się razy 16 i dodaje przesunięcie OFFSET. Adres fizyczny liczony jest z zawartości przesuniętego rejestru segmentowego oraz wartości przesunięcia (max 1MB pamięci fizycznej)
Potokowe – przeiwdywanie skoków – przetwarzanie potokowe zwiększa wydajność mikroprocesora ale problemem staje się z poleceniem przeniseienia sterowania zwłaszcza warunkowe. Polecenia te powodują zmianę sekwencyjnego wykonywania poleceń programu
Strategie przewidywania skoków:
Trywialna – skok nieb ędzie ykonay
Statyczna – skok wstecz będzie wykonany, w przód nie
Przewidywanei oparte na statystycznej analizie wykonania skoków
Pamięć cache łącznie z wyspecjalizowaną jednotką CPU używa się do przewidywania adresów skoków.
Cache – pamięć podręczna to relatywnie mały obszar pamięci o krótkim czasie dostępu, w której przechowywana jest kopia danych bądź programu z pamięci głownej
Zawartość rejestrów ogólnego przeznaczenia zależna jets od aktulanie wykonywanego zadania. Rozkaz wykonują operacje 1, 8, 16, 32 oraz 64 bitowe oraz operacje na polach bitowych od 1 do 32b.
32-bitowy adres liniowy dzielony jest na 3 części: indeks katalogu, indeks tablicy i offset.
System komputerowy – zestaw jedno lub wielokomputerowy wraz z odpowiednim oprogramowaniem przeznaczonym do wykonywania określonych zadań
Sprzęt – czyli elektroniczne komponenty komputera przede wszystkim jednostka centralna (procesory, pamięć, sterowniki) oraz urządzenia zewnętrzne
Oprogramowanie – zapisane na nośniku informacji programy i dane umożliwiające eksploatację systemu komputerowego i realiację zadań użytkowników systemu
System operacyjny – program działający jako pośrednik między użytkownikiem komputera a sprzętem komputerowym
Architektura komputera – część opisu struktur komputera widziana poprzez programistę działającego na poziomie oprogramowania podstawowego za pomocą języka assembler.
Organizacja komputera – obejmuje wzajemne powiązania i współdziałanie jego poszczególnych bloków funkcjonalnych
Bit –najmniejsza jednostka informacji rozróżniana w komputerze
Bajt – ciąg zerojedynkowy o długości 8-bitów
Słowo maszynowe – Określa się zwykle długość ciągu zerojedynkowego na którym możliwe jest równoległe dokonywanie większości operacji
Linia – jednolita droga przesyłania sygnałów (realizacja techniczna = przewód)
Szyna – zbiór linii służących do przesyłania grup sygnałów. Linie te sągrupowane według funkcji sygnałów i stąd pochodzą ich nazwy: szyna danych, adresowa i sterowania
Magistrala – połączenie składające się zwykle z szyny danych, adresowej i sygnałów sterujących
Przestrzeń adresowa – zbiór wszystkich możliwych adresów, które mogą zostać wygenerowane przy dostępie do pamięci
Rozkaz – zerojedynkowy ciąg pobrany z pamięci w celu określenia na jego podstawie dalszych działań procesora
Lista rozkazów – zbiór wszystkich możliwych rozkazów ( różnych )
Mikrooperacja arytmetyczna – operacja przesłań między rejestrami. Zmienia wartość operacji podczas przesyłania, poprzez układy logiczne wykonujące odpowiednią funkcję arytmetyczną
Cykl rozkazowy – ciąg czynności wykonywanych poprzez układ sterowania jednostki centralnej procesora w czasie realizacji jednego rozkazu. NA cykl rozkazowy składa się faza pobrania i wykonania (co najmniej)
Cykl maszynowy – cykl, w którym następuje przesłanie danych (odczyt lub zapis) między jednostką centralną a pamięcią lub układem we/wy a rejestrami procesora. Jeden cykl maszynowy wykonywane jest podczas jednego lub kilku taktów zegara systemowego
Stopnie MIPS:
IF pobiera instrukcje z pamięci instrukcji
RD odczytuje zawartość rejestrów źródłowych z zestawu rejetrów
ALU wykonuje operację arytmetyczną, ew. skok
MEM dokonuje wymiany danych z hierarchią pamięci danych
WB zapisuje wynik operacji arytmetycznej
Stopnie CISC (i486):
Fetch – pobranie instrukcji do bufora instrukcji
ID1 – wstępne dekodowanie, określenie dlugości
ID2 – obliczenie adresów
EX - wymiana z pamęcią, odczyt rejestrów, operacja arytmetyczna lub logiczna (stopień bardzo skomplikowany, w wielu instrukcjach, wykonanie wielofazowe
WB – zapis wyników do rejestrów
Synchronizacja potoku – usuwanie hazardu R-A-W:
Metoda administracyjna – uznanie sekwencji instrukcji powodującej hazard za nielegalną i niedozwoloną
Wstrzymanie potoku po wykryciu hzardu – azard w potoku można łatwo wykryć umieszczając w stopniu RD komparatory porównujące numery rejestrów źródłowych odczytywanych przez RD z numerami rejestrów docelowych instrukcji przechowywanych w stopni ALU i MEM
Obejścia – najbardziej efektywna metoda usuwania hazardu wymaga rozbudowy stopnia odczytu i przeprowadzenia dodatkowych ściżek danych ze stopni ALU i MEM do stopnia RD
Tryby adresowania:
Natychmiastowe
Rejestrowe
Bezpośrednie
Pośrednie
Pośrednie skalowane z przemieszczeniem
Operacja łańcuchowa
Rejestry
Ogólnego przeznacznia
AX – akumulator
BX – bazowy
CX – zliczający
DX – danych
SP – wskaźnik stosu
BP – wskaźnik bazy
SI – rejestr indeksowy źródła
DI – rejestr indeksowy przeznaczenia
Segmentowe
CS – programu
DS – danych
SS – stosu
ES – dodatkowy
Pamięć 8086 – pamięć danych i programu jset 8-bitowa, ale możlwie jest adresowanie słów wielobajtowych. Stos jest 16-bajtowy. Te 3 rodzaje pamięci są adresowane za pomocą wspólnej magistrali adresowej. Stos to obszar pamięci do któ®ego wpisujemy dane bądź są łądowane adresy w wyniku wykorzytania podprogramów lub przerwań.
20-bitowa magistrala adresowa pozwala na zaadresowanie do 1MB pamięci operacyjnej. Przestrzeń adresowa zostałą podzielona na segmenty o długości 64kB.
Rodzaje adresowania
Natychmiastowe
Bezpośrednie
Pośrednie
Przez rejestr bazowy
Przez rejestr bazowy i przemieszczenie
Przez rejestr indeksowy
Przez rejestr indeksowy i przemieszczenie
Przez rejestr bazowy, indeksowy i przemieszczenie
Łańcuchowe