thumb|Een "Northwood"-core-Pentium 4-processor 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.

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 Vlaggen Nul, overdracht, negatief, overflow, pariteit Adresseermodi Onmiddellijk, 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 Vlaggen Nul, overdracht, negatief, overflow, pariteit Adresseermodi Onmiddellijk, 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 Vlaggen Nul, overdracht, negatief, overflow, pariteit Adresseermodi Onmiddellijk, 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 erop 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.

Legendaacaccumulator, AL, AX of EAXrregister, zie volgende tabelrmregister of adres in het geheugen, afhankelijk van de mod/rm-bytesegsegmentregister: 00=ES, 01=CS, 10=SS, 11=DS, of 0=FS, 1=GSimimmediate 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 registersCodering van segmentregisterscode8 bits16 bits32 bitscodein 06-3Fin 65, 66, 0FA000ALAXEAX00ES001CLCXECX01CS010DLDXEDX10SS011BLBXEBX11DS100AHSPESP0 FS101CHBPEBP1GS110DHSIESI 111BHDIEDI

De volledige instructieset staat in de tabellen hieronder bits7-3reg0123456700ADD rm,rmADD ac,imPUSH segPOP seg(0F is POP CS in 8086,daarna prefix,zie volgende tabel)08OR rm,rmOR ac,im10ADC rm,rmADC ac,im18SBB rm,rmSBB ac,im20AND rm,rmAND ac,im(segment override prefix)DAA28SUB rm,rmSUB ac,imDAS30XOR rm,rmXOR ac,imAAA38CMP rm,rmCMP ac,imAAS40INC r48DEC r50PUSH r58POP r60PUSHAPOPABOUND(vanaf80186)ARPL(segmentoverrideprefix)Operandsize(prefix)Addresssize(prefix)68PUSH imIMUL rm,rPUSH imIMUL rm,rINSOUTS70JO nearJNO nearJB nearJNB nearJE nearJNE nearJBE nearJNBE near78JS nearJNS nearJP nearJP nearJL nearJNL nearJLE nearJNLE near800ADD rm,imTEST rm,rXCHG rm,r1OR rm,rm2ADC rm,im3SBB rm,im4AND rm,im5SUB rm,im6XOR rm,im7CMP rm,im880MOV rm,rMOV r,rmMOV rm,segLEAMOV seg,rm POP rm123456790NOPXCHG ac,r98CBWCWDCALL farWAITPUSHFPOPFSAHFLAHFA0MOV ac,mMOV m,acMOVSCMPSA8TEST ac,imSTOSLODSSCASB0MOV r,imB8C00ROL rm,imRET nearRET nearLESLDSMOV rm,im1ROR rm,im2RCL rm,im3RCR rm,im4SHL / SAL rm,im5SHR rm,im6gelijk aan SHL / SAL7SAR rm,imC8ENTERLEAVERET farRET farINT 3INT typeINTOIRETD00ROL rm,1ROL rm,CLAAMAADSETALCXLAT1ROR rm,1ROR rm,CL2RCL rm,1RCL rm,CL3RCR rm,1RCR rm,CL4SHL/SAL rm,1SHL/SAL rm,CL5SHR rm,1SHR rm,CL6gelijk aan SHL / SALgelijk aan SHL / SAL7SAR rm,1SAR rm,CLD8Processor extensionE0LOOPNZ shortLOOPZ shortLOOP shortJCXZ shortIN portOUT portE8CALL nearJMP nearJMP farJMP shortINOUTF00LOCK (prefix)ICEBP (vanaf 80386)SMI (sommige chips van AMD)REPNE (prefix)REPE (prefix)HLTCMCTEST rm,im12NOT rm3NEG4MUL ac,rm5IMUL ac,rm6DIV ac,rm7IDIV ac,rmF80CLCSTCCLISTICLDSTDINC rm1DEC rm2CALL near ind3CALL far ind4JMP near ind5JMP far ind6PUSH rm7 Instructies met voorvoegsel 0Fbits15-3reg012345670F000SLDTSGDTLARLSL* LSL-instructie (Load Segment Limit) zie: Load Segment LimitLOADALL(alleen 80286)CLTSLOADALL(alleen 80386)RES3 (AMD 386)RES4 (AMD 486)ICERET (vanaf 486)1STRSIDT2LLDTLGDT3LTRLIDT4VERRSMSW5VERW6LMSW7INVLPG (vanaf 486)0F08 INVD (vanaf 486)WBINVD (vanaf 486)0F10 UMOV (386, 486)0F18 0F20 MOV van of naar control- of testregister0F28 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 far0F88 JS farJNS farJP farJP farJL farJNL farJLE farJNLE far0F90 SETO rmSETNO rmSETB rmSETNB rmSETE rmSETNE rmSETBE rmSETNBE rm0F98 SETS rmSETNS rmSETP rmSETP rmSETL rmSETNL rmSETLE rmSETNLE rm0FA0 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,rm0FB0 CMPXCHG (vanaf Pentium)LSSBTR rm,rLFSLGSMOVZX rm,r0FB84BT rm,imBTC rm,rBSFMOVSX rm,r5BTS rm,im6BTR rm,im7BTC rm,im0FC00XADD1CMPXCHG8B (vanaf Pentium)2345670FC8 BSWAP (vanaf 486)0FD0 0FD8 0FE0 0FE8 0FF0 0FF8 

Zie ook FLAGS register

Externe links AMD's handleiding van de x86-architectuur [ Deel 1 | Deel 2 | Deel 3 | Deel 4 | Deel 5 ]

Categorie:Instructieset