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
modifierCeci 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
modifierNom | 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
modifierBOUND, ENTER, INSB, INSW, LEAVE, OUTSB, OUTSW, POPA, PUSHA, PUSHW
ARPL, CLTS, LAR, LGDT, LIDT, LLDT, LMSW, LOADALL, LSL, LTR, SGDT, SIDT, SLDT, SMSW, STR, VERR, VERW
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
BSWAP, CMPXCHG, CPUID, INVD, INVLPG, RSM, WBINVD, XADD
CMPXCHG8B, RDMSR, RDPMC*, RDTSC, WRMSR
- RDPMC a été introduit avec le processeur Pentium Pro et le processeur Pentium MMX
Ajouts au processeur Pentium Pro
modifierCMOVA, 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
- 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
modifierFonctionnalités SSE
MASKMOVQ, MOVNTPS, MOVNTQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE (Mise en cache et ordonnancement mémoire (Memory Ordering))
Fonctionnalités SSE2
CLFLUSH, LFENCE, MASKMOVDQU, MFENCE, MOVNTDQ, MOVNTI, MOVNTPD, PAUSE (for Cacheability)
Processeur supportant l'Hyper-Threading
Fonctionnalités SSE3
MONITOR, MWAIT (Pour la synchronisation des threads)
Ajouts au processeur Pentium 4 6x2
modifierVMPTRLD, VMPTRST, VMCLEAR, VMREAD, VMWRITE, VMCALL, VMLAUNCH, VMRESUME, VMXOFF, VMXON (instructions VMX)
CMPXCHG16B
Instructions du processeur x87 original
modifierF2XM1, 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
modifierAjouts au processeur 80287
modifierFSETPM
Ajouts au processeur 80387
modifierFCOS, FLDENVD, FNSAVED, FNSTENVD, FPREM1, FRSTORD, FSAVED, FSIN, FSINCOS, FSTENVD, FUCOM, FUCOMP, FUCOMPP
Ajouts au processeur Pentium Pro
modifierFCMOVB, FCMOVBE, FCMOVE, FCMOVNB, FCMOVNBE, FCMOVNE, FCMOVNU, FCMOVU, FCOMI, FCOMIP, FUCOMI, FUCOMIP, FXRSTOR, FXSAVE
Ajouts au processeur Pentium 4 supportant le SSE3
modifierFonctionnalité SSE3
FISTTP (conversion x87 vers entier)
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
modifierAjouts au processeur 6x86MX de Cyrix ; Supportés sur les autres processeurs, i.e. Extended MMX sur Athlon 64
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!+
modifierAjout au processeur Athlon
PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
Ajouts au processeur Pentium III
Voir aussi les instructions sur les entiers ajoutées au processeur Pentium III
Instructions SSE SIMD en virgule flottante
modifierADDPS, 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
modifierPAVGB, PAVGW, PEXTRW, PINSRW, PMAXSW, PMAXUB, PMINSW, PMINUB, PMOVMSKB, PSADBW, PSHUFW
Ajouts au processeur Pentium 4
Voir aussi les instructions sur les entiers ajoutées au processeur Pentium 4
Instructions SSE2 SIMD en virgule flottante
modifierADDPD, 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
modifierMOVDQ2Q, MOVDQA, MOVDQU, MOVQ2DQ, PADDQ, PMULUDQ, PSHUFHW, PSHUFLW, PSHUFD, PSLLDQ, PSRLDQ, PUNPCKHQDQ, PUNPCKLQDQ
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
modifier- ADDSUBPD, ADDSUBPS (Arithmétique sur les nombres complexes)
- HADDPD, HADDPS, HSUBPD, HSUBPS (Pour les graphismes)
Instructions SSE3 SIMD portant sur les entiers
modifier- MOVDDUP, MOVSHDUP, MOVSLDUP (Arithmétique sur les nombres complexes)
- LDDQU (Pour l'encodage vidéo)
Ajouts au processeur Core 2
- PSIGNW, PSIGND, PSIGNB
- PSHUFB
- PMULHRSW, PMADDUBSW
- PHSUBW, PHSUBSW, PHSUBD
- PHADDW, PHADDSW, PHADDD
- PALIGNR
- PABSW, PABSD, PABSB
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
- 47 instructions SSE4
- 3 instructions SSE4
Ajouts aux architectures Intel Sandy Bridge
modifier- instruction Advanced Vector Extensions
Voir aussi
modifierArticles connexes
modifierLiens externes
modifier- (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