# Jeu d'instructions x86

Le jeu d'instructions du x86 a subi de nombreux changements au cours du temps. La plupart d'entre eux ne sont que des ajouts au jeu d'instructions initial afin d'apporter de nouvelles fonctionnalités.

## Jeu d'instructions sur les entiers

Ceci est le jeu d'instructions complet pour les processeurs 8086-8088 et la plupart, si ce n'est toutes ces instructions sont accessibles en mode 32 bits. Elles opèrent alors sur les registres et valeurs 32 bits (eax, ebx, etc.) en lieu et place de leur contrepartie en 16 bits (ax, bx, etc.).

### Instructions originales des 8086/8088

| Nom | Sens | Traduction | Notes |
| AAA | ASCII Adjust AL after Addition | Ajuste le registre AL après addition (mode ASCII) | Utilisé avec le codage BCD non compacté |
| AAD | ASCII Adjust AX after Division | Ajuste le registre AX après division (mode ASCII) | Utilisé avec le codage BCD non compacté, bogué dans le jeu d'instructions original, mais « réparé » dans le NEC V20, causant de nombreuses incompatibilités |
| AAM | ASCII Adjust AX after Multiplication | Ajuste le registre AX après multiplication (mode ASCII) | Utilisé avec le codage BCD non compacté |
| AAS | ASCII Adjust AL after Subtraction | Ajuste le registre AL après soustraction (mode ASCII) | Utilisé avec le codage BCD non compacté |
| ADC | Add with Carry | Ajoute deux entiers, plus le drapeau de retenue | Le résultat remplace le premier opérande |
| ADD | Add | Ajoute deux entiers | Le résultat remplace le premier opérande |
| AND | Logical AND | Effectue un ET logique des opérandes | Le résultat remplace le premier opérande |
| CALL | Call Procedure | Appelle une procédure | |
| CBW | Convert Byte to Word | Convertit un octet en mot | Le registre AL est étendu à AX |
| CLC | Clear Carry Flag | Met le drapeau de retenue à zéro | |
| CLD | Clear Direction Flag | Met le drapeau de direction à zéro | |
| CLI | Clear Interrupt Flag | Met le drapeau d'interruption à zéro | |
| CMC | Complement Carry Flag | Inverse le drapeau de retenue | |
| CMP | Compare | Compare deux entiers (de façon arithmétique) | Positionne les drapeaux en fonction de la différence entre les opérandes |
| CMPSzz | Compare Strings | Compare un octet/mot de deux chaînes | Mnémoniques : CMPS, CMPSB, CMPSW |
| CWD | Convert Word to Doubleword | Convertit un mot en double mot | Le registre AX est étendu à DX:AX |
| DAA | Decimal Adjust AL after Addition | Ajuste le registre AL après addition (mode décimal) | Utilisé avec le codage BCD compacté |
| DAS | Decimal Adjust AL after Subtraction | Ajuste le registre AL après soustraction (mode décimal) | Utilisé avec le codage BCD compacté |
| DEC | Decrement by 1 | Décrémente un entier | Ôte un de l'opérande |
| DIV | Unsigned Divide | Divise par un entier non signé | Le dividende est le registre AX/DX:AX, le quotient est écrit dans AL/AX et le reste dans AH/DX |
| ESC | Escape | | Utilisé avec l'unité de calcul en virgule flottante |
| HLT | Halt | Entre en état d'arrêt jusqu'à réception d'une interruption | Permet de réduire la consommation de puissance du processeur. Alias : HALT |
| IDIV | Signed Divide | Divise par un entier signé | Le dividende est le registre AX/DX:AX, le quotient est écrit dans AL/AX et le reste dans AH/DX |
| IMUL | Signed Multiply | Multiplie par un entier signé | Le facteur est le registre AL/AX et le produit est écrit dans AX/DX:AX |
| IN | Input from Port | Lit depuis un port | La destination est le registre AL/AX |
| INC | Increment by 1 | Incrémente un entier | Ajoute un à l'opérande |
| INT | Call to Interrupt Procedure | Appelle l'interruption identifiée par l'opérande | |
| INTO | Call to Interrupt Procedure if Overflow | Appelle l'interruption de débordement si le drapeau de débordement est à un | |
| IRET | Interrupt Return | Revient d'une interruption | |
| Jcc | Jump if Condition Is Met | Saute si une condition est vérifiée | Mnémoniques : JA, JAE, JB, JBE, JC, JCXZ, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ |
| JMP | Jump | Saute (inconditionnel) | |
| LAHF | Load Flags into AH | Copie le registre des drapeaux dans le registre AH | |
| LDS | Load DS with Far Pointer | Charge un pointeur de type far (lointain) dans le registre DS (segment) et l'opérande (décalage) | |
| LEA | Load Effective Address | Charge l'adresse du second opérande dans le premier | |
| LES | Load ES with Far Pointer | Charge un pointeur de type far (lointain) dans le registre ES (segment) et l'opérande (décalage) | |
| LOCK | Assert LOCK# Signal Prefix | Préfixe verrouillant les bus pour les prochaines instructions | Utilisé pour les plates-formes multiprocesseurs. |
| LODSzz | Load String | Copie un octet/mot d'une chaîne | La destination est le registre AL/AX. Mnémoniques : LODS, LODSB, LODSW |
| LOOPcc | Loop According to Counter | Décrémente le compteur et saute si une condition est vérifiée | Le compteur est le registre CX. Mnémoniques : LOOP, LOOPE, LOOPNE, LOOPNZ, LOOPZ |
| MOV | Move | Copie le second opérande dans le premier | |
| MOVSzz | Move from String to String | Copie un octet/mot d'une chaîne vers une autre | Mnémoniques : MOVS, MOVSB, MOVSW |
| MUL | Unsigned Multiply | Multiplie par un entier non signé | Le facteur est le registre AL/AX et le produit est écrit dans AX/DX:AX |
| NEG | Two's Complement Negation | Calcule l'opposé de l'opérande (négation par complément à deux) | Le résultat remplace l'opérande |
| NOP | No Operation | Ne fait rien | |
| NOT | One's Complement Negation | Effectue un NON logique (négation par complément à un) | Le résultat remplace l'opérande |
| OR | Logical Inclusive OR | Effectue un OU logique inclusif des opérandes | Le résultat remplace le premier opérande |
| OUT | Output to Port | Écrit vers un port | La source est le registre AX/AL |
| POP | Pop a Value from the Stack | Dépile vers le registre opérande | |
| POPF | Pop Flags Register from the Stack | Dépile vers le registre des drapeaux | |
| PUSH | Push a Value onto the Stack | Empile le registre opérande | |
| PUSHF | Push Flags Register onto the Stack | Empile le registre des drapeaux | |
| RCL | Rotate through Carry Left | Effectue une rotation à gauche via par le drapeau de retenue | |
| RCR | Rotate through Carry Right | Effectue une rotation à droite via par le drapeau de retenue | |
| REPcc | Repeat String Operation Prefix | Préfixe de répétition d'une opération sur une chaîne | Mnémoniques : REP, REPE, REPNE, REPNZ, REPZ |
| RET | Return from Procedure | Revient d'une procédure appelée avec décalage seul | L'adresse de retour (décalage) est sur la pile. Un opérande optionnel peut indiquer le nombre d'octets supplémentaire à dépiler. |
| RETF | Return from Far Procedure | Revient d'une procédure appelée avec segment et décalage | L'adresse de retour (segment et décalage) est sur la pile. Un opérande optionnel peut indiquer le nombre d'octets supplémentaire à dépiler. |
| ROL | Rotate Left | Effectue une rotation vers la gauche | |
| ROR | Rotate Right | Effectue une rotation vers la droite | |
| SAHF | Store AH into Flags | Copie le registre AH dans le registre des drapeaux | |
| SAL | Shift Arithmectically Left | Décalage arithmétique vers la gauche | Même instruction que SHL |
| SALC | Set AL from Carry Flag | Copie la valeur 0xFF dans le registre AL si CF vaut 1, ou 0x00 sinon | Initialement non documenté. Alias : SETALC |
| SAR | Shift Arithmectically Right | Décalage arithmétique vers la droite | À ne pas confondre avec SHR |
| SBB | Integer Subtraction with Borrow | Soustrait deux entiers, ajoute le drapeau de retenue | Le résultat remplace le premier opérande |
| SCASzz | Scan String | Compare un octet/mot d'une chaîne | La référence est le registre AL/AX. Mnémoniques : SCAS, SCASB, SCASW |
| SHL | Shift Left | Décalage logique à gauche | Même instruction que SAL |
| SHR | Shift Right | Décalage logique à droite | À ne pas confondre avec SAR |
| STC | Set Carry Flag | Met le drapeau de retenue à un | |
| STD | Set Direction Flag | Met le drapeau de direction à un | |
| STI | Set Interrupt Flag | Met le drapeau d'interruption à un | |
| STOSzz | Store in String | Copie dans un octet/mot d'une chaîne | La source est le registre AL/AX. Mnémoniques : STOS, STOSB, STOSW |
| SUB | Subtract | Soustrait deux entiers | Le résultat remplace le premier opérande |
| TEST | Logical Compare | Compare deux opérandes (de façon logique) | Positionne les drapeaux en fonction du résultat du ET logique entre les opérandes |
| WAIT | Wait | Attend tant que la broche BUSY du processeur est inactive | Utilisé avec l'unité de calcul en virgule flottante |
| XCHG | Exchange | Permute le contenu des deux opérandes | |
| XLAT | Table Look-up Translation | Translation de donnée entre des tables | Alias : XLATB |
| XOR | Logical Exclusive OR | Effectue un OU logique exclusif des opérandes | Le résultat remplace le premier opérande |

