IA-32

IA-32 (Intel Architecture 32 bit) – 32-bitowy model programowy mikroprocesora opracowany przez firmę Intel. Nazywany również x86-32, jako że opiera się na 32-bitowym rozwinięciu modelu programowego rodziny x86. Architektura IA-32 zaliczana jest z reguły do kategorii CISC, choć technologie wprowadzane stopniowo w nowszych wersjach procesorów IA-32 spełniają także wiele cech procesorów RISC.

Model IA-32 został wprowadzony w 1985 roku, wraz z procesorem Intel 80386 i jest najpopularniejszym modelem architektury stosowanym w komputerach ogólnego przeznaczenia (tzn. komputerach osobistych, serwerach). Stopniowo jest wypierany przez model 64-bitowy AMD64, Intel 64 (EM64T), czyli tzw. x86-64.

Tryby pracy

Procesory IA-32 posiadają trzy podstawowe tryby pracy, określające m.in. sposób zarządzania pamięcią i uprawnienia użytkownika.

  • Tryb rzeczywisty – tryb zgodny z najstarszymi procesorami rodziny x86 z Intel 8086 włącznie. W trybie tym występuje segmentacja pamięci, rozmiar segmentu jest stały i wynosi 64 KB. Przestrzeń adresowa ograniczona jest do 1 MB, do adresowania wykorzystuje się rejestry segmentowe oraz offset. W trybie tym współczesne procesory pracują jedynie od chwili uruchomienia do przekazania kontroli systemowi operacyjnemu.
  • Tryb chroniony – tryb inicjalizowany i w znacznej mierze kontrolowany przez system operacyjny. Pamięć może być zorganizowana w segmenty dowolnej wielkości, fizyczna przestrzeń adresowa ograniczona jest z reguły do 64 GB, liniowa przestrzeń adresowa do 4 GB. Rodzaj adresowania zależy od systemu operacyjnego – może być stosowany tzw. model płaski (bez segmentacji), model z segmentacją analogiczną do trybu rzeczywistego lub – najczęściej – adresowanie nieliniowe (tzw. logiczne). W adresowaniu nieliniowym adres fizyczny jest zależny od wpisu w systemowej tablicy deskryptorów, na który wskazuje selektor. W trybie chronionym procesor obsługuje wielozadaniowość, chroni przed nieupoważnionym dostępem do urządzeń wejścia/wyjścia.
    • Tryb wirtualny V86 – odmiana trybu chronionego, która jest symulacją trybu rzeczywistego. Służy np. do uruchamiania programów MS-DOS.
  • Tryb SMM (System Management Mode) – jest to tryb przeznaczony do zarządzania sprzętem przez systemy operacyjne, niedostępny z poziomu użytkownika.

Rejestry

Podstawowe rejestry w architekturze IA-32

Rejestry ogólnego przeznaczenia

W procesorach opartych na modelu IA-32 dostępne jest osiem 32-bitowych rejestrów ogólnego przeznaczenia:

  • Rejestry danych
    • EAX – rejestr akumulacji
    • EBX – rejestr bazowy
    • ECX – rejestr licznika
    • EDX – rejestr danych
  • Rejestry adresowe
    • ESI – indeks źródła
    • EDI – indeks przeznaczenia
    • EBP – wskaźnik bazowy
    • ESPwskaźnik stosu

Z rejestrów ogólnego przeznaczenia można korzystać także jako rejestrów 16-bitowych (wykorzystywane jest wtedy młodsze 16 bitów rejestru 32-bitowego). Rejestry takie oznacza się z pominięciem litery E na początku symbolu. Dodatkowo, w przypadku rejestrów danych (EAX-EDX) można się odwoływać do ich 8-bitowych części – najmłodsze 8 bitów rejestru AX oznaczane jest przez AL, kolejne 8 przez AH. Odpowiednio najmłodsze bity rejestru BX oznacza się przez BL itd.

Rejestry koprocesora

