Vous êtes sur la page 1sur 7

TP2 : Contrôle de flux du programme

M2/Electromecanique Module : µProc & Api

Contrôler le flux du programme est une chose très importante, c’est là que notre programme peut
prendre des décisions sous certaines conditions.

II –1/ Sauts inconditionnels JMP :


L’instruction de base qui transfère le contrôle à un autre point du programme est JMP.
La syntaxe de base de l’instruction JMP :
JMP Etiquette
Pour déclarer une étiquette dans votre programme, tapez simplement son nom et ajouter ":" à la fin,
l’étiquette peut être n’importe quelle combinaison de caractères, mais elle ne peut pas commencer
par un nombre, par exemple voici trois définitions correctes d’étiquette.
Label1 :
Label2 :
a:
L’étiquette peut être déclarée sur une ligne séparée ou avant toute autre instruction, par exemple :
X1:
MOV AX, 1
X2: MOV AX, 2
Exemple
org 100h
mov ax, 5 ; mettre ax à 5
mov bx, 2 ; mettre bx à 2
jmp calc ; aller à ‘calc’
back: jmp stop ; aller à ‘stop’
calc:
add ax, bx ; additionner bx avec ax
jmp back ; aller à ‘back’
stop:
ret ; retour au système d’exploitation

II –2/ Sauts conditionnels : JMP condition


Ces instructions font un saut conditionnel (saut seulement lorsque certaines conditions sont vraies).
Exemple :
Jnc a
Jnb a
Jae a
Mov ax, 4
A : mov ax, 5
Ret

Le code opération de cette instruction est 73h, ayant une longueur fixe de deux octets, le second
octet est le nombre d’octets à ajouter au registre IP si la condition est vraie.
Le tableau suivant contient les instructions qui testent un seul drapeau.

1
Opposite
Instruction Description Condition
Instruction

JZ , JE Jump if Zero (Equal). ZF = 1 JNZ, JNE

JC , JB, JNAE Jump if Carry (Below, Not Above Equal). CF = 1 JNC, JNB, JAE

JS Jump if Sign. SF = 1 JNS

JO Jump if Overflow. OF = 1 JNO

JPE, JP Jump if Parity Even. PF = 1 JPO

JNZ , JNE Jump if Not Zero (Not Equal). ZF = 0 JZ, JE

JNC , JNB, Jump if Not Carry (Not Below, Above


CF = 0 JC, JB, JNAE
JAE Equal).

JNS Jump if Not Sign. SF = 0 JS

JNO Jump if Not Overflow. OF = 0 JO

JPO, JNP Jump if Parity Odd (No Parity). PF = 0 JPE, JP

Pour les nombres signés


Instruction Description Condition Opposite Instruction

Jump if Equal (=).


JE , JZ ZF = 1 JNE, JNZ
Jump if Zero.

Jump if Not Equal (<>).


JNE , JNZ ZF = 0 JE, JZ
Jump if Not Zero.

ZF = 0
Jump if Greater (>).
JG , JNLE and JNG, JLE
Jump if Not Less or Equal (not <=).
SF = OF

Jump if Less (<).


JL , JNGE SF <> OF JNL, JGE
Jump if Not Greater or Equal (not >=).

Jump if Greater or Equal (>=).


JGE , JNL SF = OF JNGE, JL
Jump if Not Less (not <).

ZF = 1
Jump if Less or Equal (<=).
JLE , JNG or JNLE, JG
Jump if Not Greater (not >).
SF <> OF

Pour les nombres non signés

2
Instruction Description Condition Opposite Instruction

Jump if Equal (=).


JE , JZ ZF = 1 JNE, JNZ
Jump if Zero.

Jump if Not Equal (<>).


JNE , JNZ ZF = 0 JE, JZ
Jump if Not Zero.

CF = 0
Jump if Above (>).
JA , JNBE and JNA, JBE
Jump if Not Below or Equal (not <=).
ZF = 0

Jump if Below (<).


JB , JNAE, JC Jump if Not Above or Equal (not >=). CF = 1 JNB, JAE, JNC
Jump if Carry.

Jump if Above or Equal (>=).


