Vous êtes sur la page 1sur 21

ECOLE NORMALE SUPRIEURE DE L'ENSEIGNEMENT TECHNIQUE - MOHAMMEDIA

Compte Rendu

TP - Assembleur i8086
(Sous EMU8086)

Anne Universitaire 2015/2016

Par :

Enseignant :

EL OUFIR EL MEHDI

Professeur A.RAIHANI

Sommaire :

Introduction gnrale ............................................................................................................................................. 3

Les registres du 8086 .............................................................................................................................. 3

Anatomie dun programme en assembleur ............................................................................................ 4

Rapport sur les exercices : ..................................................................................................................................... 5

Programme 01 - La somme de deux nombres ........................................................................................ 5

Objectif ......................................................................................................................................................... 5

Mthode de rsolution .............................................................................................................................. 5

Solution ........................................................................................................................................................ 5

Discussion et amlioration ........................................................................................................................ 5

AVEC DIVISION ............................................................................................................................ 6

AVEC MASQUAGE ....................................................................................................................... 7

Conclusion.................................................................................................................................................... 8

Programme 02 - La somme de deux vecteurs ........................................................................................ 9

Objectif ......................................................................................................................................................... 9

Solution ........................................................................................................................................................ 9

Discussion et amlioration ...................................................................................................................... 10

Conclusion.................................................................................................................................................. 12

Programme 03 Les entries/Sorties Manipulation des chaine de caractres .................................. 13

Objectif ....................................................................................................................................................... 13

Solution ...................................................................................................................................................... 13

Conclusion.................................................................................................................................................. 17

Programme 04 Lheure et la date courante avec les procdures ...................................................... 18

Objectif ....................................................................................................................................................... 18

Mthode de rsolution ............................................................................................................................ 18

Conclusion.................................................................................................................................................. 21

Introduction gnrale :
Un langage d'assemblage ou langage assembleur est, en programmation informatique, un langage
de bas niveau qui reprsente le langage machine sous une forme lisible par un humain. Les combinaisons
de bits du langage machine sont reprsentes par des symboles dits mnmoniques (du grec
mnmonikos, relatif la mmoire), c'est--dire faciles retenir. Le programme assembleur convertit ces
mnmoniques en langage machine en vue de crer par exemple un fichier objet ou un fichier excutable.
Dans la pratique courante, le mme terme assembleur est utilis la fois pour dsigner le langage
d'assemblage et le programme assembleur qui le traduit. On parle ainsi de programmation en
assembleur .

Les registres du 8086 :


Le 8086 est un processeur 16 bits, cest--dire quil traite des donnes codes sur 16 bits.

AX registre dusage gnral contenant des donnes. Les 8 bits de poids faible se nomment AL et les
8 bits de poids fort se nomment AH.
BX registre dusage gnral contenant des donnes. Comme ax, bx se ddcompose en BL et BH.
CX registre dusage gnral contenant des donnes. Comme AX, CX se dcompose en CL et CH. DX
registre dusage gnral contenant des donnes. Comme AX, dx se dcompose en dl et DH.
SI registre dusage gnral contenant gnralement le demplacement dans un segment dune
donne.
DI registre dusage gnral contenant gnralement le demplacement dans un segment dune
donne.
BP registre utilis pour adresser des donnes dans la pile.
SP registre pointeur de pile.
IP registre pointeur dinstruction (compteur ordinal). Ce registre indique la prochaine instruction
excuter.
Flags registre dindicateurs de ltat du processeur. Certains bits de ce registre portent des noms.
Ce sont tous des indicateurs binaires :

