**IA-32**, generelt kalt **x86-32**, er instruksjonsettarkitekturen til Intel sine mest vellykkede prosessorer. Dette er en 32-bit utvidelse fra den originale Intel x86 prosessorarkitekturen. IA-32 ble innført i 386-arkitekturen og alle Intels prosessorer for forbrukerelektronikk siden har støttet dette instruksjonssettet. I tillegg har mange andre prosessorprodusenter benyttet arkitekturen. Denne arkitekturen definerer intruksjonssettet for den typen mikroprosessorer som er installert i de aller fleste personlige datamaskiner rundt om i verden.

Begrepet IA-32 betyr **Intel Architecture, 32-bit**, som skiller det fra forgjengerne 16-bit x86 prosessorer, og den senere 64-bit arkitekturen IA-64 som ble introdusert i Intel Itanium prosessorer. IA-32 har hatt store utbredelse delvis på grunn av dens fulle bakoverkompatibilitet. IA-64 er imidlertid ikke en videreutvikling av IA-32, men en helt annen arkitektur; AMD utviklet x86-arkitekturen videre til 64-bit med sin x86-64-arkitektur.

Arkitekturen
------------

For å sikre bakoverkompatibiliteten arvet IA-32 mye fra den 16-bit x86-arkitekturen. En IA-32-prosessor er en CISC-prosessor med 8 generelle prosessorregistre, 6 segmentregistre (mot 4 i tidligere x86-arkitekturer), programteller og flaggregister. Arkitekturen tillot i utgangspunktet bruk av 4 gigabyte minne, men maskinvaren som implementerte arkitekturen kunne sette en lavere grense. Senere kom utvidelser som tillot bruk av opptil 64 GB.

Instruksjonssettet inneholder instruksjoner for flyttallsoperasjoner, men de første IA-32-prosessorene hadde, i likhet med sine 16-bit forgjengere, ingen intern FPU. Flyttallsoperasjonene måtte derfor enten emuleres av programvare eller utføres av en ekstern x87 flyttallsprosessor. Selv etter at prosessorene har fått intern FPU er skillet mellom IA-32 forøvrig og x87-arkitekturens flyttalsinstruksjoner tydelig.

IA-32-prosessorer kan kjøre i reell modus eller beskyttet modus. I reell modus oppfører den seg mest mulig som en Intel 8086. Beskyttet modus ble først innført i Intel 80286, men det var først med IA-32 og Intel 80386 den kom til sin rett. Det er beskyttet modus som er den modusen IA-32 er ment å operere i og den som gir tilgang til arkitekturens fulle potensial.

Registre
--------

Registrene i IA-32 er de samme som de har vært siden 8086-prosessoren, men med unntak av segmentregistrene, ble de utvidet fra 16 til 32 biter. Dette ble gjort på en slik måte at man fortsatt kan referere til den nederste 16 bitene med de gamle navnene, mens nye programmer skrevet for IA-32 kan referere til alle 32 bitene ved å sette en *E* foran de gamle navnene. Segmentregistrene forble 16-bit og beholdt navnene, men det kom til to nye. I tillegg er det en håndfull andre registre som brukes av operativsystemet til å styre prosessorens oppførsel eller få spesiell informasjon fra den. Dessuten har x87-FPUen sine egne registre.

Sammenlignet med andre arkitekturer har IA-32 få generelle registre, noe som gjør at mindre data får plass i prosessoren og at data dermed oftere må leses fra og skrives til det mye tregere minnet.

### Generelle registre

| Beskrivelse | 32-bit | 16-bit | Øvre | Nedre |
| --- | --- | --- | --- | --- |
| Akkumulator-register | EAX | AX | AH | AL |
| Baseregister | EBX | BX | BH | BL |
| Telleregister | ECX | CX | CH | CL |
| Dataregister | EDX | DX | DH | DL |

Med *øvre* og *nedre* menes de to halvdelene av 16-bit registrene. Det er ingen mulighet til å hente ut de øvre 16 bitene direkte, annet enn å lese hele 32-bit registeret. Følgende figur viser sammenheng mellom et 32-bit register, her EAX, og dets 16- og 8-bit underregistre.

|  |
| --- |
| EAX |
|  | AX |
|   |   | AH | AL |

Øvrige registre har kun 32- og 16-bit utgaver.

| Beskrivelse | 32-bit | 16-bit |
| --- | --- | --- |
| Stakkpeker | ESP | SP |
| Basepeker | EBP | BP |
| Kildeindeks | ESI | SI |
| Målindeks | EDI | DI |