Koprocesor arytmetyczny w procesorach IA-32 zrealizowany jest w architekturze stosowej, tzn. dane tworzą stos. Położenie danych w koprocesorze określa się przez „odległość” od wierzchołka stosu, a nie konkretny symbol rejestru. Stos koprocesora tworzy 8 rejestrów 80-bitowych. Wierzchołek stosu oznacza się symbolem ST lub ST(0), kolejne rejestry w głąb stosu odpowiednio ST(1), ST(2), aż do ST(7). Rejestry stosu koprocesora mogą przechowywać liczby w formacie zmiennoprzecinkowym zgodnym z normą IEEE 754, o rozmiarze 32, 64 lub 80 bitów.

Ponadto w koprocesorze znajdują się 16-bitowe rejestry dodatkowe:

  • rejestr stanu stosu koprocesora, określający typ zawartości ośmiu rejestrów stosu
  • rejestr stanu koprocesora, m.in. sygnalizujący wyjątki i określający położenie wierzchołka stosu
  • rejestr sterujący koprocesora, pozwala m.in. na ustawianie rodzaju zaokrąglenia, maskowanie wyjątków

Rejestry segmentowe

W procesorach IA-32 zdefiniowano sześć 16-bitowych rejestrów segmentowych, służących albo do bezpośredniego określania adresu fizycznego w trybach stosujących segmentację pamięci, bądź jako selektory w trybie chronionym procesora. Rejestry te to:

  • CS – rejestr segmentu kodu programu
  • DS – rejestr segmentu danych
  • SS – rejestr segmentu stosu
  • ES, FS, GS – rejestry pomocnicze dla danych

Rejestry specjalnego przeznaczenia

W procesorach IA-32 występuje również szereg innych rejestrów. Są to m.in.:

Wykonywanie programów

Zestaw instrukcji

Procesory IA-32 posiadają rozbudowany zestaw instrukcji, liczący kilkaset instrukcji. Liczba instrukcji rosła wraz z wprowadzaniem kolejnych technologii rozwijających model IA-32, jak MMX, SSE, 3DNow! itd. Cechą zestawu instrukcji IA-32, charakterystyczną dla architektur CISC jest fakt, że wiele ze złożonych instrukcji można zastąpić instrukcjami prostszymi, np. pętlę zrealizować można dokonując porównań i skoków warunkowych lub za pomocą specjalizowanej instrukcji pętli LOOP.

Instrukcje podzielić można na grupy:

  • instrukcje przesyłania danych
  • instrukcje kontroli przepływu (porównania, skoki, pętle)
  • instrukcje arytmetyczne (stałoprzecinkowe, wykonywane przez jednostkę arytmetyczno-logiczną oraz zmiennoprzecinkowe, wykonywane przez koprocesor)
  • instrukcje operacji logicznych
  • operacje bitowe
  • inne instrukcje

Instrukcje identyfikowane są przez procesor na podstawie binarnego kodu maszynowego. Dla wygody programistów opisano je jednak mnemonikami, ułatwiającymi programowanie na poziomie asemblera.

Kodowanie instrukcji

Kodowaniem instrukcji zajmuje się kompilator lub asembler podczas kompilacji programu. Wynikowy kod maszynowy musi być zgodny z zasadami kodowania instrukcji IA-32. Rozkazy koduje się w postaci ciągów zero-jedynkowych. W architekturze IA-32 rozkazy są zmiennej długości, od 1 do nawet kilkunastu bajtów, w zależności od rodzaju rozkazu i typu argumentów.

Kod instrukcji zawiera identyfikator rozkazu oraz – jeśli posiada argumenty – położenie ich w pamięci lub ich wartości. W modelu IA-32, w celu ograniczenia długości rozkazu, w przypadku większości rozkazów przyjęto, że docelowe miejsce zapisu wyniku określone jest przez pierwszy z operandów oraz że tylko jeden z argumentów danej instrukcji może odwoływać się do pamięci.