O le bit doverflow est positionn par la plupart des instructions arithmtiques pour indiquer
sil y a eut un dbordement de capacit lors du calcul (un nombre trop grand ou trop petit)
D bit de direction.
S le bit de signe est positionn par la plupart des instructions arithmtiques pour indiquer le
signe du rsultat (positif ou ngatif cf. section 1.4.2)
Z le bit de zro est positionn par la plupart des instructions arithmtiques pour indiquer
que le rsultat du calcul est 0
C le bit de carry (retenue) est positionn par la plupart des instructions arithmtiques pour
indiquer si le calcul a engendr une retenue qui devra tre reporte sur les calculs suivants.
A le bit dit auxiliaire carry (retenue auxiliaire) est positionn par la plupart des instructions
arithmtiques pour indiquer une retenue entre bits de poids faible et bits de poids forts dun
octet, dun mot ou dun double mot.

P le bit de parit est positionn par la plupart des instructions arithmtiques. Il indique si les
8 bits de poids faible du rsultat comportent un nombre pair de 1.

CS code segment segment contenant le programme en cours dexcution.


DS data segment segment contenant les donnes.
ES registre segment auxiliaire pour adresser des donnes.
SS stack segment segment contenant la pile.

Les valeurs des registres CS, DS et SS sont automatiquement initialises par le systme
dexploitation au lancement du programme. Ds lors, ces segments sont implicites, cest--dire que si lon
dsire accder une donne en mmmoire, il suffit de spcifier son offset sans avoir se soucier du
segment.

Anatomie dun programme en assembleur :


Un programme en assembleur a une forme bien particulire. Chaque ligne dune source assembleur
comporte une instruction. Chaque ligne est compose de champs. De gauche droite, on a :
le champ tiquette, qui peut tre vide.
le champ mnmonique (le nom de linstruction).
le champ oprande (les arguments de linstruction), qui peut tre vide.
le champ commentaire, qui peut tre vide.
Une tiquette est un identificateur compos de lettres, chiffres et de caractres $, %, _ et ?
Quelques exemples dtiquettes valides : boucle, fin_de_tant_que, ...
Une mnmonique est, gnralement, compos uniquement de lettres. Quelques mnmoniques que
nous retrouverons souvent : MOV, CMP, LOOP, ... On pourra indiffremment crire les mnmoniques
avec des lettres minuscules ou majuscules.
Les oprandes dune instruction indiquent les donnes traiter, soit sous la forme de valeurs
constantes, soit en spcifiant ladresse mmoire (lemplacement en mmoire) o se trouve la donne,
soit le nom dun registre contenant la donne ou contenant ladresse mmoire de la donne.
Un commentaire commence par un caractre ; et se termine en fin de ligne.

Rapport

sur les exercices :

Programme 01 - La somme de deux nombres :


Objectif : Nous avons besoins dun programme qui nous permettre dadditionner deux
nombres (5+3).

Mthode de rsolution : On va travailler directement avec le registre de 8 bits not DL qui


est spcialis dans laffichage. Dabord, on charge la valeur 5 dans DL par l'instruction
MOVE, puis on additionne 3 au contenu de DL par l'instruction ADD.

Solution :
1. CODE
SEGMENT
2.
Main :
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CODE ENDS
15. END Main

MOV DL,5
ADD DL,3

; Charger DL avec 5
; Additionner 3 au contenu de DL

ADD DL,48

; Pour obtenir le code ASCII de la contenu de DL

MOV AH,2
INT 21H

; Charger AH avec 2 (Paramtre de laffichage)


; Appeler linterruption 21H

MOV AH,4CH
INT 21H

; Retour au DOS

Discussion et amlioration : Cette solution est trs limite, parce quil aura un problme si
la somme des deux nombres est suprieure 9.
Exemple de 9+3 :

Comme vous le voyez on a affich caractre par caractre avec laddition de nombre 48
au nombre que l'on souhaite afficher, pour obtenir le code ASCII du caractre
correspondant ce nombre. Mais il y a que les nombre de 1 9 dans le table ASCII, pour
cela on va faire deux solutions (valable juste pour un nombre 99) un avec la division et
lautre avec le masquage.
Dans ces solutions on va utiliser des directives d'assemblage pour dfinir des constantes,
des variables, etc au dbut du programme, exactement dans le data segment.
1. DATA
SEGMENT
2.
nb1 db 90
3.
nb2 db 12
4.
tmp db ?
5.
diz db ?
6.
unit db ?
7. DATA ends

