III. LES PRINCIPALES INSTRUCTIONS DU LANGAGE MACHINE
Remarques préliminaires :
-
Le principe du langage assembleur est de remplacer chaque opcode
hexadécimal par un mot facile à retenir. Ce mot est
appelé mnémonique.
Par exemple, “INT” est le mnémonique associé
à l’opcode CDh. Chaque fois que le compilateur
rencontrera ce mot, il le remplacera par l’octet CDh et écrira
ensuite l’opérande (ici : le numéro de
l’interruption) en hexadécimal.
-
Certaines instructions, comme PUSHA, ne sont disponibles que pour des modèles
de processeurs plus évolués que le 8086, par exemple
le 286. N’oubliez pas la directive .386 si vous les utilisez.
1. L’instruction NOP (« No Operation »)
Syntaxe :
NOP
Description :
Ne fait rien ! Mais alors RIEN ! Que dalle ! Niet !
2. L’instruction MOV (« Move »)
Syntaxe :
MOV Destination, Source
Description :
Copie le contenu de Source dans Destination.
Mouvements autorisés :
MOV Registre général, Registre quelconque
MOV Mémoire, Registre quelconque
MOV Registre général, Mémoire
MOV Registre général, Constante
MOV Mémoire, Constante
MOV Registre de segment, Registre général
Remarques :
Source et Destination doivent
avoir la même taille. On ne peut charger dans un
registre de segment que le contenu d’un registre général
(SI, DI et BP sont considérés ici comme des registres
généraux).
Exemples :
MOV AX, 5
MOV ES, DX
MOV AL, [Variable1] ;Copie un octet car
AL contient 8 bits
MOV [Variable2], DS ;Copie un word car DS
contient 16 bits
MOV word ptr [Variable3], 12 ;Ici,
on spécifie que la variable est un word
3. L’instruction XCHG (« Exchange »)
Syntaxe :
XCHG Destination, Source
Description :
Echange les contenus de Source et de Destination.
Mouvements autorisés : XCHG Registre général,
Registre général
XCHG Registre général, Mémoire
XCHG Mémoire, Registre général
4. L’instruction JMP (« Jump »)
Syntaxe :
JMP MonLabel
Description :
Saute à l’instruction pointée par MonLabel.
5. L’opérateur CMP (« Compare »)
Syntaxe :
CMP Destination, Source
Description :
Cet opérateur sert à comparer deux nombres :
Source et Destination. C'est
le registre des indicateurs qui contient les résultats de la
comparaison. Ni Source ni Destination ne
sont modifiés.
Indicateurs affectés :
AF, CF, OF, PF, SF, ZF
Remarque :
Cet opérateur effectue en fait une soustraction mais
contrairement à SUB, le résultat n’est pas
sauvegardé.
Le programme doit pouvoir réagir en fonction des résultats
de la comparaison. Pour cela, on utilise les sauts conditionnels
(voir ci-dessous).
6. Les instructions de saut conditionnel
Les sauts conditionnels sont terriblement importants car ils permettent
au programme de faire des choix en fonction des données.
Un saut conditionnel n’est effectué qu’à
certaines conditions portant sur les flags (par exemple : CF = 1
ou ZF = 0).
Certains mnémoniques de sauts conditionnels sont totalement
équivalents, c’est-à-dire qu’ils
représentent le même opcode hexadécimal. C’est
pour aider le programmeur qu’ils existent parfois sous
plusieurs formes.
a) les sauts de comparaison
Exemple :
Mnémonique équivalent : JZ (« Jump if
Zero »)
Exemple :
Mnémonique équivalent : JNLE
(« Jump if Not Less Or Equal »)
Mnémonique équivalent : JNL (« Jump if Not
Less »)
Mnémonique équivalent : JNGE
(« Jump if Not Greater Or Equal »)
Mnémonique équivalent : JNG (« Jump if Not
Greater »)
Mnémonique équivalent : JNBE
(« Jump if Not Below Or Equal »)
Mnémonique équivalent : JNB (« Jump if Not
Below »)
Mnémonique équivalent : JNAE (« Jump if Not
Above Or Equal »)
Mnémonique équivalent : JNA
(« Jump if Not Above »)
b) les sauts de test sur les flags
Ces instructions testent un flag unique et exécutent ou non le
saut selon la valeur de ce flag.
Remarques :
Ce mnémonique correspond au même opcode que JB. Il est
souvent employé pour vérifier que l’appel d’une
interruption n’a pas déclenché d’erreur.
Exemple :
Si l’appel de la fonction 3Eh de l’interruption 21H se solde
par une erreur, alors la CF vaudra 1 et le saut sera accompli. Dans
le cas opposé, l’exécution continuera normalement
de manière linéaire.
c) le saut de test sur le registre CX
JCXZ (« Jump if CX = Zero »)
fait un saut au label spécifié si et seulement si CX = 0.
Sommaire
Suite
|