Académique Documents
Professionnel Documents
Culture Documents
Programmation en Assembleur 8086 PDF February 10 2009 5 39 PM 170k PDF
Programmation en Assembleur 8086 PDF February 10 2009 5 39 PM 170k PDF
Dbut
NZ <-- 0
C <-- 1
NON
T(C) = 0 ?
OUI
NZ <-- NZ + 1
C <-- C + 1
NON
OUI
C < N ?
Fin
Dbut
BX <-- 0h
CX <-- 100h
SI <-- 200h
CMP DS:[SI],0
NON
Z = 1 ?
OUI
BX <-- BX + 1
SI <-- SI + 1
CX <-- CX - 1
OUI
NON
Z = 1 ?
DS:[400h] <-- BX
Fin
Etq2 :
Etq1 :
MOV
MOV
MOV
CMP
JNZ
INC
INC
DEC
JNZ
MOV
BRK
CX, 100h
BX, 0000h
SI, 200h
[SI], 0
Etq1
BX
SI
CX
Etq2
[400], BX
Contrairement linstruction HLT qui fait arrter le 8086 de toute activit jusqu larrive
dune interruption matrielle, linstruction BRK (break) fait arrter le programme en cours
dexcution et revenir lexcution du systme dexploitation.
Exercice 2 :
Ecrire un programme qui permet de dterminer le maximum dans un tableau doctets
mmoire de longueur 100h et dbutant ladresse [200h], le rsultat sera plac ladresse
[400h].
Solution :
Dbut
CX <-- FFh
SI <-- 200h
AL <-- [SI]
SI <-- SI + 1
NON
OUI
AL > [SI] ?
AL <-- [SI]
CX <-- CX - 1
OUI
NON
Z = 1 ?
DS:[400h] <-- AL
Fin
Etq2 :
Etq1 :
MOV
MOV
MOV
INC
CMP
JLE
MOV
DEC
JNZ
MOV
BRK
CX, FFh
SI, 200h
AL, [SI]
SI
AL, [SI]
Etq1
AL, [SI]
CX
Etq2
[400], AL
Exercice 3 :
Ecrire un programme qui permet de trier par ordre croissant un tableau de longueur N = 100h
dbutant ladresse [200h].
Solution :
Dbut
BX <-- 200h
CX <-- N-1
SI <-- BX + 1
DX <-- CX
AL <-- [BX]
OUI
NON
AL > [SI] ?
XCHG AL,[SI]
[BX] <-- AL
SI <-- SI + 1
DX <-- DX - 1
OUI
NON
Z = 1 ?
BX <-- BX + 1
CX <-- CX - 1
NON
Z = 1 ?
OUI
Fin
6
Dans cette solution on a eu besoin de deux compteurs CX et DX ; En fait, pour chaque valeur
du compteur CX on prend une des (N - 1) premires valeurs du tableau et on la compare avec
toutes les valeurs qui viennent aprs (avec une pour chaque valeur de DX). Le compteur CX
prend donc les valeurs suivantes :
CX = N-1, N-2, ... 2, 1.
Lorsque CX est fix une valeur (i), on est alors entrain de comparer la valeur (N - i) du
tableau avec les (i) valeurs qui viennent aprs ; Donc pour chaque valeur de CX, DX prendra
les valeurs suivantes :
DX = CX-1, CX-2, ... 2, 1.
CX <-- N-1
SI <-- 200h
DX <-- CX
BL <-- 0
AL <-- [SI]
NON
OUI
AL [SI+1] ?
XCHG AL,[SI+1]
[SI] <-- AL
BL <-- BL+1
SI <-- SI + 1
DX <-- DX - 1
OUI
NON
Z = 1 ?
NON
BL = 0 ?
OUI
CX <-- CX - 1
Z = 1 ?
NON
OUI
Fin
8
Dans cette solution on fait le tri de chaque deux valeurs successives du tableau (si elles ne
sont pas tries entre elles dans lordre croissant, on fait une permutation entre elles) ;
Pour chaque valeur du compteur secondaire DX, les valeurs trier sont pointes par [SI] et
[SI+1] ;
Le tableau ayant N valeurs, et le premier passage se faisant jusqu comparer entre lavant
dernire et la dernire valeur, le compteur principal CX aura donc parcourir (N - 1) valeurs,
cd:
CX = N-1, N-2, ... 2, 1
Cette solution permet darrter le processus lorsquon constate que le tableau et dj tri aprs
un passage du compteur secondaire DX par toutes ses valeurs concernes, mme avant
datteindre la limite du compteur principal (CX = 1) ;
Pour chaque passage (i) (c d pour chaque valeur du compteur principal CX = N - i), SI varie
de sa valeur initiale (200h) jusqu la valeur (200h + N - i -1), ce qui donne (N - i) valeurs,
donc le compteur DX va prendre les (N - i) valeurs suivantes :
DX = N-i, N-i-1, N-i-2, ... 2, 1
Ce qui donne :
DX = CX, CX-1, CX-2, ... 2, 1
Par exemple, pour un tableau de longueur N = 5, et pour le premier passage et le deuxime
passage (i = 1) on aura :
CX = 3
CX = 4
DX = 4
DX = 3
(SI+1) finale
1
(SI+1) finale
START :
SEGMENT
ASSUME
ORG
JMP
Etq3 :
Etq2 :
Etq1 :
INC SI
DEC DX
JNZ Etq2
CMP BL, 0
JZ Fin
DEC CX
JNZ Etq3
Fin :
BRK
CODE
ENDS
END START
10
Dbut
CX <-- N-1
FINDMAX
NON
OUI
BL = 0 ?
CX <-- CX - 1
NON
OUI
Z = 1 ?
Fin
11
Le sous-programme :
SI <-- 200h
DX <-- CX
BL <-- 0
AL <-- [SI]
NON
OUI
AL [SI+1] ?
XCHG AL,[SI+1]
[SI] <-- AL
BL <-- BL+1
SI <-- SI + 1
DX <-- DX - 1
OUI
NON
Z = 1 ?
RET
12
START :
sous-programme
FINDMAX
SEGMENT
ASSUME
ORG
JMP
Etq2:
; la procdure sera place ici
MOV AX, CODE
MOV DS, AX
MOV ES, AX
BEGIN :
Etq1 :
MOV CX, N-1
CALL FINDMAX
CMP BL, 0
JZ Fin
DEC CX
LOOP Etq3
Etq3 :
Fin :
CODE
FINDMAX
PROC
PUSH CX
MOV SI, 200h
MOV DX, CX
MOV BL, 0
MOV AL, [SI]
CMP AL, [SI+1]
JLE Etq1
XCHG AL, [SI+1]
MOV [SI], AL
INC BL
INC SI
DEC DX
JNZ Etq2
POP CX
RET
ENDP
BRK
ENDS
END START
Remarques :
Le compteur CX est utilis par le programme principal, mais il nest pas ncessaire de lempiler avant
lexcution de la procdure du sous-programme, car cette dernire ne modifie pas le contenu de CX.
Il est possible aussi de faire lempilement de CX dans le programme principal juste avant le CALL et de faire
son dsempilement dans le programme principal aussi juste aprs le CALL.
Le registre BL ne peut pas tre empil et dsempil par le programme principal, car la valeur retourne par le
sous-programme ne doit pas tre perdue avant son utilisation dans linstruction (CMP BL, 0) qui vient aprs le
sous programme.
On rappelle que pour un programme dont lensemble des segments ne dpasse pas les 64 Ko,
alors, le programme est organis selon le canevas suivant :
; nom du programme
CODE
SEGMENT
ASSUME
CS:CODE, DS:CODE ES:CODE, SS:CODE
ORG
0100H
placer toutes les EQU ici
START :
JMP
BEGIN
placer tous les define ici
placer toutes les procdures ici
placer votre programme ici
BEGIN :
CODE
ENDS
END START
13
Exercice 4 :
Ecrire un programme qui puisse calculer le PGDC (plus grand diviseur commun) de deux
nombres se trouvant aux adresses [200h] et [201h] ; le rsultat sera plac ladresse [202h].
On rappelle que :
* PGDC [n , m] = PGDC [m , reste(n/m)] , n > m
* PGDC [n , 0] = n , quelque soit n
Solution :
Cette solution utilise une procdure rcursive (qui fait appel elle-mme) :
programme
;pgdcom
CODE
START :
sous-programme
PGDC
SEGMENT
ASSUME
ORG
JMP
PUSH AX
PUXH BX
DIV BL
CMP AH, 00H
JZ FIN
MOV AL, BL
MOV BL, AH
CBW
CALL PGDC
CODE
PROC
FIN :
POP BX
POP AX
RET
PGDC
ENDP
Remarque :
Les registres AH, AL, BH, BL sont employs par le programme principal et par la procdure, donc on doit les
empiler avant de les utiliser par la procdure, puis les dsempiler aprs finir leur utilisation avec la procdure
(PUSH et POP ne fonctionnent que sur des registres 16 bits).
14
Exercice 5 :
Ecrire un programme qui puisse calculer un dixime prs la moyenne arithmtique de
N = 100 valeurs se trouvant dans un tableau.
Solution :
;moy
CODE
SEGMENT
ASSUME
ORG
START :
JMP
BEGIN :
Boucle :
Fin :
BRK
CODE
ENDS
END START
15
Exercice 6 :
Ecrire un programme qui indique la prsence de la chane de caractres TEC568 qui dbute
ladresse [300h], dans un tableau de N = 96 lments qui dbute ladresse [200h], (utiliser
deux procdures AFICH_OK et AFFICH_NK pour afficher le rsultat).
Solution :
Dbut
SI <-- 200h
CX <-- N-5
DI <-- 300h
BL <-- 6
CLD
CMPSB
NON
OUI
Z = 1 ?
OUI
NON
DEC BL
BL = 5 ?
NON
OUI
Z = 1 ?
DEC SI
DEC CX
NON
Z = 1 ?
AFFICH_OK
OUI
AFFICH_NK
Fin
16
La longueur de la chane TEC586 est N = 6, la premire lettre T est donc cherche parmi
les (N - N -1) premires valeurs ; et le compteur CX prend les valeurs suivantes (sa dernire
valeur est toujours gales 1) :
CX = N - (N - 1), N - (N - 1) - 1, ... 2, 1
Par exemple, si N = 15, on aura :
1
CX = 10
10
11 12
13
14
15
6
Le programme :
;moy
CODE
SEGMENT
ASSUME
ORG
START :
JMP
BEGIN :
Etq1 :
Etq2 :
Etq3
Etq4
Fin :
INT 3
CODE
ENDS
END START
17