AVEC DIVISION : On va diviser le nombre rsultant par 10 par linstruction DIV.


Cette instruction fournit un quotient dans AL et un reste dans AH.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.

DATA
SEGMENT
nb1 db 90
nb2 db 12
sum db ?
diz db ?
unit db ?
DATA ends
CODE
SEGMENT
Main:

; Dclaration du Data segment

MOV AX,DATA
MOV ds,AX

; Dfinition
; du Data segment

XOR AX,AX

; Forcer les bits de AX 0

MOV AL,nb1
ADD AL,nb2
MOV BL,10
DIV BL
MOV diz,al
MOV unit,ah
MOV
ADD
MOV
INT

DL,diz
DL,48
AH,2
21H

MOV
ADD
MOV
INT

DL,unit
DL,48
AH,2
21H

MOV AH,4CH
INT 21H
CODE ENDS
END Main

AVEC MASQUAGE : Cette mthode a besoin dun ajustement dcimal pour


fonctionner.
1 - On va stocker la somme dans un variable temporelle parce quon va modifier le
contenu.
2 - dcaler le nombre rsultant 4 fois la droite par linstruction SHR pour obtenir les
dizaines.
3 On va remettre le variable temporelle dans AL, Puis on va multiplier AL par 0F
(00001111) grce linstruction AND pour obtenir lunit.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.

DATA
SEGMENT
nb1 db 3
nb2 db 9
tmp db ?
diz db ?
unit db ?
DATA ends
CODE
SEGMENT
Main :
MOV AX,DATA
MOV ds,AX
XOR AX,AX
MOV AL,nb1
ADD AL,nb2
DAA
MOV
MOV
SHR
MOV

; Ajustement dcimale du rsultat


tmp,AL
CL,4
AL,CL
diz,AL

MOV AL,tmp
AND AL,0Fh
mov unit,AL
MOV
ADD
MOV
INT

DL,diz
DL,48
AH,2
21H

MOV
ADD
MOV
INT

DL,unit
DL,48
AH,2
21H

; Dcalage a droit 4 fois

; Forcer les 4 bits de poids fort 0

MOV AH,4CH
INT 21H
CODE ENDS
END Main

Conclusion : On a rsolu le problme de laffichage par deux mthodes le premier on


forcer le AX 0 et on diviser le contenue tout en laffichant dans AX, dans la deuxime on
utilise lajustement dcimale du rsultat, dcalage droite 4 fois est on force les 4bits de
poids fort 0.

Programme 02 - La somme de deux vecteurs :


Objectif : Un programme qui fait la somme de deux vecteurs.
Mthode de rsolution : Il est trs courant de parcourir un tableau dans une boucle tout
en voulant sortir de la boucle lorsqu'une condition est vrifie ou si on arrive au dernier
lment du tableau.
Donc la mthode cest de parcourir les deux vecteurs au mme temps lment par
lment :
- chaque itration i on charge le vecteur v3[i] par le contenu de v1[i], puis on le
additionne par le contenu de v2[i].
- afficher v3[i].
- il doit incrmenter les adresses des tableaux
- il doit vrifier quon na pas encore atteint le dernier lment pour sortir la boucle.
Pour prendre les adresses qui pointent sur le premier lment de chaque table on va
utiliser 3 registres avec lutilisation de linstruction LEA :
BX
v1
SI
v2
DI
v3
Et pour afficher les valeurs du tableau rsultant on va faire la mme chose quon a dj
fait dans lexercice 1 avec la comparaison de llment v3[i] par 9 (Jai utilis la mthode de
masquage dans ce exercice).

