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.

Pour un article plus général, voir Jeu d'instructions.

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

NomSensTraductionNotes
AAAASCII Adjust AL after AdditionAjuste le registre AL après addition (mode ASCII)Utilisé avec le codage BCD non compacté
AADASCII Adjust AX after DivisionAjuste 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
AAMASCII Adjust AX after MultiplicationAjuste le registre AX après multiplication (mode ASCII)Utilisé avec le codage BCD non compacté
AASASCII Adjust AL after SubtractionAjuste le registre AL après soustraction (mode ASCII)Utilisé avec le codage BCD non compacté
ADCAdd with CarryAjoute deux entiers, plus le drapeau de retenueLe résultat remplace le premier opérande
ADDAddAjoute deux entiersLe résultat remplace le premier opérande
ANDLogical ANDEffectue un ET logique des opérandesLe résultat remplace le premier opérande
CALLCall ProcedureAppelle une procédure
CBWConvert Byte to WordConvertit un octet en motLe registre AL est étendu à AX
CLCClear Carry FlagMet le drapeau de retenue à zéro
CLDClear Direction FlagMet le drapeau de direction à zéro
CLIClear Interrupt FlagMet le drapeau d'interruption à zéro
CMCComplement Carry FlagInverse le drapeau de retenue
CMPCompareCompare deux entiers (de façon arithmétique)Positionne les drapeaux en fonction de la différence entre les opérandes
CMPSzzCompare StringsCompare un octet/mot de deux chaînesMnémoniques : CMPS, CMPSB, CMPSW
CWDConvert Word to DoublewordConvertit un mot en double motLe registre AX est étendu à DX:AX
DAADecimal Adjust AL after AdditionAjuste le registre AL après addition (mode décimal)Utilisé avec le codage BCD compacté
DASDecimal Adjust AL after SubtractionAjuste le registre AL après soustraction (mode décimal)Utilisé avec le codage BCD compacté
DECDecrement by 1Décrémente un entierÔte un de l'opérande
DIVUnsigned DivideDivise 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
ESCEscapeUtilisé avec l'unité de calcul en virgule flottante
HLTHaltEntre en état d'arrêt jusqu'à réception d'une interruptionPermet de réduire la consommation de puissance du processeur. Alias : HALT
IDIVSigned DivideDivise 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
IMULSigned MultiplyMultiplie par un entier signéLe facteur est le registre AL/AX et le produit est écrit dans AX/DX:AX
INInput from PortLit depuis un portLa destination est le registre AL/AX
INCIncrement by 1Incrémente un entierAjoute un à l'opérande
INTCall to Interrupt ProcedureAppelle l'interruption identifiée par l'opérande
INTOCall to Interrupt Procedure if OverflowAppelle l'interruption de débordement si le drapeau de débordement est à un
IRETInterrupt ReturnRevient d'une interruption
JccJump if Condition Is MetSaute si une condition est vérifiéeMné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
JMPJumpSaute (inconditionnel)
LAHFLoad Flags into AHCopie le registre des drapeaux dans le registre AH
LDSLoad DS with Far PointerCharge un pointeur de type far (lointain) dans le registre DS (segment) et l'opérande (décalage)
LEALoad Effective AddressCharge l'adresse du second opérande dans le premier
LESLoad ES with Far PointerCharge un pointeur de type far (lointain) dans le registre ES (segment) et l'opérande (décalage)
LOCKAssert LOCK# Signal PrefixPréfixe verrouillant les bus pour les prochaines instructionsUtilisé pour les plates-formes multiprocesseurs.
LODSzzLoad StringCopie un octet/mot d'une chaîneLa destination est le registre AL/AX. Mnémoniques : LODS, LODSB, LODSW
LOOPccLoop According to CounterDécrémente le compteur et saute si une condition est vérifiéeLe compteur est le registre CX. Mnémoniques : LOOP, LOOPE, LOOPNE, LOOPNZ, LOOPZ
MOVMoveCopie le second opérande dans le premier
MOVSzzMove from String to StringCopie un octet/mot d'une chaîne vers une autreMnémoniques : MOVS, MOVSB, MOVSW
MULUnsigned MultiplyMultiplie par un entier non signéLe facteur est le registre AL/AX et le produit est écrit dans AX/DX:AX
NEGTwo's Complement NegationCalcule l'opposé de l'opérande (négation par complément à deux)Le résultat remplace l'opérande
NOPNo OperationNe fait rien
NOTOne's Complement NegationEffectue un NON logique (négation par complément à un)Le résultat remplace l'opérande
ORLogical Inclusive OREffectue un OU logique inclusif des opérandesLe résultat remplace le premier opérande
OUTOutput to PortÉcrit vers un portLa source est le registre AX/AL
POPPop a Value from the StackDépile vers le registre opérande
POPFPop Flags Register from the StackDépile vers le registre des drapeaux
PUSHPush a Value onto the StackEmpile le registre opérande
PUSHFPush Flags Register onto the StackEmpile le registre des drapeaux
RCLRotate through Carry LeftEffectue une rotation à gauche via par le drapeau de retenue
RCRRotate through Carry RightEffectue une rotation à droite via par le drapeau de retenue
REPccRepeat String Operation PrefixPréfixe de répétition d'une opération sur une chaîneMnémoniques : REP, REPE, REPNE, REPNZ, REPZ
RETReturn from ProcedureRevient d'une procédure appelée avec décalage seulL'adresse de retour (décalage) est sur la pile. Un opérande optionnel peut indiquer le nombre d'octets supplémentaire à dépiler.
RETFReturn from Far ProcedureRevient d'une procédure appelée avec segment et décalageL'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.
ROLRotate LeftEffectue une rotation vers la gauche
RORRotate RightEffectue une rotation vers la droite
SAHFStore AH into FlagsCopie le registre AH dans le registre des drapeaux
SALShift Arithmectically LeftDécalage arithmétique vers la gaucheMême instruction que SHL
SALCSet AL from Carry FlagCopie la valeur 0xFF dans le registre AL si CF vaut 1, ou 0x00 sinonInitialement non documenté. Alias : SETALC
SARShift Arithmectically RightDécalage arithmétique vers la droiteÀ ne pas confondre avec SHR
SBBInteger Subtraction with BorrowSoustrait deux entiers, ajoute le drapeau de retenueLe résultat remplace le premier opérande
SCASzzScan StringCompare un octet/mot d'une chaîneLa référence est le registre AL/AX. Mnémoniques : SCAS, SCASB, SCASW
SHLShift LeftDécalage logique à gaucheMême instruction que SAL
SHRShift RightDécalage logique à droiteÀ ne pas confondre avec SAR
STCSet Carry FlagMet le drapeau de retenue à un
STDSet Direction FlagMet le drapeau de direction à un
STISet Interrupt FlagMet le drapeau d'interruption à un
STOSzzStore in StringCopie dans un octet/mot d'une chaîneLa source est le registre AL/AX. Mnémoniques : STOS, STOSB, STOSW
SUBSubtractSoustrait deux entiersLe résultat remplace le premier opérande
TESTLogical CompareCompare deux opérandes (de façon logique)Positionne les drapeaux en fonction du résultat du ET logique entre les opérandes
WAITWaitAttend tant que la broche BUSY du processeur est inactiveUtilisé avec l'unité de calcul en virgule flottante
XCHGExchangePermute le contenu des deux opérandes
XLATTable Look-up TranslationTranslation de donnée entre des tablesAlias : XLATB
XORLogical Exclusive OREffectue un OU logique exclusif des opérandesLe 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 80486

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

Ajouts au processeur Pentium

CMPXCHG8B, RDMSR, RDPMC*, RDTSC, WRMSR

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 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 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

Voir aussi

Articles connexes

Liens externes

  • Portail de l’informatique
Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.