X86

**x86** on käsustike perekond, mis põhineb protsessoril Intel 8086.

Protsessorit 8086 hakati tootma aastal 1978. See täiendas Inteli eelmisi protsessoreid 16-bitiste käskudega. Nimi x86 tuleneb sellest, et mõnede Inteli hilisemate protsessorite nimed lõppesid samuti numbrikombinatsiooniga "86". Aastate jooksul on x86 käsustikku oluliselt täiustatud ja laiendatud, kuid peaaegu alati tagasiühilduvalt. x86 arhitektuuri kasutavad Intel, AMD, Cyrix, VIA ja paljud teised protsessoritootjad.

Kuna nimetust x86 hakati kasutama pärast 80386 tulekut, siis viitab x86 tavaliselt ühilduvusele 32-bitise käsustikuga, mida 80836 kasutas. Mõnikord kasutatakse tähistust x86-32, et eristada seda 16-bitisest x86 käsustikust ja 64-bitisest käsustikust x86-64. Kuigi enamik x86-protsessoritest uutes personaalarvutites ja serverites toetavad 64-bitist käsustikku, kasutatakse vanemate süsteemidega ühilduvusprobleemide vältimiseks tähistust x86-64 (või x64). Tähistust x86 kasutatakse seejuures ainult 32-bitiste võimalustega protsessorite puhul.

8086 loodi peamiselt manussüsteemides ja väiksemates personaalarvutites kasutamiseks, vastuseks edukale 8080-ühilduvale Zilog Z80-le. Hiljem tulid x86 arhitektuurile uued võimalused ja kasvas arvutusvõimsus. Tänapäeval on x86 üldlevinud nii personaalarvutites kui ka serverites ja tööjaamades. x86-põhist riistvara toetab suur hulk tarkvara, sealhulgas operatsioonisüsteemid Windows, Linux, BSD, Solaris ja Mac OS X.

Moodsaid x86 süsteeme kasutatakse manussüsteemides suhteliselt harva. Patareitoitega seadmetes eelistatakse lihtsamaid 16-bitised x86-protsessoreid. 32- ja 64-bitised süsteemid selles valdkonnas on näiteks VIA C7, VIA Nano, AMD Geode, Athlon Neo ja Intel Atom.

"Kohmakat" x86 arhitektuuri, mis sisaldab igandeid esimestest 8-bitistest protsessoritest, on korduvalt üritatud asendada, ka Inteli enda poolt. Selle näideteks on iAPX 432, Intel 960, Intel 860 ning Inteli ja Hewlett Packardi arhitektuur Itanium. Siiski on pideva mikroarhitektuuride ja tootmisprotsessi täiustamise tõttu x86-ga raske konkureerida. Kui AMD tuli välja x86 64-bitiste laiendustega, siis vastas Intel ühilduva lahendusega. Lisaks annavad 8-tuumaline Intel Xeon ja 12-tuumaline AMD Opteron tunnistust x86 hea skaleeruvuse kohta.

## Kronoloogia
Allolevas tabelis on levinumad tarbijale suunatud protsessorid, mis kasutavad x86 käsustikku. Tabel on jaotatud põlvkondadesse, mis tõstavad esile tähtsaid muutuseid x86 ajaloos. Märkus: CPU põlvkonnad ei ole rangelt määratletud.

### Arhitektuur
x86 on muutuva instruktsioonipikkusega CISC-arhitektuur, mille käsustik on välja arenenud lihtsamate 8-bitiste arhitektuuride, nt 8008, 8080 ja 8085, järjestikusel täiendamisel. Toetatud on baidi kaupa adresseerimine. Andmesõnade paigutus on peeneotsaline. Iga andmesõna suuruse puhul on lubatud ligipääs joondamata mäluaadressilt. Suurim täisarv ja mäluaadress võib sõltuvalt arhitektuuri põlvkonnast olla 16, 32 või 64 biti pikkune. Uuemad protsessorid toetavad ka väiksemaid andmesõnasid. SIMD võimaldab üheaegselt töödelda mitut skalaari.

