Upload
buikhuong
View
219
Download
0
Embed Size (px)
Citation preview
Wprowadzenie do architektury komputerów
Model programowy procesora i jego strukturaProcesory CISC i RISC
Użytkowy model programowy
Użytkowym modelem programowym nazywamy zestaw zasobówlogicznych komputera dostępnych dla programisty piszącego programużytkowy w języku asemblerowym lub dla kompilatora tłumaczącegoprogram użytkowy napisany w języku wysokiego poziomu do postaciasemblerowej
Inne nazwy:● aplikacyjny model programowy● model programowy użytkownika
● Model programowy nie ma bezpośredniego związku z budową wewnętrzną procesora i komputera
● Niekiedy zamiast określenia „model programowy” używa się pojęcia „architektura”
Składniki modelu programowego
● Zestaw rejestrów● liczba i funkcjonalność rejestrów procesora
● Zestaw trybów adresowania● sposoby specyfikacji argumentów operacji
● Model operacji warunkowych● sposób realizacji konstrukcji warunkowych
● Lista instrukcji● zestaw operacji jakie może wykonać procesor
Kompozycja modelu programowego
● Wszystkie składniki modelu programowego są ze sobą ściśle powiązane● nie da się zaprojektować jednego ze składników w oderwaniu
od pozostałych● Model programowy jest często silnie powiązany z
planowaną implementacją – strukturą wewnętrzną procesora● często okazuje się po latach, że dany model programowy musi
być zrealizowany w zupełnie innej strukturze procesora niż ta, dla której był projektowany● np. x86
Funkcje rejestrów
Akumulator: A ← A op src● Akumulatorem nazywamy rejestr, który może być użyty jako argument
źródła i równocześnie przeznaczenia dla operacji arytmetycznej lub logicznej.
Rejestr adresowy - służy do uzyskania adresu danej umieszczonej w pamięci
● Bazowy - może być użyty w trybie adresowania rejestrowym pośrednim
● indeksowy● wskaźnik stosu
Licznik pętli - służy do odliczania iteracji pętli
Architektura zestawu rejestrów - koncepcje
● Brak (pamięć – pamięć)● Minimalny● Mały zestaw rejestrów specjalizowanych● Mały zestaw rejestrów uniwersalnych● Duży zestaw rejestrów uniwersalnych● Zestaw rejestrów jako bufor ramki stosu● Stosowy zestaw rejestrów
Architektury bezrejestrowe
●Muszą zawierać 1..3 rejestry w tym PC●Operacje na danych „pamięć-pamięć”●Obecnie prawie nie spotykane●Architektura „move”
● Lokacje przestrzeni adresowej odwzorowane w rejestry● rejestry są „ukryte” pod postacią komórek pamięci
● Procesor wykonuje tylko jedną lub co najwyżej kilka instrukcji, których argumentami mogą być wyłącznie stałe lub adresy pamięci. Operacje arytmetyczne i logiczne są realizowane poprzez przesłania do specjalnych lokacji pamięci, służących jako rejestry argumentów. Adresy tych lokacji są używane do wyboru operacji wykonywanej przez jednostkę arytmetyczną.
● Współczesny przykład to mikrokontrolery MAXQ firmy Maxim
Minimalny zestaw rejestrów
● PC – licznik instrukcji● SP – wskaźnik stosu● 1 lub 2 akumulatory (pełni rolę rejestru wartości)● 1 lub 2 rejestry adresowe do adresowania struktur danych● Przykład mikrokontrolery 8-bitowe Freescale (dawniej
Motorola) rodziny 68HC08Niemal wszystkie instrukcje wymagają odwołania do pamięci, ale jeden z argumentów instrukcji zwykle znajduje się w rejestrze.
Generowanie kodu dla takich procesorów jest proste, ale uzyskany program wykonuje się stosunkowo wolno wskutek dużej liczby odwołań do pamięci.
Mały zestaw rejestrów specjalizowanych
● 6..8 rejestrów pełniących różne sztywno określone funkcje● Przykład: x86 - w trybie 16-bitowym● Brak możliwości efektywnego wykorzystania rejestrów
przez kompilator● Rejestry służą wyłącznie do obliczeń i przechowywania wyników
posrednich - nie mogą być użyte do przechowywania danych programu (argumentów i zmiennych lokalnych procedur).
AX – akumulatorDX – rozszerzenie akumulatora do mnożenia i dzieleniaCX – licznik iteracjiBX – główny rejestr adresowySP – wskaźnik stosuBP – wskaźnik ramkiSI, DI – pomocnicze rejestry adresoweIP – licznik instrukcjiFLAGS – rejestr znaczników
Rejestry x86(tryb 16-bitowy)
Mały zestaw rejestrów uniwersalnych
● 6..8 rejestrów uniwersalnych● Przykład: x86 w trybie 32-bitowym
● 8 rejestrów (EAX, EDX, ECX, EBX, ESP, EBP, ESI, EDI)● wszystkie rejestry mogą służyć jako akumulatory i rejestry
adresowe, wszystkie poza ESP – jako rejestry indeksowe● 3..4 rejestry mogą być użyte dla zmiennych lokalnych lub
parametrów● alokacja obiektów lokalnych w rejestrach przyspiesza
wykonanie kodu
Duży zestaw rejestrów uniwersalnych
● W architekturach z dużym zestawem rejestrów mamy do czynienia z wieloma rejestrami, które mogą pełnić dowolną rolę.
● 16 lub 32 rejestry uniwersalne● Przykłady:
● MIPS, IBM Power – 32 rejestry● AMD64, IBM S/360 – 16 rejestrów
● rejestry używane do przekazywania kilku parametrów i przechowywania kilku zmiennych lokalnych● istotna redukcja liczby odwołań do pamięci
Bufor wierzchołka stosu
● Duży zestaw rejestrów (32..128), który z założenia ma mieścić całą ramkę stosu (bez zmiennych strukturalnych)
● W ten sposób uzyskuje się znaczną redukcję liczby odwołań do pamięci, również w prologu i epilogu procedury.
● Dwa rozwiązania:● Okna rejestrów – SPARC● Bufor stosu – Am9k, IA-64 (Itanium)
● Wywołanie procedury niemal bez odwołań do pamięci● odwołania do pamięci zachodzą przy przepełnieniu lub
niedopełnieniu stosu w rejestrach, co ma miejsce raz na kilka poziomów wywołań procedur.
Stosowy zestaw rejestrów
● 3..8 rejestrów tworzących stos● często brak nazw rejestrów● operacje wykonywane na wierzchołku stosu rejestrów
● bezargumentowe lub jednoargumentowe● argumenty pobierane z wierzchołka stosu, wynik odkładany na
stos● Taka architektura zestawu rejestrów znacząco upraszcza
konstrukcję kompilatora, jest ona jednak bardzo trudna do efektywnej realizacji przy typowych współczesnych strukturach jednostek wykonawczych.
● Przykłady:● Transputery● Jednostka zmiennopozycyjna x87
Tryby adresowania
● Pojęcie „tryb adresowania” oznacza sposób specyfikacji argumentu operacji
● W zawężonym ujęciu oznacza sposób określenia (obliczenia) adresu danej w pamięci
● szerzej – odnosi się również do rejestrów i stałych
Tryby adresowania nie odnoszące się do pamięci:● Natychmiastowy – wartość danej zapisana w instrukcji● Rejestrowy bezpośredni – argument operacji w rejestrze
Minimalny zestaw trybów adresowania
● Do efektywnej realizacji języków wysokiego poziomu są potrzebne tryby:● Natychmiastowy – do ładowania do rejestrów stałych, w tym
również adresów danych statycznych● rejestrowy bezpośredni - użycie zawartości rejestru jako
argumentu operacji● jeden z rejestrowych pośrednich – zwykle r.p. z
przemieszczeniem – do adresowania danych w pamięci● niezbędny do wyliczania zmiennych adresów (np. tablice, ramka
stosu)
Tryb absolutny (bezpośredni)
● Dana w pamięci, adres zapisany w instrukcji● Najprostszy sposób adresowania skalarnych danych
statycznych● nie jest niezbędny – może być zastąpiony przez tryb
rejestrowy pośredni z przemieszczeniem
Tryby indeksowe
● Adres powstaje przez zsumowanie adresu efektywnego odnoszącego się do pamięci (uzyskanego z innego trybu adresowania) z wartością rejestru, opcjonalnie pomnożoną przez stałą (skalę) będąca potęgą liczby 2● rejestr jest nazywany rej. indeksowym● skala 1,2,4,8, ew. 16● mnożenie przez przesuwanie w lewo● przy skali <> 1 tryb nazywamy indeksowym skalowanym
Tryby z automodyfikacją bazy
● Tryby rejestrowe pośrednie, w których wartość rejestru bazowego jest modyfikowana o długość przesyłanej danej przed lub po wykonaniu przesłania danej ● Preinkrementacja, postinkrementacja, predekrementacja,
postdekrementacja● niejawnie korzystają z nich operacje stosowe przy realizacji
stosu pełnego schodzącego :● PUSH – predekrementacja● POP - postinkrementacja
Tryby pamięciowe pośrednie● dana jest zawarta w pamięci pod adresem którego składnik jest
zawarty w pamięci● Dwukrotne odwołanie do pamięci ● Pożyteczne przy np. tablicy wskaźników● możliwość modyfikacji adresu przez dodanie przemieszczenia lub
indeksowanie● Pierwszy adres, wyznaczony z jednego z omówionych wcześniej trybów
adresowania pamięci, jest używany do odczytania wartości, służącej jako adres bazowy dla drugiego adresu. Do pozyskanego w ten sposób adresu bazowego można następnie dodać przemieszczenie lub przeskalowaną zawartość rejestru indeksowego.
● obecnie rzadko spotykane – kosztowne czasowo
● Dostępne w klasycznych architekturach CISC np. VAX, M68k do modelu MC68020
Model operacji warunkowych
● Określa sposób realizacji przez procesor operacji warunkowych
● Warianty:● model ze znacznikami● model bez znaczników („porównaj i ...”)● model z predykatami
Model ze znacznikami
● Znaczniki – jednobitowe rejestry atrybutów wyniku ostatnio wykonywanej operacji● zwykle zgrupowane w jeden kilkubitowy rejestr
● Operacja warunkowa realizowana za pomocą dwóch instrukcji (instrukcje procesora realizujące obie fazy mogą być rozsunięte w czasie):● ustawienie znaczników● instrukcja warunkowa zależna od ustawienia znaczników
Znaczniki
● Z – zero● przyjmuje stan 1 jeżeli wynik operacji wynosi 0
● N/M (negative/minus) – znak● kopia najbardziej znaczącego bitu wyniku operacji
● C/CY (carry) – przeniesienie/pożyczka● przeniesienie wychodzące z najbardziej znaczącego bitu
wyniku● O/V/OV (overflow) – nadmiar
● nadmiar w kodzie U2● AC/HC (auxillary/half carry) – przeniesienie pomocnicze BCD
● przeniesienie pomiędzy najmniej znaczącymi tetradami● P (parity) – parzystość
● przyjmuje stan 1 jeśli liczba jedynek w najmniej znaczącym bajcie wyniku operacji jest parzysta
Zasady ustawiania znaczników
● Szczegółowe zasady ustawiania znaczników są zdefiniowane w dokumentacji modelu programowego każdego procesora
● Wszystkie znaczniki są ustawiane przez podstawowe dwuargumentowe instrukcje arytmetyczne i logiczne
● Inne instrukcje (np. jednoargumentowe) – nie zawsze wszystkie znaczniki
● W niektórych architekturach znaczniki zera i znaku są ustawiane przez instrukcje przesłań● np. M68k,HC08
Instrukcje warunkowe
● Instrukcja specyfikuje warunek wykonania● jeśli warunek nie jest spełniony instrukcja wykonuje się jako pusta
● Skoki warunkowe – dostępne we wszystkich architekturach● przesłania warunkowe – dostępne w nowszych procesorach
● umożliwiają eliminację części skoków i przyspieszenie wykonania kodu● Architektury z warunkowym wykonaniem większości instrukcji
np. ARM● eliminacja znacznej części skoków w rozwinięciach krótkich konstrukcji
typu if-then-else
Warunki wykonania instrukcji
● Specyfikowane jako wartość jednego znacznika lub wyrażenie logiczne na wartościach kilku znaczników
● Symboliczne oznaczenie nazwy warunku stanowi część nazwy instrukcji warunkowej, np. JNZ - „jump if not zero”
Warunki w x86
Stosowane w nazwach warunków skróty A, B, G i L (above, below, greater, less) oznaczają odpowiednio relacje większości i mniejszości dla liczb bez znaku (A, B) i ze znakiem (G, L).
Model operacji warunkowych bez znaczników
● Operacja warunkowa jest realizowana przez pojedynczą instrukcję.
● Pojedyncza instrukcja ewaluuje relację i wykonuje operację jeśli relacja jest spełniona● np. „skocz jeśli zawartości rejestrów równe”
● Charakterystyczny dla prostych procesorów RISC, np. MIPS
Model z predykatami
● Model z predykatami jest spotykany w nowych architekturach o dużej równoległości wykonania instrukcji, dużych zestawach rejestrów i wysokich kosztach skoków.
● Predykaty – uogólnione znaczniki, mogą przechowywać wartość logiczną dowolnej wcześniej obliczonej relacji
● Duża liczba predykatów w procesorze – możliwość równoczesnego przechowywania wartości wielu relacji
● Instrukcje w większości warunkowe, specyfikują numer predykatu jako warunek wykonania
● Model zaimplementowany w architekturze IA-64 (Itanium)
Podejścia do konstrukcji modelu programowego
Model programowy procesora jest kompozycją czterech składników – zestawu rejestrów, zestawu trybów adresowania, modelu operacji warunkowych i listy instrukcji.
CISC i RISC
Podejścia CISC i RISC różnią się złożonością poszczególnych instrukcji. Istnieją procesory RISC wykonujące zaledwie około 30 instrukcji, ale również takie, które wykonują ponad 200 różnych instrukcji. Typowe procesory CISC wykonują kilkadziesiąt instrukcji.
CISC
Procesor CISC powinien być wyposażony w tryby adresowania odzwierciedlające mechanizmy stosowane w językach wysokiego poziomu (tablice, struktury). Tymczasowe zastosowanie rejestrów nie wymaga dużej pojemności zestawu rejestrów.
RISC – szybki procesor, prosta struktura
Praktycznie wszystkie architektury opracowane po 1985 roku są architekturami klasy RISC. Niektóre z nich są stosowane zarówno w komputerach uniwersalnych, jak i w zastosowaniach wbudowanych.
MIPS32 - instrukcje
16-bitowa stała w formacie I służy, w zależności od instrukcji, jako argument natychmiastowy, przemieszczenie adresu danej w pamięci lub przemieszczenie skoku. Ponieważ instrukcje są zapisane w postaci słów 32-bitowych wyrównanych naturalnie, adres instrukcji jest zawsze podzielny przez 4. Przemieszczenie skoku jest traktowane jako przemieszczenie słowowe – jest ono przesuwane w lewo o dwa bity, co umożliwia uzyskanie zasięgu skoków w zakresie od -128 do +128 KB.