### Ajouts aux processeurs spécifiques
#### Ajouts aux processeurs 80186/80188

BOUND, ENTER, INSB, INSW, LEAVE, OUTSB, OUTSW, POPA, PUSHA, PUSHW

#### Ajouts au processeur 80286

ARPL, CLTS, LAR, LGDT, LIDT, LLDT, LMSW, LOADALL, LSL, LTR, SGDT, SIDT, SLDT, SMSW, STR, VERR, VERW

#### Ajouts au processeur 80386

BSF, BSR, BT, BTC, BTR, BTS, CDQ, CMPSD, CWDE, INSD, IRETD, IRETDF, IRETF, JECXZ, LFS, LGS, LSS, LODSD, LOOPD, LOOPED, LOOPNED, LOOPNZD, LOOPZD, MOVSD, MOVSX, MOVZX, OUTSD, POPAD, POPFD, PUSHAD, PUSHD, PUSHFD, SCASD, SETA, SETAE, SETB, SETBE, SETC, SETE, SETG, SETGE, SETL, SETLE, SETNA, SETNAE, SETNB, SETNBE, SETNC, SETNE, SETNG, SETNGE, SETNL, SETNLE, SETNO, SETNP, SETNS, SETNZ, SETO, SETP, SETPE, SETPO, SETS, SETZ, SHLD, SHRD, STOSD