#### Ujukomaarvutus ja SIMD
Protsessorile 8086 loodi kaasprotsessorina lisaks ujukomaprotsessor 8087. Hiljem sai sellest 80387. Järgnevatel protsessoritel on ujukomaprotsessori funktsionaalsus tagasiühilduvalt sisse ehitatud. Lisaks on uuematel protsessoritel SIMD plokk, milles saab töödelda korraga ühte või kahte 128-bitist andmesõna, milles mõlemas võib olla 2, 4, 8 või 16 ühesuurust täisarvu. See tähendab, et protsessor saab mälust laadida või mälusse salvestada korraga 128-bitise andmesõna ning teha mitme 128-bitise andmesõnaga paralleelselt loogilisi operatsioone. Tulevased x86-protsessorid toetavad ka 256-bitised SIMD operatsioone.

### Segmentimine
1970. aastatel muutus mälu odavamaks, kuid 16 biti abil sai adresseerida vaid 64 kB mälu. 8086 võttis kasutusele lihtsa segmendiregistri, mis suurendas mäluaadressi pikkust 4 biti võrra. Korrutades mäluaadressi 16-ga, oli võimalik adresseerida 1 MB (1 048 576 baiti), mis oli sellel ajal väiksema arvuti jaoks suur mälukogus. See oli suhteliselt keeruline lahendus, kuid vähendas riistvara keerukust ja tootmiskulusid.

Reaalrežiimis saadakse 20-bitine mäluaadress nihutades segmendi aadressi 4 biti võrra vasakule ja liites sellele nihke. Näiteks, kui segmendiregister DS on väärtusega A000h ja register SI väärtusega 5677h, siis DS:SI viitab absoluutsele aadressile DS × 10h + SI = A5677h. Seega saab reaalrežiimis adresseerida 220 baiti ehk 1 MB. Vaikimisi kasutatakse koodi jaoks segmendiregistrit CS, andmete jaoks DS-i ja pinu jaoks SS-i. Instruktsiooni eesliite abil saab määrata, millist neljast segmendiregistrist kasutada.

Kaitserežiimis ei viita segmendiregister füüsilisele aadressile, vaid sisaldab "selektorit", mis viitab süsteemitaseme struktuurile, milleks on segmendi deskriptor (kirjeldus). Deskriptor sisaldab segmendi alguse füüsilist mäluaadressi, segmendi pikkust ja ligipääsuõigusi. Mälu kasutamisel kontrollitakse, kas nihe vastab segmendis asuvale aadressile. Kui nihe asub segmendist väljaspool, siis tekitatakse erand (*exception*).

### Adresseerimine
Adresseerimine 16-bitistel x86-protsessoritel näeb välja järgmine:

:
\begin{Bmatrix}CS:\\DS:\\SS:\\ES:\end{Bmatrix}
\begin{bmatrix}\begin{Bmatrix}BX\\BP\end{Bmatrix}\end{bmatrix} + 
\begin{bmatrix}\begin{Bmatrix}SI\\DI\end{Bmatrix}\end{bmatrix} +
\rm [nihe]


32-bitise aadressiruumi adresserimine 32- või 64-bitisel x86 protsessoril:

:
\begin{Bmatrix}CS:\\DS:\\SS:\\ES:\\FS:\\GS:\end{Bmatrix}
\begin{bmatrix}\begin{Bmatrix}EAX\\EBX\\ECX\\EDX\\ESP\\EBP\\ESI\\EDI\end{Bmatrix}\end{bmatrix} + 
\begin{bmatrix}\begin{Bmatrix}EAX\\EBX\\ECX\\EDX\\EBP\\ESI\\EDI\end{Bmatrix}*\begin{Bmatrix}1\\2\\4\\8\end{Bmatrix}\end{bmatrix} +
\rm [nihe]


64-bitises koodis adresseerimine 64-bitisel x86 protsessoril:

:
\begin{Bmatrix}:\\FS:\\GS:\end{Bmatrix}
\begin{bmatrix}{\rm \ddot{u}ldotstarbeline\;register}\end{bmatrix} + 
\begin{bmatrix}{\rm \ddot{u}ldotstarbeline\;register}*\begin{Bmatrix}1\\2\\4\\8\end{Bmatrix}\end{bmatrix} +
\rm [nihe]


ja

:
RIP + \rm [nihe]


