x86-instructieset

(Doorverwezen vanaf X86)

De x86-instructieset is een CISC-instructieset voor computers. Deze werd eind jaren zeventig door Intel ontwikkeld voor de 8086-processor. IBM besloot de processor van Intel in zijn IBM PC te gebruiken, en doordat de pc wijdverbreid raakte, werd de x86-instructieset met voorsprong de meest gebruikte instructieset.

Een "Northwood"-core-Pentium 4-processor

De x86-instructieset was oorspronkelijk een 16 bits-instructieset. In de loop der jaren is de x86-instructieset steeds uitgebreid om aan de wensen van de tijd te blijven voldoen. Belangrijke wijzigingen waren een 32 bits-modus, toevoeging van vectorregisters (MMX en SSE) en rond de eeuwwisseling de toevoeging van een 64 bits-modus: x86-64 (AMD64, EM64T).

Gegevens van de instructieset

Er zijn drie hoofdvarianten van de x86-instructieset, de 16 bits-variant, de 32 bits-variant en de 64 bits-variant. Afhankelijk van de modus waarin een x86-processor gezet wordt, gebruikt de processor een van de varianten.

16 bits

Type van architectuur:Meerdere registers. Uitzondering is de FPU-stack, dit is een stackarchitectuur
Aantal registers:Acht 16 bits-integerregisters (waarvan één gereserveerd is als stackpointer), vier segmentregisters (waarvan één gereserveerd voor de stack). De 8087-FPU heeft een stack waarin acht 80 bits-zwevendekommagetallen gezet kunnen worden.
Adresruimte:220 bytes (1 MiB)
Geheugenbeheer:Segmentregisters
VlaggenNul, overdracht, negatief, overflow, pariteit
AdresseermodiOnmiddellijk, geheugen. De geheugenadresmodus kan een combinatie zijn van een absoluut adres, een basisregister en een indexregister

32 bits

Type van architectuur:Meerdere registers. Uitzondering is de FPU-stack, dit is een stackarchitectuur
Aantal registers:Acht 32 bits-integerregisters (waarvan één gereserveerd is als stackpointer), zes segmentregisters (waarvan één gereserveerd voor de stack). De 80387-FPU heeft een stack waarin acht 80 bits-zwevendekommagetallen gezet kunnen worden. Deze kunnen ook werken als acht vectorregisters (MMX). Processoren met SSE hebben bovendien acht extra vectorregisters
Adresruimte:232 bytes (4 GiB)
Geheugenbeheer:Segmentregisters, geheugenpaginering
VlaggenNul, overdracht, negatief, overflow, pariteit
AdresseermodiOnmiddellijk, geheugen. De geheugenadresmodus kan een combinatie zijn van een absoluut adres, een basisregister en een indexregister met schaling

64 bits

Type van architectuur:Meerdere registers. Uitzondering is de FPU-stack, dit is een stackarchitectuur
Aantal registers:Zestien 64 bits-integerregisters (waarvan één gereserveerd is als stackpointer), zes segmentregisters (waarvan één gereserveerd voor de stack). De FPU heeft een stack waarin acht 80 bits-zwevendekommagetallen gezet kunnen worden. Deze kunnen ook werken als acht vectorregisters (MMX). Processoren met SSE hebben bovendien 16 extra vectorregisters
Adresruimte:248 bytes (256 TiB)
Geheugenbeheer:Segmentregisters, geheugenpaginering
VlaggenNul, overdracht, negatief, overflow, pariteit
AdresseermodiOnmiddellijk, geheugen. De geheugenadresmodus kan een combinatie zijn van een absoluut adres, een basisregister en een indexregister met schaling

Fabrikanten

Aanvankelijk werden x86-processoren alleen door Intel gefabriceerd, hoewel NEC wel de V20- en V30-processoren met 8088-compatibele instructieset leverde. In de tijd van de 80386-processor besloot Intel zijn ontwerp aan andere fabrikanten in licentie te geven. Deze fabrikanten, AMD en Cyrix, konden vervolgens zelfstandig hun eigen x86-processoren op de markt brengen.

Toen de 80486 enige tijd op de markt was, leek het er op dat Intel spijt kreeg van zijn besluit zijn processoren in licentie te geven. Nieuwe licenties werden stopgezet en er ontbrandde een jarenlange rechtsstrijd tegen AMD over de auteursrechten op delen van de processor. Deze rechtszaak werd uiteindelijk geschikt, waarbij AMD het recht kreeg x86-processoren te maken, maar zij deze vanaf dan zelf diende te ontwerpen. Sindsdien ontwerpen zowel Cyrix als AMD hun eigen processoren.

Last uit het verleden

