Architektura Komputerów/Wykład 5: Model programowy procesora w podejściu CISC i RISC

From Studia Informatyczne


Grafika:ASK_M05_S01.png

...


Grafika:ASK_M05_S02.png

...


Grafika:ASK_M05_S03.png

Model programowy procesora jest kompozycją czterech składników – zestawu rejestrów, zestawu trybów adresowania, modelu operacji warunkowych i listy instrukcji.

Istnieją trzy główne podejścia do kompozycji modelu programowego, określane skrótami RISC, CISC i – pochodzące od koncepcji RISC – podejście VLIW.


Grafika:ASK_M05_S04.png

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.


Grafika:ASK_M05_S05.png

Podejście CISC jest klasycznym podejściem do budowy modelu programowego komputera. W podejściu tym zakłada się, że instrukcje języka wysokiego poziomu powinny mieć proste odwzorowani e w instrukcjach procesora, a dane lokalne są przechowywane na stosie w pamięci. Rejestry służą do adresowania pamięci i przechowywania danych tymczasowych.


Grafika:ASK_M05_S06.png

Z wcześniejszych założeń wynika, że 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.

Ponieważ rejestry służą do przechowywania wyników pośrednich, a nie danych programu, mogą one być zamazywane podczas kolejnych faz obliczeń. Z tego powodu dominującą grupę instrukcji stanowią instrukcje dwuargumentowe, w których wynik zastępuj jeden z argumentów źródłowych.


Grafika:ASK_M05_S07.png

Złożoność poszczególnych instrukcji CISC powoduje, że jednostka wykonawcza jest skomplikowana, a wykonanie instrukcji – wielofazowe, Repertuar trybów adresowania wpływa na długość pól specyfikacji argumentów w instrukcjach.


Grafika:ASK_M05_S08.png

Podejście RISC powstało stosunkowo niedawno. Stanowiło ono sposób na budowę szybkiego procesora o prostej strukturze.

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.


Grafika:ASK_M05_S09.png

W podejściu RISC zakłada się, że skalarne obiekty lokalne są przechowywane w rejestrach procesora. Tym samym odwołania do pamięci ograniczają się do dostępów do danych strukturalnych oraz przeładowywania ramki stosu podczas przekazywania sterowania pomiędzy procedurami.

Duży zestaw rejestrów mieści co najmniej dane jednej procedury. Aby nie niszczyć danych podczas operacji, instrukcje specyfikują oddzielnie argumenty źródłowe i przeznaczenia. Ograniczona liczba odwołań do pamięci umożliwia redukcję liczby i złożoności dostępnych trybów adresowania.


Grafika:ASK_M05_S10.png

Prosta budowy procesora wynikająca z prostoty instrukcji umożliwia uzyskanie wysokiej wydajności dzięki wysokiej częstotliwości pracy. Duża wydajność procesora pozwala z kolei na syntezę dowolnie złożonych operacji i trybów adresowania na drodze programowej.

Ponieważ dane są przechowywane w rejestrach – instrukcje operujące na danych korzystają wyłącznie z rejestrów i stałych natychmiastowych. Dzięki temu długość obrazu binarnego instrukcji jest ograniczona.


Grafika:ASK_M05_S11.png

...


Grafika:ASK_M05_S12.png

...


Grafika:ASK_M05_S13.png

...


Grafika:ASK_M05_S14.png

Architektura x86 jest dość nietypową, lecz najbardziej obecnie popularną architekturą CISCową. Stało się tak dzięki zastosowaniu przez firmę IBM w 1980 roku procesorów tej rodziny w komputerach IBM PC.

Architektura x86 przechodziła szereg ewolucji. W dalszej części wykładu będziemy bazowali na wersji 32-bitowej, wprowadzonej w 1985 roku. Procesory x86 mają wiele trybów pracy i wariantów organizacji modelu pamięci dla aplikacji. Prezentowane przykłady będą dotyczyły tzw płaskiego modelu pamięci, z liniowym adresowaniem i 32-bitowym adresem.


Grafika:ASK_M05_S15.png

Operacje na danych w x86, podobnie jak w większości innych architektur CISC, mogą być prowadzone na słowach o długościach 8, 16 lub 32 bitów.


Grafika:ASK_M05_S16.png

...


Grafika:ASK_M05_S17.png

Poza jednostką stałopozycyjną, procesory rodziny x86 posiadają jednostkę zmiennopozycyjną x87, wprowadzoną jeszcze w latach 70-tych XX wieku i zbudowaną na jej bazie jednostkę wektorową MMX/3DNow! oraz nowszą jednostkę zmiennopozycyjną i wektorową SSE.

Jednostka x87 powoli wychodzi z użycia, chociaż współczesne procesory są w nią wyposażone dla zachowania zgodności binarnej oprogramowania ze starszymi modelami.

Nowe oprogramowanie korzysta z jednostki SSE, a sama jednostka jest intensywnie rozwijana poprzez rozszerzanie listy instrukcji i obsługę nowych formatów danych. Kolejne wersje jednostki są oznaczane jako SSE2, SSE3, SSSE3 i SSE4.


Grafika:ASK_M05_S18.png

Dość nietypową i niewygodną z punktu widzenia konstrukcji kompilatorów cechą x86 jest niedostępność najmniej znaczących bajtów czterech z ośmiu rejestrów. W zamian za to jest możliwy dostęp do kolejnych, „drugich” bajtów czterech pierwszych rejestrów, z czego w praktyce kompilatory nie są w stanie efektywnie skorzystać. Taki model zestawu rejestrów wynika z historii architektury x86 i jej pochodzenia od 8-bitowych procesorów serii 8080.


Grafika:ASK_M05_S19.png

...


Grafika:ASK_M05_S20.png

Szczególną cechą zapisu binarnego instrukcji w x86jest obecność prefiksów – jednobajtowych kodów operacyjnych nie reprezentujących żadnych instrukcji, lecz modyfikujących sposób dekodowania przez procesor następującej po prefiksach instrukcji.

Proste tryby adresowania, w tym rejestrowe pośrednie, są specyfikowane przez bajt ModRM. Tryby indeksowe wymagają następnego bajtu - SIB.


Grafika:ASK_M05_S21.png

...


Grafika:ASK_M05_S22.png

...


Grafika:ASK_M05_S23.png

...


Grafika:ASK_M05_S24.png

...


Grafika:ASK_M05_S25.png

...


Grafika:ASK_M05_S26.png

...


Grafika:ASK_M05_S27.png

...


Grafika:ASK_M05_S28.png

...


Grafika:ASK_M05_S29.png

...


Grafika:ASK_M05_S30.png

...


Grafika:ASK_M05_S31.png

...


Grafika:ASK_M05_S32.png

...


Grafika:ASK_M05_S33.png

...


Grafika:ASK_M05_S34.png

...


Grafika:ASK_M05_S35.png

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.


Grafika:ASK_M05_S36.png

...


Grafika:ASK_M05_S37.png

...


Grafika:ASK_M05_S38.png

...