JAE , JNB, JNC Jump if Not Below (not <). CF = 0 JNAE, JB
Jump if Not Carry.

CF = 1
Jump if Below or Equal (<=).
JBE , JNA or JNBE, JA
Jump if Not Above (not >).
ZF = 1

II –3/ L’instruction de comparaison CMP


Généralement, lorsqu’il est nécessaire de comparer des valeurs numériques, l’instruction CMP est
utilisée (elle assure la même tache que l’instruction SUB (soustraire), mais ne conserve pas le
résultat, elle affecte uniquement les drapeaux).
Si le résultat n’est pas nul (zéro flag reste à 0).
Si le résultat est nul (zéro flag reste à 1 et JZ ou JE feront le saut).
Exemple :
include "emu8086.inc"
org 100h
mov al, 25 ; fixé al to 25.
mov bl, 10 ; fixé bl to 10.
cmp al, bl ; comparer al - bl.
je equal ; Saut si al = bl (zf = 1).
putc 'n' ; si elle arrive ici, alors al <> bl,
jmp stop ; alors imprimer 'n', et sauter pour s’arrêter.
equal: ; si elle arrive ici,
putc 'y' ; Alors al = bl, donc imprimer 'y'.
stop: ret ; arrêter le programme.

3
II –4/ Les boucles : Loop étiquette
L’instruction Loop est au fond un saut conditionnel, elle décrémente le registre compteur Cx
Structure d’une boucle :
DEC Cx
CMP Cx, 0
JNZ étiquette
loops

instruction operation and jump condition opposite instruction

LOOP decrease cx, jump to label if cx not zero. DEC CX and JCXZ

LOOPE decrease cx, jump to label if cx not zero and equal (zf = 1). LOOPNE

LOOPNE decrease cx, jump to label if cx not zero and not equal (zf = 0). LOOPE

LOOPNZ decrease cx, jump to label if cx not zero and zf = 0. LOOPZ

LOOPZ decrease cx, jump to label if cx not zero and zf = 1. LOOPNZ

JCXZ jump to label if cx is zero. OR CX, CX and JNZ

Exemples d’application
Exemple1
Additionner 10 nombres binaires non signés sur 8 bits (3, 7, 8, 12, 34, 0, 11, 23, 17, 29)
Le chargement des dix nombres dans le segment des données est :
Mov b. [45h], 3
Mov b. [46h], 7 DS :offset Valeur
100h :45 3
Mov b. [47h], 8
100h :46 7
Mov b. [48h], 12 100h :47 8
Mov b. [49h], 34 100h :48 12
Mov b. [4Ah], 0 100h :49 34
Mov b. [4Bh],11 100h :4A 0
Mov b. [4Ch], 23 100h :4B 11
Mov b. [4Dh], 17 100h :4C 23
Mov b. [4Eh], 29 100h :4D 17
100h :4E 29
Le code qui fait l’addition de ces nombres
MOV CX , 09h
MOV BX , 0h
MOV AL , [BX+45h]
Repeat: ADD AL , [BX+46h]
INC BX
LOOP Repeat
RET

4
Exemple2
Additionner deux nombres signés N1 et N2 se trouvant respectivement aux offsets 100h et 101h. Le
resultat est rangé dans l’offset 102h s’il est positif, dans l’offset 103h s’il est négatif et dans l’offset
103h s’il est nul.
ORG 100h Debut
; Chargement de N1 et N2 dans le segment de données
Mov b. [100h], -14
N1 + N2
Mov b. [101h], -14
; Le code qui fait le rangement
Mov AL,[100h] Result
ADD AL,[101h] >0
JS NEGATIF
JS NUL Ranger le resultat
Mov [102h], AL à l’offset 103h
JMP FIN Result
=0
NEGATIF : Mov [103h], AL
JMP FIN Ranger le resultat
à l’offset 104h
NUL: Mov [104h], AL
FIN HLT Ranger le resultat
à l’offset 102h

Fin