### Segmentregistre

| Beskrivelse | Navn |
| --- | --- |
| Kodesegment | CS |
| Datasegment | DS |
| Ekstrasegment | ES |
| Ekstrasegment 2 | FS |
| Ekstrasegment 3 | GS |
| Stakksegment | SS |

### Instruksjonspeker

| 32-bit | 16-bit |
| --- | --- |
| EIP | IP |

### Flaggregister

| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| CF |  | PF |  | AF |  | ZF | SF | TF | IF | DF | OF | IOPL | NT |  | RF | VM | AC | VIF | VIP | ID |  |  |  |  |  |  |  |  |  |  |

**Kontrollflagg:**

* TF *(trap flag)*: Brukes til debugging. Når satt vil koden utføres trinn for trinn.
* IF *(interrupt flag)*: Angir om avbrudd skal håndteres.
* DF *(direction flag)*: Angir om strengoperasjoner skal arbeide seg framover (0) eller bakover (1).
* IOPL *(I/O privilege level)*: Angir privilegienivået som er nødvendig for å utføre I/O-instruksjoner.
* VM (Virtual-8086 modus): Når satt vil prosessoren kjøre programmet som på en 8086, men innenfor rammene av beskyttet modus.

**Statusflagg:**

* CF *(carry flag)*: Settes ved mente i et 8-bit eller 16 bit resultat.
* PF (paritetsflagg): Settes når resultatet av en operasjon er et like antall enere, og brukes til å kontrollere feil i dataoverføringer.
* AF *(adjust flag)*
* ZF *(zero flag)*: Settes når resultatet av en beregning er 0.
* SF *(sign flag)*: Angir fortegnet til et tall. 0 er positive tall og 1 er negative tall.
* OF *(overflow flag)*: Settes lik 1 ved aritmetisk overflyt. Dette skjer når et tall overskrider den lovlige maksimale størrelse.

### Flyttallsregistre

x87-arkitekturen benytter åtte 80-biters flyttallsregistre. Disse registrene er organisert som en stakk. Selv om registrene er på 80 bit, kan de leses fra og skrives til minnet som 32 bit (enkel presisjon), 64 bit (dobbel presisjon) eller 80 bit. De to førstnevnte formatene følger IEEE 754-standarden.

I tillegg har x87-arkitekturen seks registre for status og kontroll.

Beskyttet modus
---------------

Utdypende artikkel: Beskyttet modus

Beskyttet modus var en ny måte for en x86-prosessor å operere på. Riktignok ble beskyttet modus introdusert allerede i 80286-prosessoren, men det var først med den mer velutviklede utgaven i IA-32 at beskyttet modus fikk sitt gjennombrudd. Beskyttet modus har støtte for multitasking og mekanismer som beskytter operativsystemet fra brukerapplikasjonene, samt brukerapplikasjonene fra hverandre.

SIMD-utvidelser
---------------

*Se også: SIMD*
I 1997 introduserte Intel MMX som en utvidelse av IA-32 instruksjonssettet. MMX-instruksjonene opererer på åtte nye heltallsregistre kalt MM0–MM7. Disse registrene kan brukes til å behandle én 64-bit verdi, to 32-bit verdier, fire 16-bit verdier eller åtte 8-bit verdier.

AMD fulgte opp i 1998 med 3DNow! som utvidet MMX sine heltallsinstruksjoner med noen flyttallsoperasjoner. I påfølgende år kom det ytterligere utvidelser av 3DNow!

Med Pentium III tok Intel igjen føringen med SSE. SSE tilføyde nye instruksjoner og registre for SIMD-operasjoner med flyttall. De nye SSE-registrene, XMM0–XMM7 var på 128 biter med plass til fire 32-bit eller to 64-bit flyttall. Instruksjonene kan enten utføres på alle komponentene, eller bare på én. Med SSE begynte utfasingen av de gamle x87-flyttallsinstruksjonene, selv om de fortsatt vil være tilstede av hensyn til bakoverkompatibilitet.

Referanser
----------

1. ↑  «Intel lanserer MMX». ITavisen. 10. januar 1997. Arkivert fra originalen 18. januar 2012. Besøkt 11. september 2009.
2. ↑  «AMD Introduces AMD-K6®-2 Processor with New 3DNow!™ Technology» **(engelsk)**. AMD. Besøkt 11. september 2009.

Litteratur
----------

* Intel (2008). *Intel® 64 and IA-32 Architectures Software Developer's Manual* **(engelsk)**.