Schemat kodu każdego rozkazu można podzielić na następujące części:

  • Prefiksy instrukcji (opcjonalne) – do czterech bajtów dodatkowych informacji o instrukcji:
    • prefiks LOCK (zapewniający wyłączność dostępu do pamięci wspólnej dla danej instrukcji),
    • prefiksy powtarzania (REP, REPE, REPZ...) wykorzystywane w operacjach na blokach danych,
    • prefiksy chwilowej zmiany segmentu,
    • prefiks podpowiedzi rozgałęzienia (branch hint), pozwalający procesorowi na wybór bardziej prawdopodobnej ścieżki wykonania w przetwarzaniu potokowym,
    • prefiksy zmiany rozmiaru operandu i zmiany rozmiaru adresu.
  • Kod operacji długości 1-3 bajtów, zawierający często dodatkowe informacje:
    • bit wskazujący, w którym operandzie zapisać wynik,
    • bit oznaczający rozmiar operandów.
Dodatkowe 3 bity kodu operacji znajdować się mogą także zamiast pola reg w bajcie ModR/M.
  • Bajt ModR/M (tylko w przypadku instrukcji posiadających argumenty w pamięci lub rejestrach) – służy do określenia położenia argumentów. Składa się z trzech części:
    • pole mod (2 bity) – określa czy operacja odwołuje się do pamięci oraz jaką długość ma ewentualne pole przesunięcia;
    • pole reg (3 bity) – kod rejestru lub modyfikacji adresowej pierwszego argumentu, czasem występuje w roli dodatkowych bitów kodu operacji;
    • pole R/M (3 bity) – kod rejestru lub modyfikacji adresowej drugiego argumentu.
  • Bajt SIB (tylko w przypadku operacji o złożonym sposobie odwoływania się do pamięci, np. za pomocą podwójnej modyfikacji adresowej) – służy do określenia dodatkowych parametrów modyfikacji adresowych, m.in. współczynnik skali pozwalający na wygodne operowanie na tablicach.
  • Pole przesunięcia (opcjonalne) – podaje odległość danych w stosunku do początku segmentu, może mieć długość 1, 2 lub 4 bajtów.
  • Dane stałe (immediate, opcjonalne) – podana bezpośrednio wartość liczbowa argumentu o długości 1, 2 lub 4 bajtów.

Kod prostych instrukcji bez argumentów zajmuje z reguły 1 bajt, a np. skomplikowane operacje przesyłania danych do pamięci mogą zajmować 9 bajtów.

Cykl rozkazowy

Procesor wykonuje instrukcje programu po kolei, zgodnie z ustalonym schematem, zwanym cyklem rozkazowym. Na cykl rozkazowy składa się kolejno:

  • pobranie rozkazu z pamięci,
  • dekodowanie kodu rozkazowego,
  • obliczenie adresu efektywnego argumentu z uwzględnieniem modyfikacji adresowych, jeśli polecenie odwołuje się do pamięci,
  • obliczenie adresu fizycznego argumentu (rzeczywistego położenia danej w pamięci fizycznej)
  • pobranie argumentu z pamięci
  • wykonanie rozkazu (np. obliczenie właściwego wyniku)
  • zapisanie wyniku
  • wyznaczenie położenia następnego rozkazu (odpowiednia modyfikacja rejestru EIP).

Współczesne procesory IA-32 stosują przetwarzanie potokowe, czyli technologię polegającą na jednoczesnym wykonywaniu kolejnych etapów cyklu dla sąsiednich rozkazów przez różne bloki funkcjonalne.

Producenci procesorów

W ciągu ponad 25 lat istnienia i rozwoju architektury IA-32, powstało bardzo dużo procesorów opartych i implementujących ją. Wśród największych producentów takich procesorów warto wymienić: Intel, AMD, VIA, Cyrix, Centaur Technology, Transmeta, IBM, NexGen, NEC, UMC, SiS, ALi, nVidia. Część z tych firm produkowała lub projektowała procesory z architekturą IA-32 tylko przez pewien okres, część również przestała istnieć lub została wykupiona przez innych producentów.

Zobacz też

Linki zewnętrzne

Media użyte na tej stronie

Rejestry IA32.svg
Autor: Wersję rastrową wykonał użytkownik polskiego projektu wikipedii: A., Zwektoryzował: Krzysztof Zajączkowski, Licencja: CC-BY-SA-3.0
Rejestry IA-32