Exemple3
Le programme ci-contre en mov al,0h mov al,255
assembleur 8086 retrouve le mov bx,100h mov bx,100h
nombre non signé maximal parmi mov cx,0Ah mov cx,0Ah
une suite de nombres et place ce eti1:cmp [bx],al eti1:cmp [bx],al
nombre dans l’adresse d’offset jbe eti2 jae eti2
0300h. Supposons que les mov ax,[bx] mov ax,[bx]
nombres sont : eti2:inc bx eti2:inc bx
(52, 16, 30, 240, 26, 63, 22, loop eti1 loop eti1
123, 21, 31). mov [300h],al mov [300h],al
et se retrouvent à partir de hlt hlt
l’adresse d’offset 0100h.
Quelles sont les modifications
nécessaires pour que ce
programme retrouve le nombre
non signé minimal.

Exemple4
Charger les nombres décimaux signés suivants à partir de l’offset 0100h :(40, -45, 78, 12, -5, -10, -
22, 15, 31, 14)
-Ecrire un programme en assembleur 8086 qui additionne d’une part les nombres positifs et
conserve le résultat dans un emplacement mémoire d’offset 0300h, et d’autre part les nombres
négatifs et conserve le résultat dans un emplacement mémoire d’offset 0302h.
-Afficher en hexadécimal les valeurs chargées et les résultats obtenus.

5
Chargement Programme principal Affichage en hexadécimal des
valeurs chargées et les résultats
obtenus
Mov b.[100h],40 mov cx,0A [100h]=28 h
Mov b.[101h],-45 mov bx,100h [101h]=D3 h
Mov b.[102h],78 mov ax,0000h [102h]=4E h
Mov b.[103h],12 mov [300h],al [103h]=0C h
Mov b.[104h],-5 mov [302h],al [104h]=FB h
Mov b.[105h],-10 eti3:mov al,[bx] [105h]= F6 h
Mov b.[106h],-22 cmp al,0h [106h]= EA h
Mov b.[107h],15 jge eti1 [107h]=0F h
Mov b.[108h],31 add [302h],ax [108h]=1F h
Mov b.[109h],14 jmp eti2 [109h]=0E h
eti1:add [300h],ax [300h]=BE h
eti2: inc bx [302h]=AE h
loop eti3 [303h]=03 h
hlt

Exemple5
Le listing d’un programme en assembleur 8086 mov ax,0000h
est écrit ci contre mov bx,0100h
Commenter chaque instruction de ce next:cmp [bx],0
programme ? jz done
Qu’est ce qu’il fait ce programme ? add ax,[bx]
inc bx
jmp next
done;mov [bx],ax
hlt

Ce programme additionne une liste de nombres non-signés se trouvant en mémoire et place la somme
dans un autre emplacement en mémoire. Le dernier nombre de la liste est zéro et cette valeur sert
d’indicateur de fin.
Exemple 6
Soient les nombres décimaux non signés suivants qui se trouvent à partir de l’emplacement
mémoire d’offset 0100h : (52, 16, 30, 240, 26, 63, 22, 123, 21, 31).
-Donner l’équivalent hexadécimal de ces nombres ?
-Ecrire un programme en assembleur 8086 qui inversera les quatre premiers bits, sauvegardera le
reste, et placera les résultats à partir de l’emplacement mémoire d’offset 0300h.
le nombre
le résultat
-Afficher en hexadécimal les résultats obtenus.

(52, 16, 30, 240, 26, 63, 22, 123, 21, 31).
(34h, 10h, 1Eh , F0h, 1Ah , 3Fh, 16h , 7Bh, 15h, 1Fh) l’équivalent enhexadécimal

6
Programme Resultats
mov b.[100h],52 [300h]=3B h
mov b.[101h],16 [301h]=1F h
mov b.[102h],30
mov b.[103h],240
[302h]=11 h
mov b.[104h],26 [303h]=FF h
mov b.[105h],63 [304h]=15 h
mov b.[106h],22 [305h]= 30 h
mov b.[107h],123 [306h]= 19 h
mov b.[108h],21
mov b.[109h],31
[307h]=74 h
mov bx,0h [308h]=1A h
mov cx,0ah [309h]=10 h
eti1:mov ax,[bx+100h]
xor ax,0fh
mov [bx+300h],ax
inc bx
loop eti1 hlt

Vous aimerez peut-être aussi