Architektura Systemów Komputerowych Wykład 4: Struktura użytkowego modelu programowego komputera Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie
Plan Pojęcie użytkowego modelu programowego Składniki modelu programowego Zestaw rejestrów procesora Tryby adresowania pamięci Model operacji warunkowych Lista instrukcji procesora
Użytkowy model programowy Jest to zestaw zasobów logicznych komputera dostępnych dla programisty piszącego program użytkowy w języku niskiego poziomu lub dla kompilatora translują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 jest bezpośrednio związany z budową wewnętrzną procesora i komputera Czasami zamiast określenia model programowy używa się pojęcia architektura Oprócz modelu użytkowego istnieje model systemowy (będzie omawiany później)
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 ten jest często silnie powiązany z planowaną implementacją strukturą wewnętrzną procesora Dość często po latach się okazuje, ż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 Rejestry adresowe: Bazowy Indeksowy Wskaźniki stosu / ramki Licznik pętli
Architektury zestawu rejestrów 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 rejestrów (w tym PC) Operacje na danych typu pamięć-pamięć Obecnie prawie niespotykane Architektura move Lokacje przestrzeni adresowej odwzorowane w rejestry ( ukryte pod postacią komórek pamięci) Współczesny przykład: mikrokontrolery MAX Q firmy Maxim
Minimalny zestaw rejestrów PC licznik rozkazów SP wskaźnik stosu Akumulator (pełniący rolę rejestru wartości) Rejestr adresowy (do adresowania struktur danych) Przykład: Mikrokontrolery 8-bitowe Freescale (dawniej Motorola) rodziny 68HC08
Minimalny zestaw rejestrów CPU08 H A F X Akumulator Rejestr znaczników Rejestr adresowy SP PC Wskaźnik stosu Licznik rozkazów
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 służą one wyłącznie do obliczeń i przechowywania wyników pośrednich
Rejestry x86 (tryb 16-bitowy) AX akumulator DX rozszerzenie akumulatora dla 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 rozkazów 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 16 lub 32 rejestry uniwersalne Przykłady: MIPS, IBM Power 32 rejestry AMD64, IBM S/360, z Series 16 rejestrów Rejestry używane do przekazywania kilku parametrów i przechowywania kilku zmiennych lokalnych Znacząca redukcja odwołań do pamięci
Bufor wierzchołka stosu Duży zestaw rejestrów (32 128), który z założenia ma pełnić prawie całą ramkę stosu (bez zmiennych strukturalnych) Dwa rozwiązania: Okna rejestrów SPARC Bufor stosu Am29k, IA-64 (Itanium) Wykonanie procedury niemal bez odwołań do pamięci
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 / jednoargumentowe Argumenty pobierane z wierzchołka stosu Wynik odkładany na stos 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) danej w pamięci W szerszym ujęciu odnosi się również do rejestrów i stałych
Tryby adresowania nieodnoszące się do pamięci Natychmiastowy wartość danej zapisana w instrukcji Rejestrowy bezpośredni argument operacji w rejestrze
Tryby rejestrowe pośrednie Argument w pamięci, adres argumentu lub jego składnik zapisany w rejestrze Jest to tak zwany rejestr bazowy Warianty: Rejestrowy pośredni (prosty) adres w rejestrze Rejestrowy pośredni z przemieszczeniem adres jest sumą zawartości rejestru i stałej zapisanej w instrukcji Dwurejestrowy pośredni adres jest sumą zawartości dwóch rejestrów
Minimalny zestaw trybów adresowania Do efektywnej realizacji HLL są potrzebne tryby: Natychmiastowy Rejestr bezpośredni Jeden z rejestrowych pośrednich (zwykle rejestrowy pośredni z przemieszczeniem) niezbędny do wyliczania zmiennych adresów (np. tablica, ramka stosu)
Tryb absolutny (bezpośredni) Dana w pamięci, adres 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
Tryb z bazą w PC Tryby rejestrowe pośrednie, dla których rejestrem bazowym jest PC Wygodne do adresowania tablic adresów kodu (np. instrukcja switch) Dostępne w niektórych architekturach (MSP430, M68k) Mogą zastępować tryb absolutny Mogą być pożyteczne w procesorach 64-bitowych (AMD64)
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ącą potęgą liczby 2 Rejestr nosi nazwę rejestru indeksowego Skala 1, 2, 4, 8, ew. 16 Mnożenie przez przesuwanie w lewo Przy skali 1 tryb nazywany jest indeksowym skalowalnym
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 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. tablicach wskaźników Możliwość modyfikacji adresu przez dodanie przemieszczenia lub indeksowanie Obecnie rzadko spotykane kosztowne czasowo Dostępne w klasycznych architekturach CISC (np. VAX, M68k od 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 wykonanej operacji (zwykle zgrupowane w jeden kilkubitowy rejestr) Operacja warunkowa realizowana za pomocą dwóch instrukcji: Ustawienie znaczników Instrukcja warunkowa zależna od ustawienia znaczników
Znaczniki Z (zero) zero Przyjmuje wartość 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 danego 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ą również 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 Ustawienie (SET cc) Zamienia wartość logiczną warunku na wartość danej całkowitej Architektury z warunkowym wykonaniem większości instrukcji (np. ARM) Eliminacja znaczącej części skoków w rozwinięciach krótkich konstrukcji typu if then else
Warunki wykonania instrukcji Specyfikowanie jako wartości 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)
Rejestr znaczników w x86 12 11 10 9 8 7 6 5 4 3 2 1 0 OF SF ZF AF PF CF» OF nadmiar» SF znak» ZF zero» AF przeniesienie pomocnicze» PF parzystość» CF przeniesienie Znaczniki umieszczone są w rejestrze stanu procesora - EFLAGS
Warunki w x86 Nazwa cc Nazwa ~cc Definicja cc O NO OF C, B, NAE NC, NB, AE CF Z, E NZ, NE ZF BE, NA NBE, A CF or ZF S NS SF P,PE NP, PO PF L, NGE NL, GE SF and OF LE, NG NLE, G (SF and OF) or ZF
Model operacji warunkowych bez znaczników Pojedyncza instrukcja wartościuje relację i wykonuje operację jeśli relacja jest spełniona Np. skocz jeśli zawartości rejestrów są równe Charakterystyczny dla prostych procesorów RISC, np. MIPS
Model z predykatami 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)
DZIĘKUJĘ ZA UWAGĘ!