IA-32

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

IA-32 (Intel Architecture 32 bit) – 32-bitowy model programowy mikroprocesora opracowany przez firmę Intel. Nazywany czasem 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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

Podstawowe rejestry w architekturze IA-32

Rejestry ogólnego przeznaczenia[edytuj | edytuj kod]

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 – źródło
    • EDI – przeznaczenie
    • 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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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

Wykonywanie programów[edytuj | edytuj kod]

Zestaw instrukcji[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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 zerojedynkowych. 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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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ż[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]