De x86-architectuur gaat al lang mee. Sinds eind jaren 70 is er veel aan inzicht veranderd in hoe processoren het best gebouwd kunnen worden, en er zijn steeds meer instructies bij gekomen waarvan sommige oude overbodig maken, en andere omslachtig geïmplementeerd zijn omdat het anders onmogelijk was ze in de bestaande instructieset in te passen. Velen vinden de x86-instructieset daarom onelegant.

De reden dat men deze instructieset vandaag de dag nog steeds gebruikt, is dat er heel veel software voor de x86-instructieset geschreven is, zodat het ondoenlijk is geworden de hele wereld op een andere instructieset over te laten gaan.

Zoiets is in het verleden een aantal keren geprobeerd. De bekendste voorbeelden hiervan zijn de instructiesets van ARM, de PowerPC (RISC-architectuur) en de Itanium (VLIW-architectuur). De ontwikkeling had maar één enkel doel: een door moderne technieken ontwikkelde processor zou dusdanig veel krachtiger worden dan een willekeurige x86-processor dat deze het op den duur zou verliezen.

Dit is echter niet gebeurd. De achterliggende reden is dat ook de ideeën achter de PowerPC ietwat achterhaald raakten, en alhoewel de processor als minder "lelijk" beschouwd wordt dan de x86-processoren, dragen beide inmiddels een last uit het verleden mee. Een ietwat praktischere reden was dat de PowerPC nooit veel voordeel gaf om de x86-processoren te kunnen verdringen, en op bepaalde momenten zelfs iets achterliep.

Tabel van de instructieset

De instructieset is verre van eenvoudig. De operand van veel instructies wordt beschreven in een zogenoemde mod/rm-byte. De operand kan een register zijn maar ook een adres in het geheugen. De mod/rm-byte bevat:

  • bits 7 6: mod
  • bits 5 4 3: reg
  • bits 2 1 0: r/m

In veel instructies wordt het deel reg, bits 5 4 3, gebruikt om de opcode uit te breiden.

In onderstaande tabellen leest u in de linkerkolom de bits 7-3 van de opcode, de eerste byte van de eerste instructie. Bovenaan staan de bits 2-0. Voor de instructies waarbij het deel reg van de mod/rm-byte wordt gebruikt om de opcode uit te breiden, vindt u deze waarde in de kolom reg.

Een speciaal geval is de instructie POP CS, met de opcode 0F. Deze instructie wordt als volkomen nutteloos beschouwd. In de latere versies van de processor werd deze instructie dan ook verwijderd en ging 0F dienen om een opcode van twee bytes aan te kondigen. De instructies die met 0F beginnen vindt u in de tweede tabel.

Legenda
acaccumulator, AL, AX of EAX
rregister, zie volgende tabel
rmregister of adres in het geheugen, afhankelijk van de mod/rm-byte
segsegmentregister: 00=ES, 01=CS, 10=SS, 11=DS, of 0=FS, 1=GS
imimmediate waarde

De operanden kunnen een lengte hebben van 8 of 16 bits, met ingang van de 80386 ook 32 bits. Bij veel instructies wordt de lengte van de operand bepaald door bit 0 van de opcode: is deze nul, dan heeft de operand 8 bits. Is deze niet nul, dan bepaalt de instelling van de processor wat de operandlengte is (16 of 32). Deze kan worden veranderd met het prefix 66.

Codering van registers Codering van segmentregisters
code8 bits16 bits32 bitscodein 06-3Fin 65, 66, 0FA
000ALAXEAX00ES
001CLCXECX01CS
010DLDXEDX10SS
011BLBXEBX11DS
100AHSPESP0 FS
101CHBPEBP1GS
110DHSIESI 
111BHDIEDI

De volledige instructieset staat in de tabellen hieronder