Solution :
1. DATA
SEGMENT
2.
v1 db 1,8,3,9,5,6
3.
v2 db 9,8,4,0,1,8
4.
v3 db 6 dup(?)
5.
tmp db ?
6.
diz db ?
7.
unit db ?
8.
nu db 6
9. DATA ENDS
10. CODE
SEGMENT
11.
Main:
12.
13.
MOV
14.
MOV
15.
16.
LEA
17.
LEA
18.
LEA
19.
JMP
20.
21.
Boucle:
MOV
22.
MOV
23.
INT
24.
25.
Debut:
MOV
26.
ADD
27.
MOV
28.
29.
DAA

AX,DATA
DS,AX
BX, v1
SI, v2
DI, v3
Debut

; Copier ladresse de V1 dans BX

; Saut vers ltiquette Debut

DL,44
AH,2
21H
AL,[BX]
AL,[SI]
[DI],AL

; Charger AL par le contenu de l@ dans BX

; Ajustement dcimale du rsultat

30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SiDeuxCh:
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Continu:
64.
65.
66.
67.
68.
69.
70.
71.
72.
CODE ENDS
73. END Main

CMP AL,9
JA SiDeuxCh
MOV
ADD
MOV
INT

; Saut vers SiDeuxCh si AL > 9

DL,AL
DL,48
AH,2
21H

JMP Continu

; Saut vers Continu

XOR AH,AH
MOV
MOV
SHR
MOV

tmp,AL
CL,4
AL,CL
diz,AL

MOV AL,tmp
AND AL,0Fh
MOV unit,AL
MOV
ADD
MOV
INT

DL,diz
DL,48
AH,2
21H

MOV
ADD
MOV
INT

DL,unit
DL,48
AH,2
21H

ADD
ADD
ADD
DEC
JNZ

BX ,1
SI ,1
DI ,1
nu
Boucle

; Incrmenter BX par 1

; Dcrmenter BX nu
; Saut vers Boucle si n != 0

MOV AH,4CH
INT 21H

Discussion et amlioration : Supposant quon a 5 vecteurs, donc il doit utiliser 5 registres


pour sauvegarder les adresses de chaque vecteur la chose quest impossible dans
lassembleur X86.
Pour rsoudre ce problme on va manipuler seulement les indices des vecteurs par un
seul registre (SI) comme dans la programmation en C.

10

1. DATA
SEGMENT
2.
v1 db 1,8,3,9,5,6
3.
v2 db 9,8,4,0,1,8
4.
v3 db 6 dup(?)
5.
tmp db ?
6.
diz db ?
7.
unit db ?
8.
nu db 6
9. DATA ENDS
10. CODE
SEGMENT
11.
Main:
12.
13.
MOV AX,DATA
14.
MOV DS,AX
15.
MOV SI,0
16.
JMP Debut
17.
18.
Boucle:
MOV DL,44
19.
MOV AH,2
20.
INT 21H
21.
22.
Debut:
MOV AL,v1[SI]
23.
ADD AL,v2[SI]
24.
MOV v3[SI],AL
25.
26.
DAA
27.
CMP AL,9
28.
JA SiDeuxCh
29.
30.
MOV DL,AL
31.
ADD DL,48
32.
MOV AH,2
33.
INT 21H
34.
35.
JMP Continu
36.
37.
SiDeuxCh:
XOR AH,AH
38.
MOV tmp,AL
39.
MOV CL,4
40.
SHR AL,CL
41.
mov diz,AL
42.
43.
MOV AL,tmp
44.
AND AL,0Fh
45.
mov unit,AL
46.
47.
MOV DL,diz
48.
ADD DL,48
49.
MOV AH,2
50.
INT 21H
51.
52.
MOV DL,unit
53.
ADD DL,48
54.
MOV AH,2
55.
INT 21H
56.
57.
Continu:
ADD SI ,1
58.
DEC nu
59.
JNZ Boucle
60.

11

61.
62.
63.
64.
CODE ENDS
65. END Main