## x86 registrid
### 16-bitised
Esimestel Inteli x86-protsessoritel 8086 ja 8088 on neliteist 16-bitist registrit. Neli neist (AX, BX, CX, DX) on üldotstarbelised registrid (*GPR* – *General Purpose Register*). Need registrid on jaotatud kaheks. Näiteks registri BX ülemine osa on kättesaadav registri BH ja alumine osa registri BL kaudu. Registreid SP ja BP kasutatakse pinusse viitamiseks. SP ehk pinuviit (*Stack Pointer*) viitab pinu pealmisele elemendile, BP (*Base Pointer*) viitab tavaliselt lokaalmuutujate alale. Registreid SI (*Source Index*) ja DI (*Destination Index*) kasutatakse järjendite indekseerimiseks.

Nelja segmendiregistri (CS, DS, SS ja ES) abil moodustatakse mäluaadress. Register FLAGS sisaldab erinevaid lippe, näiteks ületäituvuse lipp (*overflow flag*) ja ülekande lipp (*carry flag*). IP ehk instruktsiooniviit (*Instruction Pointer*) viitab instruktsioonile, mida hakatakse parajasti mälust lugema ja seejärel täitma.

### 32-bitised
32-bitise protsessori 80386 tulekul laiendati enamikku registritest 32 biti suurusteks. Segmendiregistrid jäid endiselt 16-bitisteks. 32-bitilisust väljendab täht E (*Extended*) registrite nimede ees x86 assemblerkeeles. Näiteks register AX on uue 32-bitise registri EAX alumised 16 bitti, SI on ESI alumised 16 bitti jne. Lisati ka kaks uut segmendiregistrit FS ja GS.

Spetsiaalsete instruktsiooni eesliidete abil saab määrata, et 16-bitine kood sisaldab 32-bitist instruktsiooni või vastupidi.

Protsessorile 80486 lisandus ujukomaplokk koos kaheksa 80-bitise registriga. Pentium II protsessorile lisandusid kaheksa 64-bitist MMX täisarvuregistrit (MMX0–MMX7). Need registrid jagasid alumisi bitte FPU pinuga (st(0)–st(7)). Pentium III-st alates oli x86 protsessoritel 32-bitine SSE haldusregister MXCSR ja kaheksa 128-bitist ujukomaregistrit (XMM0–XMM7).

### 64-bitised
AMD Opteroni protsessorist alates on registrid 64 biti suurused. Nende nimed on RAX, RBX, ECX, RDX, RSI, RDI, RBP, RSP, RFLAGS ja RIP. EAX on 64-bitise RAX registri alumised 32 bitti jne. Lisandusid kaheksa üldotstarbelist registrit (R8–R15), mida on võimalik kasutada vaid 64-bitises režiimis.

### Kasutus
Üldotstarbelisi registreid võib kasutada igaks otstarbeks, kuid tavaliselt eelistatakse mõnede operatsioonide puhul kindlaid registreid. EAX on sobilik aritmeetiliste tehete jaoks, sest instruktsioon, milles vähemalt üks operand on EAX, on üldjuhul baidi võrra lühem ja seega ka kiiremini mälust loetav. EAX registrit nimetatakse ka akumulaatoriks (*accumulator*). EBX-i kasutatakse järjendi baasindeksina (*base*). ECX-i kasutatakse tihti loendurina (*counter*). Näiteks tsükli koostamise instruktsioon LOOP vähendab ECX registrit ühe võrra ja hüppab tsükli algusse, kui ECX-i väärtus ei ole 0. EDX on üldine register andmete (*data*) hoidmiseks.

64-bitistel registritel R8–R15 kindlat otstarvet ei ole.

## Laiendused
### PAE
PAE (*Physical Address Extension*) ehk füüsilise aadressi laiendus lisati esmalt protsessorile Pentium Pro. See lubab 32-bitises kaitserežiimis füüsilist aadressiruumi laiendada ja kasutada rohkem kui 4 GB mälu. Tavaliselt on aadressiruum kaitserežiimis 4 GB suurune.

### Virtualiseerimine
Mõned x86-protsessorid toetavad riistvaralist virtualiseerimist. Inteli lahendus kannab nime Intel VT, AMD vastav tehnoloogia on AMD-V. Emulaatorid x86 platvormil virtuaalmasinate jooksutamiseks on näiteks VMWare, Parallels, Microsoft Hyper-V ja Virtual PC. Avatud lähtekoodiga projektidest on tuntud QEMU, VirtualBox ja Xen.

## Viited

## Välislingid
*x86 registers – Yasm User Manual. Chapter 20. x86 architecture.