Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Le langage assembleur
  3. Jeux d'instructions
Extrait - Le langage assembleur Maîtrisez le code des processeurs de la famille X86
Extraits du livre
Le langage assembleur Maîtrisez le code des processeurs de la famille X86 Revenir à la page d'achat du livre

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

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 Division
aad
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 Subtraction
aas 

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 Multiplication
aam
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 Addition
daa 

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