Wykład 4

Transkrypt

Wykład 4
Wprowadzenie do architektury
komputerów
Model programowy procesora i jego struktura
Procesory CISC i RISC
Użytkowy model programowy
Użytkowym modelem programowym nazywamy zestaw zasobów
logicznych komputera dostępnych dla programisty piszącego program
użytkowy w języku asemblerowym lub dla kompilatora tłumaczącego
program użytkowy napisany w języku wysokiego poziomu do postaci
asemblerowej
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
●
●
Zestaw trybów adresowania
●
●
sposoby specyfikacji argumentów operacji
Model operacji warunkowych
●
●
liczba i funkcjonalność rejestrów procesora
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 68HC08
●
Niemal 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 – akumulator
DX – rozszerzenie akumulatora do mnożenia i dzielenia
CX – licznik iteracji
Rejestry x86
(tryb 16-bitowy) BX – główny rejestr adresowy
SP – wskaźnik stosu
BP – wskaźnik ramki
SI, DI – pomocnicze rejestry adresowe
IP – licznik instrukcji
FLAGS – rejestr znaczników
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