#### Ajouts au processeur 80486

BSWAP, CMPXCHG, CPUID, INVD, INVLPG, RSM, WBINVD, XADD

#### Ajouts au processeur Pentium

CMPXCHG8B, RDMSR, RDPMC*, RDTSC, WRMSR
* RDPMC a été introduit avec le processeur Pentium Pro et le processeur Pentium MMX

#### Ajouts au processeur Pentium Pro

CMOVA, CMOVAE, CMOVB, CMOVB, CMOVE, CMOVG, CMOVGE, CMOVL, CMOVLE, CMOVNA, CMOVNAE, CMOVNB, CMOVNBE, CMOVNC, CMOVNE, CMOVNG, CMOVNGE, CMOVNL, CMOVNLE, CMOVNO, CMOVNP, CMOVNS, CMOVNZ, CMOVO, CMOVP, CMOVPE, CMOVPO, CMOVS, CMOVZ, SYSENTER, SYSEXIT, UD2

#### Ajouts au processeur AMD K7

* SYSCALL - Fonctionnalité spécifique au processeur AMD équivalente à l'instruction SYSENTER.
* SYSRET - Fonctionnalité spécifique au processeur AMD équivalente à l'instruction SYSEXIT.

#### Ajouts au processeur Pentium III

Fonctionnalités SSE
MASKMOVQ, MOVNTPS, MOVNTQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE (Mise en cache et ordonnancement mémoire (Memory Ordering))

#### Ajouts au processeur Pentium 4

Fonctionnalités SSE2
CLFLUSH, LFENCE, MASKMOVDQU, MFENCE, MOVNTDQ, MOVNTI, MOVNTPD, PAUSE (for Cacheability)

#### Ajouts au processeur Pentium 4 supportant les fonctionnalités SSE3

Processeur supportant l'Hyper-Threading
Fonctionnalités SSE3
MONITOR, MWAIT (Pour la synchronisation des threads)

#### Ajouts au processeur Pentium 4 6x2

VMPTRLD, VMPTRST, VMCLEAR, VMREAD, VMWRITE, VMCALL, VMLAUNCH, VMRESUME, VMXOFF, VMXON (instructions VMX)

