47
Wprowadzenie do architektury komputerów Model programowy procesora i jego struktura Procesory CISC i RISC

Wprowadzenie do architektury komputerówdegra.pb.bialystok.pl/~adam/wdak/wdak_w04n.pdf · niedopełnieniu stosu w rejestrach, co ma miejsce raz na kilka poziomów wywołań procedur

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

Tryby rejestrowe pośrednie

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 – podejście klasyczne

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.

CISC - problemy

(wielofazowe wykonywanie instrukcji)

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.

RISC - charakterystyka

RISC - charakterystyka

RISC

Reprezentacje instrukcji

Niezależność w liście instrukcji CISC

Architektura x86 (IA-32)

X86 - cechy

X86 – adresowanie pamięci w trybie 32 - bitowym

X86 – format instrukcji

Architektura MIPS32

MIPS32 - rejestry

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.

MIPS32 – formaty instrukcji