Jeux d'instructions
Historique
Les processeurs de la famille x86 ne sont pas tous identiques, du point de vue des composants et capacités, mais ils diffèrent aussi au niveau de leur vocabulaire.
Les premiers x86 ne comprennent pas les instructions plus récentes, et ce dès l’apparition du 80186.
Des évolutions ont rendu le 8086 obsolète car il ne comprend pas les instructions qui sont compilées pour les modèles suivants.
Voici les processeurs x86 fabriqués par Intel :
Modèle |
Année de sortie |
Espace d’adressage |
Jeux d’instructions, amélioration majeure |
8086 |
1978 |
16 bits |
Général 16 bits |
80186 |
1982 |
16 bits |
|
80286 |
1982 |
24 bits |
Mode protégé 16 bits |
80386 |
1985 |
32 bits |
Jeux 32 bits |
80486 |
1989 |
||
Pentium, PMMX |
1993 |
FPU integrée, MMX,CPUID |
|
Pentium Pro |
1995 |
36 bits |
Physical Adress Extension |
Pentium II |
1996 |
SSE |
|
Pentium III |
1996 |
||
Pentium IV |
2000 |
SSE2 |
|
Pentium M |
2003 |
Économie d’énergie |
|
P4 Prescott |
2004 |
40 bits |
SSE3 |
Core 2 |
2006 |
SSE4 |
|
Atom |
2008 |
64 bits |
Très faible consommation d’énergie |
Core i7 |
2008 |
Réorganisation des instructions |
|
Sandy Bridge |
2010 |
SSE5, AVX |
Les processeurs des autres fabricants, VIA, AMD, CIRIX sont en règle générale des copies des processeurs Intel.
AMD a cependant créé ses propres jeux d’instructions, et a aidé à l’introduction du 64 bits avec le processeur Athlon...
Base 16 bits
Les instructions supportées par le 8086 sont toutes en mode 16 bits. En effet, les registres 32 bits et le mode protégé n’existent pas.
-
Seules les parties 16 bits et 8 bits des registres généraux sont utilisables avec les instructions 16 bits.
Accumulateur : AX, AH, AL
Base : BX, BH, BL
Compteur : CX, CH, CL
Donnée auxiliaire : DX, DH, DL
-
Les registres d’index et de pointeurs ne font que 16 bits.
Source : SI
Destination : DI
Stack (pile) : SP
Base (pile) : BP
Instructions : IP
-
Le registre de drapeau mesure 16 bits, certains drapeaux sont encore inutilisés.
Registre de drapeau du 8086 : Flg
Bit |
Description |
0 |
CF Carry Flag |
1 |
Positionné à 1 |
2 |
PF Parity Flag |
3 |
Positionné à 0 |
4 |
AF Auxiliary Flag |
5 |
Positionné à 0 |
6 |
ZF Zero Flag |
7 |
SF Sign Flag |
8 |
TF Trap Flag (Single Step) |
9 |
IF Interrupt Flag |
10 |
DF Direction Flag |
11 |
OF Overflow flag |
12 |
X indéterminé |
13 |
X indéterminé |
14 |
X indéterminé |
15 |
Positionné à 0 |
Les codes de conditions (condition code, CC) associés sont présents sur tous les CPU x86, ils utilisent uniquement les drapeaux de base.
Voici un rappel de la liste des codes de conditions (déjà présentés dans le chapitre Processeur x86) par ordre alphabétique.
Logique et arithmétique non signée
CC |
Signification anglaise |
Drapeaux associés |
Signification française |
A |
if Above |
CF=0 and ZF=0 |
Si plus grand |
AE |
if Above or Equal |
CF=0 |
Si plus grand ou égal |
B |
if Below |
CF=1 |
Si plus petit |
BE |
if Below or Equal |
CF=1 or ZF=1 |
Si plus petit ou égal |
C |
if Carry |
CF=1 |
Si retenue |
E |
if Equal |
ZF=1 |
Si égal à 0 |
NE |
if Not Equal |
CF=1 or ZF=1 |
Si pas égal |
NA |
if Not Above |
CF=1 or ZF=1 |
Si pas plus grand |
NAE |
if Not Above or Equal |
CF=1 |
Si pas plus grand ni égal |
NB |
if Not Below |
CF=0 |
Si pas plus petit |
NBE |
if Not Below or Equal |
CF=0 and ZF=0 |
Si pas plus petit ni égal |
NC |
if Not Carry |
CF=0 |
Si pas de retenue |
NE |
if Not Equal |
ZF=0 |
Si pas égal à 0 |
NO |
if Not Overflow |
OF=0 |
Si pas de dépassement |
NP |
if Not Parity |
PF=0 |
Si pas de parité |
NZ |
if Not Zero |
ZF=0 |
Si pas égal à 0 |
O |
if Overflow |
OF=1 |
Si dépassement |
P |
if Parity |
PF=1 |
Si parité |
PE |
if Parity Even |
PF=1 |
Si parité paire |
PO |
if Parity Odd |
PF=0 |
Si parité impaire |
Z |
if Zero |
ZF=1 |
Si égal à 0 |
Arithmétique...
Jeux d’instructions généraux
1. Jeux d’instructions 32 bits en 2011
Les instructions disponibles sur les derniers processeurs 32 bits en 2011 sont listées dans ce chapitre. Les instructions spécifiques au 64 bits sont listées dans une sous-partie séparée, car ce ne sont que des nuances des instructions 32 bits.
a. Instructions décimales
Ces instructions sont toutes des opérations sur des grandeurs 8 bits.
AAA : ASCII Adjust After Additionaaa
Suite à une addition (ADD) de deux nombres décimaux non empaquetés, le résultat est ajusté de sorte que lorsque le drapeau auxiliaire est à 1, la valeur 6 est ajoutée à AL, et AH est incrémenté de 1.
AAD ASCII : Adjust AX Before Divisionaad
aad imm8
Multiplier le registre AH par 10, additionner AL, résultat dans AL, mettre AH à 0.
Opération à effectuer avant une division (DIV) sur le registre AX, AL et AH compris entre 0 et 10.
Le mnémonique AAD correspond à l’utilisation de l’opcode D5h suivi d’un octet égal à 10 (0Ah) indiquant un ajustement pour la base 10.
D’autres valeurs de cet octet sont possibles en écrivant AAD suivi d’une valeur immédiate 8 bits.
AAS : ASCII Adjust AL After Subtractionaas
Cette opération doit être effectuée suite à une soustraction (SUB) de deux nombres décimaux non empaquetés.
Si le drapeau AF est égal à un et que le registre AL est supérieur à 10, on soustrait 6 au registre AL, AH est décrémenté de 1, et le nibble de poids fort de AL est mis à 0.
AAM : ASCII Adjust AX After Multiplicationaam
aam imm8
Diviser le registre AL par 10, résultat dans AH, modulo dans AL.
Convertir l’octet AL compris entre 0 et 99 en BCD non empaqueté dans AH et AL.
Cette opération doit avoir lieu suite à une multiplication (MUL) de deux nombres décimaux non empaquetés.
Possibilité de changer le diviseur par imm8.
DAA : Decimal Adjust AL after Additiondaa
Ajuster le registre AL pour qu’il contienne deux chiffres BCD valides après une addition (ADD).
Si AL(LSN) > 9 ou AF = 1, alors additionner 6 à AL.
Si AL(MSN) > 9 ou CF=1, alors additionner 60h à AL.
Si le total donne un nombre supérieur à...
Les instructions 32 bits en pratique
1. Mov et les affectations
L’instruction MOV (MOVe, déplacer) est l’équivalent direct de l’affectation dans un langage de haut niveau (=).
À ne pas confondre avec l’initialisation des valeurs qui peuvent être directement définies par les directives de définition de données db, dw, dd, dq, etc.
L’exécution d’une instruction MOV implique l’utilisation d’au moins un registre général, l’autre opérande pouvant être un registre général, une case mémoire ou un registre système.
Là où cela se complique, c’est lors de l’utilisation de l’arithmétique de calcul des adresses, ce qui fait correspondre une simple instruction à une suite de calculs de haut niveau.
mov eax,[ebx*4+ecx+567]
Charge dans le registre EAX la donnée pointée par le résultat de la formule ebx*4+ecx+567.
Un équivalent de MOV est l’instruction LEA (Load Effective Adress, charger l’adresse effective), mais qui reste limitée au calcul et à l’affectation directe de données sans passer par la lecture d’une valeur en mémoire.
mov eax,[ebx*4+edx]
Charge la valeur pointée par l’expression ebx*4+edx dans le registre EAX, tandis que :
lea eax,[ebx*4+edx]
Charge le résultat de la formule entre crochets dans le registre EAX, soit la somme du registre EBX multipliée par 4 et du registre EDX.
L’instruction LEA permet de faire des multiplications par 3, 5 et 9 d’un registre, en une seule fois, et sans passer par les instructions MUL ou IMUL, qui sont très lentes.
lea eax,[eax*2+eax] ;eax=eax*3
leax eax,[eax*4+eax] ;eax=eax*5
leax eax,[eax*8+eax] ;eax=eax*9
Une autre instruction s’apparente au MOV, il s’agit de XCHG (exchange, échanger) qui sert tout simplement à échanger les contenus de deux opérandes.
XLAT (XLATB) aussi sert à l’affectation, mais correspond à l’utilisation d’une table de translation de code, ou LUT (Look Up Table). Cette instruction retourne l’octet pointé par (e)bx + al dans le registre AL. C’est une simple instruction faisant correspondre un tableau de valeurs 8 bits à une valeur d’entrée, elle aussi sur 8 bits.
Cette...