#### Ajouts aux processeurs x86-64

CMPXCHG16B

## x87 : Instructions d'unité de calcul en virgule flottante
### Instructions du processeur x87 original

F2XM1, FABS, FADD, FADDP, FBLD, FBSTP, FCHS, FCLEX, FCOM, FCOMP, FCOMPP, FDECSTP, FDISI, FDIV, FDIVP, FDIVR, FDIVRP, FENI, FFREE, FIADD, FICOM, FICOMP, FIDIV, FIDIVR, FILD, FIMUL, FINCSTP, FINIT, FIST, FISTP, FISUB, FISUBR, FLD, FLD1, FLDCW, FLDENV, FLDENVW, FLDL2E, FLDL2T, FLDLG2, FLDLN2, FLDPI, FLDZ, FMUL, FMULP, FNCLEX, FNDISI, FNENI, FNINIT, FNOP, FNSAVE, FNSAVEW, FNSTCW, FNSTENV, FNSTENVW, FNSTSW, FPATAN, FPREM, FPTAN, FRNDINT, FRSTOR, FRSTORW, FSAVE, FSAVEW, FSCALE, FSQRT, FST, FSTCW, FSTENV, FSTENVW, FSTP, FSTSW, FSUB, FSUBP, FSUBR, FSUBRP, FTST, FWAIT, FXAM, FXCH, FXTRACT, FYL2X, FYL2XP1

### Ajouts aux processeurs spécifiques
#### Ajouts au processeur 80287

FSETPM

#### Ajouts au processeur 80387

FCOS, FLDENVD, FNSAVED, FNSTENVD, FPREM1, FRSTORD, FSAVED, FSIN, FSINCOS, FSTENVD, FUCOM, FUCOMP, FUCOMPP

#### Ajouts au processeur Pentium Pro

FCMOVB, FCMOVBE, FCMOVE, FCMOVNB, FCMOVNBE, FCMOVNE, FCMOVNU, FCMOVU, FCOMI, FCOMIP, FUCOMI, FUCOMIP, FXRSTOR, FXSAVE

#### Ajouts au processeur Pentium 4 supportant le SSE3

Fonctionnalité SSE3
FISTTP (conversion x87 vers entier)

## Instructions SIMD
### Instructions MMX

Ajouts au processeur Pentium MMX
EMMS, MOVD, MOVQ, PABSB, PABSW, PABSD, PACKSSDW, PACKSSWB, PACKUSWB, PADDB, PADDD, PADDSB, PADDSW, PADDUSB, PADDUSW, PADDW, PAND, PANDN, PCMPEQB, PCMPEQD, PCMPEQW, PCMPGTB, PCMPGTD, PCMPGTW, PMADDWD, PMULHW, PMULLW, POR, PSLLD, PSLLQ, PSLLW, PSRAD, PSRAW, PSRLD, PSRLQ, PSRLW, PSUBB, PSUBD, PSUBQ, PSUBSB, PSUBSW, PSUBUSB, PSUBUSW, PSUBW, PUNPCKHBW, PUNPCKHDQ, PUNPCKHWD, PUNPCKLBW, PUNPCKLDQ, PUNPCKLWD, PXOR

### Instructions MMX+ étendues

Ajouts au processeur 6x86MX de Cyrix ; Supportés sur les autres processeurs, i.e. Extended MMX sur Athlon 64

### Instructions 3DNow!

Ajouts au processeur K6-2
FEMMS, PAVGUSB, PF2ID, PFACC, PFADD, PFCMPEQ, PFCMPGE, PFCMPGT, PFMAX, PFMIN, PFMUL, PFRCP, PFRCPIT1, PFRCPIT2, PFRSQIT1, PFRSQRT, PFSUB, PFSUBR, PI2FD, PMULHRW, PREFETCH, PREFETCHW

### Instructions 3DNow!+

Ajout au processeur Athlon
PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD

### Instructions SSE

Ajouts au processeur Pentium III
Voir aussi les instructions sur les entiers ajoutées au processeur Pentium III

#### Instructions SSE SIMD en virgule flottante