bits
7-3
reg01234567
00ADD rm,rmADD ac,imPUSH segPOP seg
(0F is POP CS in 8086,
daarna prefix,
zie volgende tabel)
08OR rm,rmOR ac,im
10ADC rm,rmADC ac,im
18SBB rm,rmSBB ac,im
20AND rm,rmAND ac,im(segment
override prefix)
DAA
28SUB rm,rmSUB ac,imDAS
30XOR rm,rmXOR ac,imAAA
38CMP rm,rmCMP ac,imAAS
40INC r
48DEC r
50PUSH r
58POP r
60PUSHAPOPABOUND
(vanaf
80186)
ARPL(segment
override
prefix)
Operand
size
(prefix)
Address
size
(prefix)
68PUSH imIMUL rm,rPUSH imIMUL rm,rINSOUTS
70JO nearJNO nearJB nearJNB nearJE nearJNE nearJBE nearJNBE near
78JS nearJNS nearJP nearJP nearJL nearJNL nearJLE nearJNLE near
800ADD rm,imTEST rm,rXCHG rm,r
1OR rm,rm
2ADC rm,im
3SBB rm,im
4AND rm,im
5SUB rm,im
6XOR rm,im
7CMP rm,im
880MOV rm,rMOV r,rmMOV rm,segLEAMOV seg,rmPOP rm
1
2
3
4
5
6
7
90NOPXCHG ac,r
98CBWCWDCALL farWAITPUSHFPOPFSAHFLAHF
A0MOV ac,mMOV m,acMOVSCMPS
A8TEST ac,imSTOSLODSSCAS
B0MOV r,im
B8
C00ROL rm,imRET nearRET nearLESLDSMOV rm,im
1ROR rm,im
2RCL rm,im
3RCR rm,im
4SHL / SAL rm,im
5SHR rm,im
6gelijk aan SHL / SAL
7SAR rm,im
C8ENTERLEAVERET farRET farINT 3INT typeINTOIRET
D00ROL rm,1ROL rm,CLAAMAADSETALCXLAT
1ROR rm,1ROR rm,CL
2RCL rm,1RCL rm,CL
3RCR rm,1RCR rm,CL
4SHL/SAL rm,1SHL/SAL rm,CL
5SHR rm,1SHR rm,CL
6gelijk aan SHL / SALgelijk aan SHL / SAL
7SAR rm,1SAR rm,CL
D8Processor extension
E0LOOPNZ shortLOOPZ shortLOOP shortJCXZ shortIN portOUT port
E8CALL nearJMP nearJMP farJMP shortINOUT
F00LOCK (prefix)ICEBP (vanaf 80386)
SMI (sommige chips van AMD)
REPNE (prefix)REPE (prefix)HLTCMCTEST rm,im
1
2NOT rm
3NEG
4MUL ac,rm
5IMUL ac,rm
6DIV ac,rm
7IDIV ac,rm
F80CLCSTCCLISTICLDSTDINC rm
1DEC rm
2CALL near ind
3CALL far ind
4JMP near ind
5JMP far ind
6PUSH rm
7
 
Instructies met voorvoegsel 0F
bits
15-3
reg01234567
0F000SLDTSGDTLARLSL[1]LOADALL
(alleen 80286)
CLTSLOADALL
(alleen 80386)
RES3 (AMD 386)
RES4 (AMD 486)
ICERET (vanaf 486)
1STRSIDT
2LLDTLGDT
3LTRLIDT
4VERRSMSW
5VERW
6LMSW
7INVLPG (vanaf 486)
0F08 INVD (vanaf 486)WBINVD (vanaf 486)
0F10 UMOV (386, 486)
0F18 
0F20 MOV van of naar control- of testregister
0F28 
0F30 WRMSR (vanaf 80386)RDTSC (vanaf Pentium)RDMSR (vanaf 80386)
0F38 
0F40 
0F48 
0F50 
0F58 
0F60 
0F68 
0F70 
0F78 SVDC
(Cyrix 486)
RSDC
(Cyrix 486)
SVLDT
(Cyrix 486)
RSLDT
(Cyrix 486)
SVTS
(Cyrix 486)
RSTS
(Cyrix 486)
SMINT
(Cyrix 486)
0F80 JO farJNO farJB farJNB farJE farJNE farJBE farJNBE far
0F88 JS farJNS farJP farJP farJL farJNL farJLE farJNLE far
0F90 SETO rmSETNO rmSETB rmSETNB rmSETE rmSETNE rmSETBE rmSETNBE rm
0F98 SETS rmSETNS rmSETP rmSETP rmSETL rmSETNL rmSETLE rmSETNLE rm
0FA0 PUSH segPOP segCPUID (vanaf 486)BT rm,rSHLD, rm,imSHLD rm,CLXBTS (80386)
CMPXCHG (vanaf Pentium)
IBTS (oorspr. 80386)
CMPXCHG (vanaf Pentium)
0FA8 RSM (vanaf 80386)BTS rm,rSHRD, rm,imSHRD rm,CLIMUL r,rm
0FB0 CMPXCHG (vanaf Pentium)LSSBTR rm,rLFSLGSMOVZX rm,r
0FB84BT rm,imBTC rm,rBSFMOVSX rm,r
5BTS rm,im
6BTR rm,im
7BTC rm,im
0FC00XADD
1CMPXCHG8B (vanaf Pentium)
2
3
4
5
6
7
0FC8 BSWAP (vanaf 486)
0FD0 
0FD8 
0FE0 
0FE8 
0FF0 
0FF8 

Zie ook

Externe links