MOV AH,4CH
INT 21H

Conclusion : Daprs cette amlioration en dduire que lutilisation des indices est plus
efficace pour la manipulation des tableaux dans le langage assembleur, simple, lisible et
facile dans la rsolution.

12

Programme 03 Les entries/Sorties Manipulation des chaine de caractres:


Objectif : Lobjectif de cet exercice et de se familiariser avec les instructions de lecture et
dcriture des donnes en utilisant les interruptions.
1.

Afficher un caractre ;

2. Afficher un caractre saisi au clavier par l'utilisateur ;


3. Afficher une chane de caractres ;
4. Afficher une chane de caractre saisie au clavier par l'utilisateur ;
5. Lire une chane de caractre et l'afficher en sens inverse.
6. Lire un caractre au clavier et tester si son code ASCII est celui d'un chiffre. Si c'est
le cas, ranger ce chiffre (et non son code ASCII) dans N1, sinon afficher "N".
7.

Ecrire maintenant un programme (numread.asm) qui lit un nombre dcimal au


clavier et le sauvegarde dans N1. La lecture s'arrte quand le caractre lu n'est pas
un chiffre (plus besoin d'afficher "N").

Solution :
1 - Afficher un caractre.
1. CODE SEGMENT
2.
MAIN:
3.
MOV DL,'A'
4.
MOV AH, 2
5.
INT 21H
6.
7.
MOV AH, 4CH
8.
INT 21H
9.
CODE ENDS
10. END MAIN

13

2 - Afficher un caractre saisi au clavier par l'utilisateur.


1. CODE SEGMENT
2.
MAIN:
3.
MOV AH,
4.
INT 21H
5.
6.
MOV DL,
7.
MOV AH,
8.
INT 21H
9.
10.
MOV AH,
11.
INT 21H
12.
CODE ENDS
13. END MAIN

; Lecture du caractre
; Via linterruption 21H

AL
2

;
; Affichage du caractre
; Via linterruption 21H

4CH

3 - Afficher une chane de caractres


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

DATA SEGMENT
CHAINE DB 'Bonjour','$'
DATA ENDS
CODE SEGMENT
MAIN:
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET CHAINE
MOV AH, 09h
INT 21H

;
; Affichage de la chaine
;

MOV AH, 4CH


INT 21H
CODE ENDS
END MAIN

14

4 - Afficher une chane de caractre saisie au clavier par l'utilisateur


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.

DATA SEGMENT
mot1 db 20 dup('$')
return db 13,10,'$'
DATA ENDS
CODE SEGMENT
MAIN:
MOV AX, DATA
MOV DS, AX
MOV ah,0Ah
MOV dx,offset mot1
int 21h

;
; Lecture de la chaine
;

MOV ah,09h
MOV dx,offset return
int 21h

;
; Saut de ligne et retour chariot
;

MOV ah,09h
MOV dx,offset mot1+2
INT 21h

;
; Affichage de la chaine saisie
;

MOV ah,4ch
INT 21H
code ends
END MAIN

5 - Lire une chane de caractre et l'afficher en sens inverse.


1. DATA SEGMENT
2.
CHAINE DB 100 DUP ('$')
3.
return db 13,10,'$'
4. DATA ENDS
5. CODE SEGMENT
6.
MAIN:
7.
MOV AX, DATA
8.
MOV DS, AX
9.
10.
MOV DX, OFFSET CHAINE
11.
MOV AH, 10
12.
INT 21H
13.
14.
MOV ah,09h
15.
MOV dx,offset return
16.
int 21h
17.
18.
XOR CX,CX
19.
MOV CL,CHAINE[1]

;
; Affichage de retour chariot
;

; La longeur de la chaine dans CL

15

20.
boucle:
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CODE ENDS
31. END MAIN

MOV SI,CX
ADD SI,1
MOV DL,CHAINE[SI]
MOV AH, 2
INT 21H
LOOP boucle

;
;
; Afficher carcatre par caractre
; en commencant par le dernier (Longeur-- + 1)
;
;

MOV AH, 4CH


INT 21H

6 - Lire un caractre au clavier et tester si son code ASCII est celui d'un chiffre. Si c'est
le cas, ranger ce chiffre (et non son code ASCII) dans N1, sinon afficher "N".
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.

DATA SEGMENT
N1 DB ?
DATA ENDS
CODE SEGMENT
MAIN:
MOV AH, 1
INT 21H
CMP AL, "0"
JB nonchiffre

; Si le contenu de al<"0" : n'est pas un chiffre

CMP AL,"9"
JA nonchiffre

; Si le contenu de al>"9" : n'est pas un chiffre

SUB AL,"0"
MOV N1, AL
JMP FIN

; Sinon on fait la soustraction par "0"


; pour avoir le chiffre
;

nonchiffre: MOV DL, "N"


MOV AH, 2
INT 21H
Fin:

; Saisie du caractre

;
; Afficher
;

"N"

MOV AH, 4CH


INT 21H

CODE ENDS
END MAIN

16

7 - Ecrire un programme qui lit un nombre dcimal au clavier et le sauvegarde dans N1.
La lecture s'arrte quand le caractre lu n'est pas un chiffre.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.

DATA SEGMENT
N1 DB 0
DATA ENDS
CODE SEGMENT
MAIN:
MOV AX, DATA
MOV DI, AX

WHILE:

MOV DI, OFFSET N1


MOV AH, 1
INT 21H
CMP AL, "0"
JB EXIT

; Comparer AL avec 0
; Quitter le programme si AL<0

CMP AL,"9"
JA EXIT

; Quitter le programme si AL>9

MOV N1, AL
JMP WHILE

; Charger N1 avec AL

EXIT:

MOV AH, 4CH


INT 21H
CODE ENDS
END MAIN

Conclusion : Nous avons identifi avec les instructions de lecture et dcriture des
chaines de caractres.

17

Programme 04 Lheure et la date courante avec les procdures :


Objectif : Dans cet exercice, on dsire afficher la date et lheure courante de notre PC.
Pour ce faire, on fait appel linterruption 21H :

Lecture de lheure :
La fonction 2CH (charge dans AH) de linterruption 21H lit lheure courante, telle
quelle est stocke dans lordinateur.
Au retour de lappel, les registres contiennent les informations suivantes :
CH : heures
CL : minutes
DH : secondes
DL : centimes de secondes

Lecture de la date :
La fonction 2AH (charge dans AH) de linterruption 21H lit la date courante, telle
quelle est stocke dans lordinateur.
Au retour de lappel, les registres contiennent les informations suivantes :
AL : Le jour de la semaine cod (0 : dimanche, 1 : lundi, ...)
CX : Lanne
DH : Le mois
DL : Le jour

Laffichage de linformation :
Une procdure aff_str pour afficher la chaine de caractres dont loffset
se trouve dans le registre AX, dans le segment courant.
Une procdure aff_nb pour afficher la valeur du nombre dont le code en
hexadcimal se trouvant dans les registres (CH, CL, DH, DL).
Une procdure aff_jour
Une procdure aff_mois
Une procdure aff_annee

Mthode de rsolution : Il suffit de lire lheure courante ou la date via linterruption 21H
et dafficher le contenu des registres dune manire comprhensible pour un tre humain
sous la forme :

Bonjour
Lheure de votre PC est : 11h 20mn 45s 32c.
La date de votre PC est : Mardi 13 Fvrier 2016
Et pour chaque registre qui contient linformation on fait la division par 10 pour
lafficher.

18

1.
2.
3.
4.
5.
6.
7.
8.

9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.

pile

segment para stack use16


db
256 dup (?)
pile ends
DATA
SEGMENT
MSG db "Bonjour !",10,13,"L'heure de votre PC est : ","$";
MSG2 db 10,13,"La date de votre PC est : ","$";
mois db "Janvier$$$","Fevrier$$$","Mars$$$$$$","Avril$$$$$", "Mai$$$$$$$","Jui$
$$$$$$","Juillet$$$","Aout$$$$$$", "Septembre$$","Octobre$$$","Novembre$$","Decembr
e$$"
semaine db "Dimanche$","Lundi$$$$","Mardi$$$$","Mercredi$", "Jeudi$$$$","Vendre
di$","Samedi$$$$"
diz db ?
unit db ?
ch2 db "h ","$"
ch3 db "m ","$"
ch4 db "s ","$"
ch5 db "c.","$"
r1 db ?
espace db " $"
DATA ends
CODE
SEGMENT
Main:
MOV AX,DATA
MOV ds,AX
MOV DX,OFFSET MSG
CALL aff_str
MOV AH,2CH
INT 21H

; Lecture de lheure

XOR AX,AX
MOV AL,CH
CALL aff_nb

; Affichage des heures

MOV DX,OFFSET ch2


CALL aff_str
MOV AL,CL
CALL aff_nb

; Affichage des minutes

MOV DX,OFFSET ch3


CALL aff_str
MOV AL,DH
CALL aff_nb

; Affichage des secondes

MOV DX,OFFSET ch4


CALL aff_str
MOV AL,DL
CALL aff_nb

; Affichage des centimes

MOV DX,OFFSET ch5


CALL aff_str
MOV DX,OFFSET MSG2
CALL aff_str
MOV AH,2AH
INT 21H

; Lecture de la date

19

61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.

call aff_jour

; Affichage du jour de la semaine

MOV AL,DL
CALL aff_nb

; Affichage du jour

call aff_mois

; Affichage du mois

call aff_annee

; Affichage de lanne

MOV AH,4CH
INT 21H
; Procdure qui permet dafficher lanne
aff_annee
PROC near
PUSH DX
PUSH AX
PUSH CX
MOV AH,0
MOV AX,CX
MOV BL,100
DIV BL
MOV r1,AH
call aff_nb
MOV AL,r1
call aff_nb
POP CX
POP AX
POP DX
RET
aff_annee
ENDP
; Procdure qui permet dafficher le jour
aff_jour
PROC near
PUSH DX
PUSH AX
PUSH CX
MOV AH,0
LEA BX,semaine
mov cl,9
mul cl
add bx,ax
mov cx,si
Lea DX,BX
call aff_str
MOV DX,OFFSET espace
CALL aff_str
POP CX
POP AX
POP dX
RET
aff_jour
ENDP
; Procdure qui permet dafficher le mois
aff_mois
PROC near
PUSH DX
PUSH AX
PUSH CX
MOV DX,OFFSET espace
CALL aff_str
MOV AH,0
LEA BX,mois
mov al,dh
mov cl,10

20

124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172. END

aff_mois

mul cl
add bx,ax
mov cx,si
Lea DX,BX
call aff_str
MOV DX,OFFSET espace
CALL aff_str
POP CX
POP AX
POP dX
RET
ENDP

; Procdure qui permet dafficher un nombre


aff_nb
PROC NEAR
PUSH DX
PUSH AX
XOR AH,AH
MOV BL,10
DIV BL
MOV diz,AL
MOV unit,AH
MOV
ADD
MOV
INT

DL,diz
DL,48
AH,2
21H

MOV
ADD
MOV
INT

DL,unit
DL,48
AH,2
21H

POP AX
POP DX
RET
aff_nb
ENDP
; Procdure qui permet dafficher une chaine
aff_str
PROC NEAR
PUSH AX
MOV AH,9
INT 21H
POP AX
RET
aff_str
ENDP
CODE ENDS
Main

Conclusion : Il Dans cet exercices on a dcompos notre problme en sous problmes,


chacun des sous problme est trait dans une procdure ce qui montre limportance de
cette notion au niveau de la programmation.

21