ADDPS, ADDSS, ANDNPS, ANDPS, CMPPS, CMPSS, COMISS, CVTPI2PS, CVTPS2PI, CVTSI2SS, CVTSS2SI, CVTTPS2PI, CVTTSS2SI, DIVPS, DIVSS, LDMXCSR, MAXPS, MAXSS, MINPS, MINSS, MOVAPS, MOVHLPS, MOVHPS, MOVLHPS, MOVLPS, MOVMSKPS, MOVNTPS, MOVSS, MOVUPS, MULPS, MULSS, ORPS, RCPPS, RCPSS, RSQRTPS, RSQRTSS, SHUFPS, SQRTPS, SQRTSS, STMXCSR, SUBPS, SUBSS, UCOMISS, UNPCKHPS, UNPCKLPS, XORPS

#### Instructions SSE SIMD sur les entiers

PAVGB, PAVGW, PEXTRW, PINSRW, PMAXSW, PMAXUB, PMINSW, PMINUB, PMOVMSKB, PSADBW, PSHUFW

### Instructions SSE2

Ajouts au processeur Pentium 4
Voir aussi les instructions sur les entiers ajoutées au processeur Pentium 4

#### Instructions SSE2 SIMD en virgule flottante

ADDPD, ADDSD, ANDNPD, ANDPD, CMPPD, CMPSD*, COMISD, CVTDQ2PD, CVTDQ2PS, CVTPD2DQ, CVTPD2PI, CVTPD2PS, CVTPI2PD, CVTPS2DQ, CVTPS2PD, CVTSD2SI, CVTSD2SS, CVTSI2SD, CVTSS2SD, CVTTPD2DQ, CVTTPD2PI, CVTPS2DQ, CVTTSD2SI, DIVPD, DIVSD, MAXPD, MAXSD, MINPD, MINSD, MOVAPD, MOVHPD, MOVLPD, MOVMSKPD, MOVSD*, MOVUPD, MULPD, MULSD, ORPD, SHUFPD, SQRTPD, SQRTSD, SUBPD, SUBSD, UCOMISD, UNPCKHPD, UNPCKLPD, XORPD
* Les instructions CMPSD et MOVSD ont le même nom que les instructions portant sur les chaînes CMPSD (CMPS) et MOVSD (MOVS). Toutefois il convient de faire la différence entre les instructions portant sur les scalaires en virgule flottante à double-précision alors que les dernières se réfèrent aux instructions portant sur des double-mots de chaînes de caractères (instructions portant sur des entiers).

#### Instructions SSE2 SIMD sur les entiers

MOVDQ2Q, MOVDQA, MOVDQU, MOVQ2DQ, PADDQ, PMULUDQ, PSHUFHW, PSHUFLW, PSHUFD, PSLLDQ, PSRLDQ, PUNPCKHQDQ, PUNPCKLQDQ

### Instructions SSE3

Ajouts au processeur Pentium 4 supportant le SSE3
Voir aussi les instructions portant sur les entiers et les virgules flottantes ajoutées au processeurs Pentium 4 avec support SSE3

#### Instructions SSE3 SIMD en virgule flottante

* ADDSUBPD, ADDSUBPS (Arithmétique sur les nombres complexes)
* HADDPD, HADDPS, HSUBPD, HSUBPS (Pour les graphismes)

#### Instructions SSE3 SIMD portant sur les entiers

* MOVDDUP, MOVSHDUP, MOVSLDUP (Arithmétique sur les nombres complexes)
* LDDQU (Pour l'encodage vidéo)

### Instructions SSSE3

Ajouts au processeur Core 2
* PSIGNW, PSIGND, PSIGNB
* PSHUFB
* PMULHRSW, PMADDUBSW
* PHSUBW, PHSUBSW, PHSUBD
* PHADDW, PHADDSW, PHADDD
* PALIGNR
* PABSW, PABSD, PABSB

### Instructions SSE4

Ajouts aux architectures Intel Penryn et Nehalem
* PMULLD, PMULDQ
* DPPS, DPPD
* BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW
* PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINSD, PMAXSD
* ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD
* INSERTPS, PINSRB, PINSRD, PINSRQ, EXTRACTPS, PEXTRB, PEXTRD, PEXTRW, PEXTRQ
* PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, *PMOVSXDQ, PMOVZXDQ
* PTEST
* PCMPEQQ, PCMPGTQ
* PACKUSDW
* PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM
* CRC32
* POPCNT

#### Ajouts aux architectures Intel Penryn

* 47 instructions SSE4

#### Ajouts aux architectures Intel Nehalem

* 3 instructions SSE4

#### Ajouts aux architectures Intel Westmere

* des instructions pour AES

#### Ajouts aux architectures Intel Sandy Bridge

* instruction Advanced Vector Extensions