l’Informatique
Chapitre 4:
Les Instructions de Microprocesseur 8086
A.U. 2019-2020
Généralités
Une instruction est définie par son code opératoire, valeur numérique binaire difficile à
manipuler par l’être humain. On utilise donc une notation symbolique pour représenter
les instructions : les mnémoniques.
Numéro d’octet
0 1 2 3 Motorolla, MIPS, SPARC
Numéro d’octet
2 1 0
Intel 8086,80386, VAX, Alpha
3
exemple
300 BA FF 300
BA 54 32 FF 54 32
3 2 1 0 32 54
FF BA 303
MSB LSB 303
MIPS 8086
4
Les instructions du µP 8086
1- Les instructions transfert données :
MOV destination, source : (destination)←(source).
Destination Source Exemple
mov ax,30 ; il va mettre dans ax=1E car il considère 20 comme valeur décimal
mov bx,20
mov ax,10011101b
mov bh,al
Les instructions du µP 8086
PUSH source : (la pile)←(source).
POP destination : (destination)←(la pile)
source destination
Il existe différentes façons de spécifier l’adresse d’une case mémoire dans une
instruction : ce sont les modes d’adressage.
Exemples de modes d’adressage simples :
adressage par registre.
mov ax,bx : charge le contenu du registre BX
dans le registre AX. Dans ce cas, le transfert
se fait de registre à registre :
adressage immédiat.
mov al,12H : charge le registre AL
avec la valeur 12H. La donnée est
fournie immédiatement avec l’instruction
adressage direct
Exemples :
mov al,[bx] : transfère la donnée dont l’offset est contenu dans le registre de base BX
vers le registre AL. Le segment associé par défaut au registre BX est le segment de
données : on dit que l’adressage est basé sur DS;
mov al,[bp] : le segment par défaut associé au registre de base BP est le segment de
pile. Dans ce cas, l’adressage est basé sur SS.
adressage indexé : semblable à l’adressage basé, sauf que l’offset est contenu dans un
registre d’index SI ou DI, associés par défaut au segment de données.
Exemples :
mov al,[si] : charge le registre AL avec le contenu de la case mémoire dont l’offset est
contenu dans SI.
mov [di],bx : charge les cases mémoire d’offset DI et DI + 1 avec le contenu du registre
BX.
Remarque : une valeur constante peut éventuellement être ajoutée aux registres de base
ou d’index pour obtenir l’offset.
Exemple :
mov [si+100H],ax qui peut aussi s’écrire mov [si][100H],ax
ou encore mov 100H[si],ax
Les modes d’adressage basés ou indexés permettent la manipulation de tableaux rangés
en mémoire.
Exemple :
mov si,0
mov word ptr table[si],1234H
mov si,2
mov word ptr table[si],5678H
Dans cet exemple, table représente l’offset du premier
élément du tableau et le registre SI joue le rôle d’indice
de tableau.
Adressage basé et indexé : l’offset est obtenu en faisant la somme d’un registre de
base, d’un registre d’index et d’une valeur constante.
Exemple : mov ah,[bx+si+100H]
Ce mode d’adressage permet l’adressage de structures de données complexes : matrices,
enregistrements, ...
Exemple : mov bx,10 mov si,15 mov byte ptr matrice[bx][si],12H
Exemples :
add byte ptr [1200H],05H : ajoute la valeur 05H au contenu de la case mémoire d’offset
1200H (adressage immédiat).
Exemple
mov [1100H],20h
mov ah,30h
add ah, [1100H]
mov [1100h],5EDFh
add byte ptr [1100H],05H
Soustraction : SUB opérande1,opérande2
mov ax,4253
mov bx,1689 (DX,AX)=4253*1689
mul bx
mov al,43
mov byte ptr [1200H],28 AX=43*28
mul byte ptr [1200H]
mov ax,1234
mov word ptr [1200H],5678 (DX,AX)=1234*5678
mul word ptr [1200H]
Exemples :
mov ax,35
mov bl,10 AL=3 (quotient) et AH=5 (reste)
div bl
mov dx,0
mov ax,1234 AX=123 (quotient) et DX=4 (reste)
mov bx,10
div bx
Les instructions logiques
Ce sont des instructions qui permettent de manipuler des données au niveau des bits.
Les opérations logiques de base sont :
ET;
OU;
OU exclusif ;
complément à 1;
complément à 2;
décalages et rotations.
OU logique : OR opérande1,opérande2
L’opération effectuée est : opérande1 ← opérande1 OU opérande2.
Application : mise à 1 d’un ou plusieurs bits dans un mot.
Exemple : dans le mot 10110001, on veut mettre à « 1 » les bits 1 et 3 sans modifier les
autres bits.
entrée d’un 0 à la place du bit de poids fort ; le bit sortant passe à travers l’indicateur
de retenue CF.
entrée d’un 0 à la place du bit de poids faible; le bit sortant passe à travers
l’indicateur de retenue CF.
Même remarque que précédemment si le nombre de positions à décaler est supérieur à
1.
Remarque : il existe un autre type de saut conditionnel, les sauts arithmétiques. Ils
suivent en général l’instruction de comparaison : CMP opérande1,opérande2
Exemple d’application des instructions de sauts conditionnels : on veut additionner
deux nombres signés N1 et N2 se trouvant respectivement aux offsets 1100H et 1101H.
Le résultat est rangé à l’offset 1102H s’il est positif, à l’offset 1103H s’il est négatif et à
l’offset 1104H s’il est nul.
38
Les instructions de comparaison: CMP.
Syntaxe: CMP Destination,Source
Destination = registre / case mémoire
Source = registre / case mémoire / valeur
Exemples:
CMP AL,CL ; compare AL à CL
CMP AL,0 ; compare AL à 0
Les instructions de boucle: LOOP, LOOPE et LOOPNE
Ces instructions permettent de programmer les structures itératives:
do { instructions } While (condition), While (condition) {instructions},...
Elles utilisent le registre CX comme décompteur. Aussi il est recommandé de ne pas
modifier CX à l'intérieur de la boucle. Ce registre CX doit être initialisé à une valeur
positive avant l'entrée dans la boucle.
Syntaxe: LOOP etiquette
LOOPE etiquette
LOOPNE etiquette
LOOP décrémente le contenu de CX et le compare à 0; si CX est encore positif, il y a
branchement à étiquette. LOOPE décrémente le contenu de CX et le compare à 0; si CX
est encore positif et le flag Z est à 1, il y a branchement à étiquette. LOOPNE
décrémente le contenu de CX et le compare à 0; si CX est encore positif et le flag Z
est à 0, il y a branchement à étiquette.
39
Les entrées Sorties en assembleur
Affichage d’un caratère: mov DL, “A”; caractère A est transfére dans DL
mov AH, 2; fonction no. 2
int 21h ; appel au DOS
40
Chaine
• Code segment
• Assume cs:code
• Org 100h
• Start : jmp debut
• chaine db 'la somme des elements est:$'
• Debut:
• Mov dx,offset chaine
• Mov ah,09
• Int 21h
• int 20h
• code ends
• end start
Saisie d’un caractère mov AH, 7; fonction no. 7
(sans écho) int 21h ; résultat dans AL
De manière générale:
DB : 1 byte (8 bits) (Declare Byte)
DF,DP : 6 bytes
DT : 10 bytes
- décimal: 1, 2, 3, 123, 45
- hexadécimal : 1h,2h,3h,12h,0Fh,0AD4h
(noter la présence du 0 quand le premier chiffre du nombre en hexadécimal commence par une lettre)
- binaire : 1b,0b,1010b,111101b
43
Appel de sous-programmes : pour éviter la répétition d’une même séquence
d’instructions plusieurs fois dans un programme, on rédige la séquence une seule fois
en lui attribuant un nom et on l’appelle lorsqu’on en a besoin. Le programme appelant
est le programme principal. La séquence appelée est un sous-programme ou procédure.
Ecriture d’un sous-programme :
Remarque : une procédure peut être de type NEAR si elle se trouve dans le même
segment ou de type FAR si elle se trouve dans un autre segment.
Exemple :
segment (FAR).
Pour un CALL FAR (Inter segment)
Remarque : la valeur du pointeur de pile (SP) doit être initialisée par le programme
principal avant de pouvoir utiliser la pile.
Utilisation de la pile pour le passage de paramètres : pour transmettre des paramètres à une
procédure, on peut les placer sur la pile avant l’appel de la procédure, puis celle-ci les
récupère en effectuant un adressage basé de la pile en utilisant le registre BP.
R. BESROUR Cours Architecture & µprocesseur 30
Exemple : soit une procédure effectuant la somme de deux nombres et retournant le
résultat dans le registre AX .
programme principal :
procédure somme :
Etat de la pile :
Méthodes de programmation
55
Exercice 2
Soit la table TAB1 définit par (9A, 82, 30, F5, 54, C0, 65, 71, 80,
93) :
Ecrire un programme faisant appel à :
• Une procédure RECHERCHE qui permet de chercher la
valeur 54 dans TAB1 si elle existe et de la supprimer.
• Une procédure INVERSION qui permet l’inversion des
quartets de chaque valeur de la table TAB1 et de les
stocker en ordre inverse dans une autre table TAB2, (39,
08, 17, 57 0C, 45, 5F, 03, 28, A9).
• Une procédure PARITE qui permet de partager TAB1 en
deux tables TAB3 et TAB4. La première doit contenir les
éléments pairs. La deuxième doit contenir les éléments
impairs.
56
Solution
inversion proc near
Recherche proc near
Mov ax,0
Mov ax,0
Mov si,0
Mov si,0
Mov di,10
Mov bx,offset tab1
Mov cl,4
L2: mov al,[bx+si]
Lea bx,tab1
Cmp al,54h
Lea bp,tab2
Jne l1
L1: mov al,[bx+si]
Mov al,[bx+si+1]
Ror al,cl
Mov [bx+si],al
Mov [bp+di],al
L1: inc si
Inc si
Cmp si,10
Dec di
Jne l2
Cmp si,10
Ret
Jne l1
Recherche endp
ret
(9A, 82, 30, F5, 54, C0, 65, 71, 80, 93) : inversion endp
57
Soit la table TAB1 définit par (9A, 82, 30, F5, 54, C0, 65, 71, 80, 93) :
60
Solution: Version 1 : Procédures sans pile
61
Code segment
Assume code
Org 100h
Start: jump debut
Tab db 62h,….7Dh
Tab2 db 5 dup(?)
Chaine db ‘’la somme des termes est’’
S dw 0
Solution: Version 1 : Procédures sans pile
63
Solution: Version 2 : sans procédures mais avec pile
64
Solution: Version 3 : procédures ET pile
65
Solution: Version 3 : procédures ET pile
66
Exercice 4
67
Solution
68