Beruflich Dokumente
Kultur Dokumente
Compte Rendu
TP - Assembleur i8086
(Sous EMU8086)
Par :
Enseignant :
EL OUFIR EL MEHDI
Professeur A.RAIHANI
Sommaire :
Objectif ......................................................................................................................................................... 5
Solution ........................................................................................................................................................ 5
Conclusion.................................................................................................................................................... 8
Objectif ......................................................................................................................................................... 9
Solution ........................................................................................................................................................ 9
Conclusion.................................................................................................................................................. 12
Objectif ....................................................................................................................................................... 13
Solution ...................................................................................................................................................... 13
Conclusion.................................................................................................................................................. 17
Objectif ....................................................................................................................................................... 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 .
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.
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.
Rapport
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
MOV AH,2
INT 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
DATA
SEGMENT
nb1 db 90
nb2 db 12
sum db ?
diz db ?
unit db ?
DATA ends
CODE
SEGMENT
Main:
MOV AX,DATA
MOV ds,AX
; Dfinition
; du Data segment
XOR AX,AX
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
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
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
MOV AH,4CH
INT 21H
CODE ENDS
END Main
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
DL,44
AH,2
21H
AL,[BX]
AL,[SI]
[DI],AL
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
DL,AL
DL,48
AH,2
21H
JMP 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
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
Afficher un caractre ;
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
; Lecture du caractre
; Via linterruption 21H
AL
2
;
; Affichage du caractre
; Via linterruption 21H
4CH
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
;
14
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
;
; Affichage de retour chariot
;
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)
;
;
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
CMP AL,"9"
JA nonchiffre
SUB AL,"0"
MOV N1, AL
JMP FIN
; Saisie du caractre
;
; Afficher
;
"N"
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:
; Comparer AL avec 0
; Quitter le programme si AL<0
CMP AL,"9"
JA EXIT
MOV N1, AL
JMP WHILE
; Charger N1 avec AL
EXIT:
Conclusion : Nous avons identifi avec les instructions de lecture et dcriture des
chaines de caractres.
17
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
; Lecture de lheure
XOR AX,AX
MOV AL,CH
CALL aff_nb
; 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
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
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
21