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'instruction 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 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 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 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 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 virgules flottantes à 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
Ajouts aux architectures Intel Sandy Bridge
- instruction Advanced Vector Extensions
Voir aussi
Articles connexes
Liens externes
- (en) Documentation gratuite sur l'architecture IA-32 d'Intel, documentation officielle d'Intel, contient toutes les instructions et diverses documentations.
- (en) Référence NASM sur le jeu d'instruction x86