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 procesorem Intel 80386 i do dnia dzisiejszego jest najpopularniejszym modelem architektury stosowanym w komputerach, choć rozpoczął się już proces wypierania go przez model 64-bitowy EM64T (tzw. x86-64) i inne architektury 64-bitowe.

Spis treści

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

[edytuj] Rejestry

Podstawowe rejestry w architekturze IA-32
Podstawowe rejestry w architekturze IA-32

[edytuj] 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 - źródÅ‚o
    • EDI - przeznaczenie
    • EBP - wskaźnik bazowy
    • ESP - wskaź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.

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

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

[edytuj] Rejestr flag procesora

Do opisu stanu procesora w architekturze IA-32 wykorzystuje się rejestr stanu procesora EFLAGS. Poniższa tabela przedstawia nazwy i znaczenie poszczególnych bitów w tym rejestrze:

Rejestr flag w architekturze Intel x86
nr bitu skrót lub wartość opis kategoria*
0 CF flaga przeniesienia (carry) S
1 1 zarezerwowany  
2 PF flaga parzystości (parity) S
3 0 zarezerwowany  
4 AF flaga wyrównania (adjust) S
5 0 zarezerwowany  
6 ZF flaga zera (zero) S
7 SF flaga znaku (sign) S
8 TP flaga umożliwiająca krokowe wykonanie (trap) X
9 IF flaga zezwolenia na przerwania (interrupt enable) X
10 DF flaga kierunku (direction) C
11 OF flaga przepełnienia (overflow) S
12, 13 IOPL poziom uprawnień we/wy (I/O privilege level, od 286) X
14 NT nested task flag (od 286) X
15 0 zarezerwowany  
16 RF flaga wznowienia (resume, od 386) X
17 VM flaga trybu Virtual 8086 (od 386) X
18 AC alignment check (od 486SX) X
19 VIF Virtual interrupt flag (od Pentium) X
20 VIP Virtual interrupt pending (od Pentium) X
21 ID Identification (od Pentium) X
22 0 zarezerwowany  
23 0 zarezerwowany  
24 0 zarezerwowany  
25 0 zarezerwowany  
26 0 zarezerwowany  
27 0 zarezerwowany  
28 0 zarezerwowany  
29 0 zarezerwowany  
30 0 zarezerwowany  
31 0 zarezerwowany  

S: Znacznik stanu
C: Znacznik kontrolny
X: Znacznik systemowy

[edytuj] Inne rejestry

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

[edytuj] Wykonywanie programów

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

[edytuj] 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 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 (opcode) 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.

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

[edytuj] Zobacz też

[edytuj] Linki zewnętrzne