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 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 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). Rejestry x86 (tryb 16-bitowy) AX akumulator DX rozszerzenie akumulatora do mnożenia i dzielenia CX licznik iteracji 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