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