Le Jeu D'instructions Du 8086 8088
Le Jeu D'instructions Du 8086 8088
Le Jeu D'instructions Du 8086 8088
I ) introduction :
On peut diviser les instructions du 8086/88 en 6 groupes comme suit :
II-1-1 ) MOV :
Elle permet de transférer les données (un octet ou un mot) d'un registre à un autre
registre ou d'un registre à une case mémoire, sa syntaxe est comme suit :
Exemples :
On n'a pas le droit aussi de transférer un registre segment vers un autre registre
segment sans passer par un autre registre :
MOV DS, ES
MOV AX, ES
MOV DS, DS
II-1-2 ) PUSH :
Exemple :
II-1-3 ) POP :
Exemple :
II-1-4 ) PUSHA :
Cette instruction permet d'empiler la totalité des registres internes du microprocesseur sur
la pile.
II-1-5 ) POPA :
II-1-6 ) XCHG :
Cette instruction est utilisée pour convertir des données d'un code à un autre, en effet elle
permet de placer dans l'accumulateur AL le contenu de la case mémoire adressée en adressage
base+décalage (8 bits), la base étant le registre BX et le décalage étant AL lui même dans le
segment DS
Exemple :
Tab db ‘0123456789ABCDEF'
MOV AL,1110B ; chargement de la valeur à convertir (07) MOV BX,
OFFSET TAB
; pointé sur le tableau
XLAT ; Al est chargé par le code ASCII de ‘E'
II-2-1 ) IN ) OUT:
Elle permet de récupérer des données d'un port (donc de la périphérie) ou restituer des
données à un port, dans les deux cas s'il s'agit d'envoyer ou de recevoir un octet on utilise
l'accumulateur AL, s'il s'agit d'envoyer ou de recevoir un mot on utilise l'accumulateur AX.
Syntaxe :
IN ACCUMULATEUR, DX
OUT DX, ACCUMULATEUR
Remarque :
Elle transfert l'adresse offset (décalage) d'une opérande mémoire dans un registre de 16 bits
(pointeur ou index). Cette commande a le même rôle que l'instruction MOV avec offset mais
elle est plus puissante car on peut utiliser avec elle toute technique d'adressage.
Exemple :
Exemple :
Au lieu de faire :
Remarque :
LAHF : Load AH from Flags : place l'octet de poids faible du registre d'état (FLAGS) dans le
registre AH comme suit :
SAHF : Store AH into Flags : Place le contenu de AH dans l'octet de poids faible du registre
d'état (FLAGS).
Elle permet d'additionner le contenu de la source (octet ou un mot) avec celui de la destination
le résultat est mis dans la destination
Exemples :
Remarques :
Ici on a presque les mêmes restrictions de l'instruction MOV c.a.d on n'a pas le
droit d'additionner deux cases mémoires sans utiliser un registre de données.
Exemples :
MOV AX , Tab2
ADD Tab1 , AX
Elle permet d'additionner le contenu de la source (octet ou un mot) avec celui de la destination
et la retenue (CF) le résultat est mis dans la destination
Exemples :
Remarque :
Exemples :
INC AX ; AX = AX + 1 (incrémentation sur 16 bits).
INC AL ; AL = AL +1 (incrémentation sur 8 bits).
INC [SI] ; [SI] = [SI] + 1 le contenu de la case mémoire pointé par SI
sera incrémenter
Remarque :
L'addition de deux nombres BCD génére parfois un résultat qui n'est pas un nombre en BCD
d'ou il faut faire des corrections sur ces nombres pour avoir un résultat cohérent. Cette
instruction examine le quarte bas de AL et vérifie s'il est conforme ou non :
- Si non :
Elle ajoute 6 à AL
Ajoute 1 à AH
Efface le quarter haut de AL
Met AF et CF à 1 (pour information)
III-2 ) Soustraction :
Elle permet de soustraire la destination de la source (octet ou un mot) le résultat est mis dans
la destination
Exemples :
Remarques :
Exemples :
Remarques :
Exemples :
Remarque :
Elle soustrait l'opérande destination (octet ou mot) de 0 le résultat est stocker dans la
destination, donc avec cette opération on réalise le complément à deux d'un nombre
Exemples :
NEC AX ; AX = 0 - AX
NEC AL ; AL = 0 - AL
NEC [SI] ; [SI] = 0 - [SI]
Remarque :
Les indicateurs affectés par cette opération sont : AF, CF, OF, PF, SF, ZF
Elle soustrait la source de la destination , qui peut être un octet ou un mot , le résultat n'est pas
mis dans la destination , en effet cette instruction
touche uniquement les indicateurs pour être tester avec une autre instruction ultérieure
de saut conditionnel
Les indicateurs susceptibles d'être touché sont : AF, CF, OF, PF, SF, ZF
Donc cette instruction va nous permettre de comparer deux nombres comme le montre le
tableau suivant :
III-2-6 ) AAS ) DAS: ( ASCII ) DECIMAL Adjust for Substraction )
Elle est identique à l'instruction AAA/DAA mais l'ajustement se fait en BCD pour la
soustraction.
III-3 ) La multiplication :
MUL effectue une multiplication non signée de l ‘ opérande source avec l'accumulateur
:
-Si la source est un octet alors elle sera multipliée par l'accumulateur AL le
résultat sur 16 bits sera stocké dans le registre AX.
Si la source est un mot alors elle sera multipliée avec l'accumulateur AX
le résultat de 32 bits sera stocké dans la paire des registres AX et DX
Remarque :
Cette multiplication traite les données en tant que nombres non signés
Donc on aura :
En conclusion :
III-3-2 ) IMUL : (Multiplication pour les nombres signés)
Remarque :
Comme AAA et AAS cette instruction va nous permettre de corriger le résultat d'une
multiplication de deux nombres en BCD, pour corriger le résultat de l'instruction AAM divise
AL par 10.
Exemple :
MOV AL , 6
MOV DL , 8
MUL DL
AAM
III-4 ) La division :
Elle effectue une division non signée de l'accumulateur par l'opérande source :
Exemples :
A/
MOV AH,00h
MOV AL,33H
MOV DL,25H
DIV DL ; Cela implique que AH= et AL =
B/
MOV AX,500H
MOV CX,200H
DIV CX ;Cela implique que AX= et AL =
Exemples:
A/
MOV AH,00h
MOV AL,-33H
MOV DL,25H
IDIV DL ; Cela implique que AH= et AL =
B/
MOV AX,-500H
MOV CX,200H
IDIV CX ; Cela implique que AX= et AL =
Remarque :
Remarque :
Exemple :
Remarque :
Exemple :
Exemple :
Exemples :
Exemples :
Exemples :
IV-1-5 ) TEST :
Elle permet de faire un ET logique entre la destination et la source (octet ou un mot) mais la
destination ne sera pas touchée en effet cette instruction ne touche que les indicateurs.
Exemples :
Elle va effectuer un ET logique entre le premier nombre et le second sans toucher les deux
mais elle va affecter uniquement les indicateurs (Flags)
ROR AX,1
ROL AL,1
ROR AL,1
ROR AL,1
ROR AL,1
ROR AL,1
Ou encore :
MOV CL,4
ROR AL,CL
Remarque :
Les instructions de rotations et de décalages logiques ne tiennent pas compte du bit de signe
donc elles travaillent avec les nombres non signés.
Remarque :
Ces instructions n'affectent pas les Flags. Dans cette catégorie on trouve toutes les instructions
de branchement, de boucle et d'interruption après un branchement, le tableau suivant donne
ces instructions :
V-1 ) Branchement inconditionnel
Une procédure est une suite d'instructions effectuant une action précise, qui sont regroupées
par commodité et pour éviter d'avoir à les écrire à plusieurs reprises dans le programme.
Les procédures sont repérées par l'adresse de leur première instruction, à laquelle on associe
une étiquette en assembleur.
L'exécution d'une procédure est déclenchée par un programme appelant. Une procédure peut
elle-même appeler une autre procédure, et ainsi de suite.
CALL adresse_debut_procedure
L'adresse est sur 16 bits, la procédure est donc dans le même segment
d'instructions. CALL est une nouvelle instruction de branchement inconditionnel. La
fin d'une procédure est marquée par l'instruction RET :
V-1-2 ) RET :
RET ne prend pas d'argument ; le processeur passe à l'instruction placée immédiatement après
le CALL.
RET est aussi une instruction de branchement : le registre IP est modifié pour revenir à la
valeur qu'il avait avant l'appel par CALL. Comment le processeur retrouve-t-il cette valeur ?
Le problème est compliqué par le fait que l'on peut avoir un nombre quelconque d'appels
imbriqués, comme sur la figure suivante :
L'adresse de retour, utilisée par RET, est en fait sauvegardée sur la pile par l'instruction
CALL. Lorsque le processeur exécute l'instruction RET, il dépile l'adresse sur la pile (comme
POP), et la range dans IP.
Et l'instruction RET :
Remarque 1 :
Si la procédure appartient au même segment que le programme principal elle est dite de
type NEAR sinon elle est dite de type FAR, la différence entre eux c'est que dans le premier
cas le processeur doit empiler une seule valeur dans la pile c'est le registre IP mais dans le
deuxième cas il faut empiler le registre IP ainsi que le registre segment CS et bien sur il les
dépiler pendant le retour de la procédure.
(paramètres) qui sont fournies par le programme appelant, et produit un résultat qui est
transmis à ce programme. Plusieurs stratégies peuvent être employées :
1. Passage par registre : les valeurs des paramètres sont contenues dans des registres du
processeur. C'est une méthode simple, mais qui ne convient que si le nombre de paramètres
est petit (il y a peu de registres).
2. Passage par la pile : les valeurs des paramètres sont empilées. La procédure lit la
pile.
On va écrire une procédure (SOMME) qui calcule la somme de 2 nombres naturels de 16 bits.
Convenons que les entiers sont passés par les registres AX et BX, et que le résultat sera placé
dans le registre AX.
MOV AX, 6
MOV BX, Truc
CALL SOMME
MOV Truc, AX
Cette technique met en œuvre un nouveau registre, BP (Base Pointer), qui permet de lire des
valeurs sur la pile sans les dépiler ni modifier SP. Le registre BP permet un mode d'adressage
indirect spécial, de la forme :
PUSH 6
PUSH Truc
CALL SOMME2
La procédure SOMME2 va lire la pile pour obtenir la valeur des paramètres. Pour cela, il faut
bien comprendre quel est le contenu de la pile après le CALL :
empilée par CALL). Chaque élément de la pile occupe deux octets. La procédure SOMME2
s'écrit donc :
La solution avec passage par la pile parait plus lourde sur cet exemple simple. Cependant, elle
est beaucoup plus souple dans le cas général que le passage par registre. Il est très facile par
exemple d'ajouter deux paramètres supplémentaires sur la pile. Une procédure bien écrite
modifie le moins de registres possible. En général, l'accumulateur est utilisé pour transmettre
le résultat et est donc modifié. Les autres registres utilisés par la procédure seront
normalement sauvegardés sur la pile. Voici une autre version de SOMME2 qui ne modifie pas
la valeur contenue par BP avant l'appel :
Noter que les index des arguments (BP+4 et BP+6) sont modifiés car on a ajouté une valeur
au sommet de la pile.
Syntaxe :
JMP cible
L'exécution de l'instruction MOV BX, AX sera faite après l'exécution de la boucle 5 fois.
Exemple :
VI ) Les instructions de chaînes de caractères :
Les instructions de chaînes des caractères sont au nombre de 14 comme le montre le tableau
suivant :
Elles permettent de travailler sur des blocs d'octets ou de mots allant jusqu'à 64 Koctet.
Remarque :
VI-1-1 ) REP :
Ces instructions sont utilisées avec les instructions de chaînes de caractères pour assurer la
répétition de l'instruction si on veut appliquer l'instruction sur un ensemble d'informations.
REP décrément automatiquement CX est test est ce qu'il est égal à zéro ou non. Si CX = 0
REP s'arrêt
Pour REPE/REPZ : c'est la même chose que REP c'est-à-dire elle décrément automatiquement
le registre CX mais elle peut sortir de la boucle si ZF<>0
Pour REPNE/REPNZ : c'est la même chose que REP c'est-à-dire elle décrément
automatiquement le registre CX mais elle peut sortir de la boucle si ZF=0
Remarque :
Si l'élément à transférer est un octet on utilise : MOVB Si l'élément à transférer est un Mot on
utilise : MOVW
Exemple :
Donnee SEGMENT
Mess_Sour db ‘bonjour iset de nabeul' ; message source
Donnee ENDS
Extra SEGMENT
Mes_Des db 22 dup (0) ; message destination
Extra ENDS
Code SEGMENT
Assume CS : Code, DS : Donnee, ES : extra
PROG PROC
MOV AX,Donnee MOV DS, AX MOV AX,Extra MOV ES, AX
LEA SI, Mess_Sour ; pointé le message source
LEA DI, Mess_Des ; pointé le message destination
MOV CX, 22 ; nombre de caractère à transfèrer
CLD ; incrémentation automatique du SI et DI
REP MOVSB ; transfert avec le préfixe REP MOV AX,
4C00H
; Retour au DOS
INT 21H
PROG ENDP
CODE ENDS
END PROG
Si CMPS est utilisé avec le préfixe de répétition REPE/REPZ, elle est interprétée comme «
comparer tant que la chaîne n'est pas finie (CX <>0) et que les éléments à comparer ne sont
pas égaux (ZF=1)
Si CMPS est utilisé avec le préfixe de répétition REPNE/REPNZ, elle est interprétée comme
« comparer tant que la chaîne n'est pas finie (CX <>0) et que les éléments à comparer ne sont
pas égaux (ZF=0)
Remarque :
On ne peut pas utilisé le préfixe REP avec l'instruction CMPS car cela
revient à comparer uniquement les deux derniers éléments des deux chaînes.
Exemple :
Donnee SEGMENT
Mess_1 db ‘bonjour iset de nabeul' Mess_2 db ‘bonsoir iset de nabeul'
Donnee ENDS
Code SEGMENT
Assume CS : Code, DS : Donnee
PROG PROC
MOV AX,Donnee
MOV DS, AX
LEA SI, Mess_Sour ; pointé le message source
LEA DI, Mess_Des ; pointé le message destination
MO V CX, 22 ; nombre de caractère àcomparer
CLD ; incrémentation automatique du SI et DI
REP CMPSB ; transfert avec le préfixe
REP JCXZ Tito ; les deux chaînes sont identiques
MOV al, [SI-1] ; on met dans AL le caractère
; Différent
Tito : MOV AX, 4C00H ; Retour au DOS INT 21H
PROG ENDP
CODE ENDS
END PROG
Syntaxe :
SCAS chaine_destination
SCASB
SCASW
SCAS soustrait l'élément de la chaîne de destination (octet ou mot) adressé par DI dans le
segment extra du contenu de AL (un octet) ou de
AX (un mot) et agit sur les indicateurs. Ni la chaîne destination ni l'accumulateur ne
change de valeur.
Exemple :
VI-4-1 ) LODS :
Syntaxe :
LODS chaine_source
LODSB
LODSW
VI-4-2 ) STOS :
Syntaxe :
STOS chaine_destination
STOSB
STOSW
STOS transfert un octet ou un mot du registre AL ou AX vers l'élément de chaîne adressé par
DI et modifie DI pour qu'il pointe vers l'emplacement suivant de la chaîne.
Exemple :
transfert d'une chaîne source vers une chaîne destination en utilisant LODS et STOS.
Donnee SEGMENT
Mess_Sour db ‘bonjour iset de nabeul' ; message source
Donnee ENDS
Extra SEGMENT
Mes_Des db 22 dup (0) ; message destination
Extra ENDS
Code SEGMENT
Assume CS : Code, DS : Donnee, ES : extra
PROG PROC
MOV AX,Donnee
MOV DS, AX
MOV AX,Extra
MOV ES, AX
LEA SI, Mess_Sour ; pointé le message source
LEA DI, Mess_Des ; pointé le message destination
MOV CX, 22 ; nombre de caractère à transfèrer
CLD ; incrémentation automatique du SI et DI
DEBUT : LODSB ; transfert avec le préfixe REP STOSB
LOOP DEBUT
MOV AX, 4C00H ; Retour au DOS INT 21H
PROG ENDP
CODE ENDS
END PROG
VII-1 ) Indicateurs :
VII-1-1/ STD :
Met CF à 1 ; les registres d'indexation SI et/ou DI sont alors automatiquement décrémenter
par les instructions de chaîne de caractère.
VII-1-2 ) STI :
VII-2 ) Synchronisation :
VII-2-1 ) HALT :
VII-2-2 ) WAIT :
Met le CPU en état d'attente tant que sa ligne de TEST n'est pas active. En effet toutes les cinq
périodes d'horloge le CPU vérifie est ce que cette entrée est active ou non, si elle est active le
processus exécute l'instruction suivante à WAIT.
VII-2-3 ) ESC :
L'instruction Escape fournit un mécanisme par lequel des coprocesseurs peuvent recevoir
leurs instructions à partir de la suite d'instructions du 8086.
VII-2-4 ) LOCK :
Elle utilise dans les systèmes Multiprocesseur en effet elle permet le verrouillage du bus vis-
à-vis des autres processeurs.
Le CPU ne fait rien on peut s'en servir pour créer des temporisations.
Exemple :