Académique Documents
Professionnel Documents
Culture Documents
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.
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
JC , JB, JNAE Jump if Carry (Below, Not Above Equal). CF = 1 JNC, JNB, JAE
ZF = 0
Jump if Greater (>).
JG , JNLE and JNG, JLE
Jump if Not Less or Equal (not <=).
SF = OF
ZF = 1
Jump if Less or Equal (<=).
JLE , JNG or JNLE, JG
Jump if Not Greater (not >).
SF <> OF
2
Instruction Description Condition Opposite Instruction
CF = 0
Jump if Above (>).
JA , JNBE and JNA, JBE
Jump if Not Below or Equal (not <=).
ZF = 0
CF = 1
Jump if Below or Equal (<=).
JBE , JNA or JNBE, JA
Jump if Not Above (not >).
ZF = 1
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
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
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