correction tp4!5!2011 new(1)
TRANSCRIPT
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 1/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
1 | 1 5
TP n° :4-5
RAPPEL
PARTIE 1 : Déclaration des données utilisées au cours d ’un programme
Data SEGMENT
………………………………………. ; Généralement toutes les variables se trouvent dans ce segment de données Data
ENDS
Pour chaque variable, il faut spécifier:- son nom- sa taille (pseudo-instruction)
- son contenu initial éventuel
TITLE ………………………………. ; titre du programme
PARTIE 1 : Déclaration des données utilisées au cours du programme
Data SEGMENT
………………………………………. ; Généralement toutes les variables se trouvent dans ce
segment de données appelé Data.
Data ENDS
PARTIE 2 : Déclaration de la pile
Pile SEGMENT STACK
DW 80DUP( ?) ; Le DOS construit automatiquement une pile dans le segment STACK on
réserve ici 80 mots
PILE ENDS
PARTIE 3 : Le programme
CODE SEGMENT
ASSUME CS :CODE, DS :DATA, ES :nothing ;dit à l’assembleur vers quel segment on désire que le
registre segment pointe
Main :
; initialiser les registres de segments (sauf CS )
;ecrire le code du programme
MOV AH, 4CH ; fonction standard sert au retour au DOS
INT 21h
CODE ENDS
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 2/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
2 | 1 5
1°/Le nom
- ne peut contenir que des lettres ou des chiffres (et "_")- doit commencer par une lettre- doit avoir une taille de 8 caractères maximum
2°/La taille : les pseudo-instructions
DB: DECLARE BYTE (1 byte)
DW : DECLARE WORD (2 bytes)
DD : DECLARE DOUBLE (4 bytes)
3°/La valeur initiale éventuel
Éventuel car on n’est pas obligé d'initialiser une valeur. Dans ce cas on met un "?".
Exemple:
AGE DB ? : Nom(AGE), taille (DB), valeur initiale (?)
Déclaration des variables de type "caractères".
L'instruction DB est aussi utilisée pour définir des chaînes de caractères.Une chaîne de caractères doit se trouver entre apostrophes;si elle est destinée à l'affichage (sur l'écran), elle devra être terminée par le signe '$'.
Si on souhaite définir une variable initialisée avec la lettre 'A', on écrira:
LETTRE DB 65
ou LETTRE DB 041h
ou LETTRE DB 'A'
Remarque :
On peut définir une phrase:
PHRASE DB 'CELA DEFINIT UNE PHRASE'
Qui déclare 23 bytes en mémoire, initialisés par les lettres de la phrase. (Espaces compris)
En mémoire, on trouvera donc
C,E,L,A, ,D,E,F,I,N,I,...
ou 67,69,76,65,32,68,69,70,73,78,73,...
ou 043h,045h,04Ch,041h,020h,044h,045h,046h,049h,04Eh,049h,...
Initialisation de data segment
Assume ds:data
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 3/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
3 | 1 5
mov ax, data
mov ds,ax
Les tableaux.
Il est également possible d'utiliser, conjointement avec les pseudo-instructions de déclarationde variables, la pseudo-instruction DUP. Ce DUP indique à l'assembleur qu'il faut répéter(dupliquer) plusieurs fois l'opération qui le précède.
Exemples:
* Déclaration d'un tableau de 10 octets initialisés à 0 :
tab1 db 10 dup (0)
* Déclaration d'un tableau de 5 doubles mots initialisés respectivement à
0, 1, 2, 3 et 4 :
tab2 dd 5 dup (0, 1, 2, 3, 4)
* Déclaration d'un tableau de 100 mots non initialisés :
tab3 dw 100 dup (?)
* Les deux pseudo-instructions suivantes sont équivalentes :
tab4 dw 512,97,0,3,7tab4 dw 5 dup (512,97,0,3,7)
Initialisation de data segment
Assume ds:data
mov ax, data
mov ds,ax
Déclaration d'une pile
Pour utiliser une pile en assembleur, il faut déclarer un segment de pile, et y réserver unespace suffisant. Ensuite, il est nécessaire d'initialiser les registres SS et SP pour pointer sousle sommet de la pile.
Voici la déclaration d'une pile de 200 octets :
pile SEGMENT stack ; mot clef stack car pile
DW 100 dup (?) ; reserve espacepile ENDS
Pile SEGMENT STACK
DW 80DUP( ?) ; Le DOS construit automatiquement une pile dans le segment STACK on réserve ici 80 mots
PILE ENDS
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 4/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
4 | 1 5
Noter le mot clef ``stack '' après la directive SEGMENT, qui indique à l'assembleur qu'il s'agitd'un segment de pile.
(voir figure ).
Figure 3.4: Une pile vide. L'étiquette base-pile repère la base de la pile, valeur initiale de SP.
Après les déclarations ci-dessus, on utilisera la séquence d'initialisation :ASSUME SS:PILE
MOV AX, PILE
MOV SS, AX ; init Stack Segment
Noter que le registre SS s'initialise de façon similaire au registre DS; par contre, on peutaccéder directement au registre SP.
Déclaration d'une procédure
Etant donné qu'une procédure est une suite d'instructions, il s'agit de regrouper les instructionscomposant la procédure entre des mots clés. L'ensemble de cette manipulation estappelée déclaration de procédure.Ces mots clés permettant la déclaration de la procédure sont une étiquette (qui représente lenom de la fonction) précédant le mot clé PROC marquant le début de la procédure, suivide near (qui signale que la procédure est située dans le même segment que le programmeappelant) et RET désignant la dernière instruction, et enfin le mot clé ENDP qui annonce lafin de la procédure. Ainsi une déclaration de procédure ressemble à ceci :
étiquette PROC near
instruction1
instruction2
...
RET
étiquette ENDP
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 5/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
5 | 1 5
Appel d’une procédure : C’est l'instruction CALL qui permet l'appel d'une procédure. Elleest suivie soit d'une adresse 16 bits, désignant la position du début de la procédure, ou bien dunom de la procédure (celui de l'étiquette qui précède le mot clé PROC).
Exemple :
Exemple en assembleur Effet Résultats
; Programme
DATA SEGMENT
SOM DW 5 DUP (?)
VAR DB 2 DUP (?)
DATA ENDS
pile SEGMENT stack
DW 100 dup (?)
pile ENDS
Code segment
Assume cs :code,
DS :DATA, SS:PILE
Main :
MOV AX,DATA
MOV DS,AXMOV AX, PILE
MOV SS, AX
MOV AX,9
MOV BX,4
PUSH AX
PUSH BXCall Somme
POP BX
POP AX
MOV AH,4CH
INT 21H
Somme Proc near
ADD AX,BXMOV SOM,AX
MOV VAR,BL
RET
SOMME ENDP
CODE ENDS
END Main
Titre du programme
Déclaration des données
Déclaration de la pile
Corps du programme
Déclaration du segment des
données
Initialisation de la pile
AX <- 9
BX <- 4
…………………………………………… ……………………………………………
……………………………………………
……………………………………………
……………………………………………
……………………………………………
……………………………………………
……………………………………………
……………………………………………
……………………………………………
L’état du registre flag
………………………………............
AX:…….…., BX:…..….…, SP:……..…..
AX:…..…..., BX:…………, SP:..………..
AX:…….…., BX:…..….…, SP:……..…..
AX:…..…..., BX:…………, SP:..………..
AX:…….…., BX:…..….…, SP:……..….
.
AX:…..…..., BX:…………, SP:..………..
AX:…….…., BX:…..….…, SP:……..…..
AX:…..…..., BX:…………, SP:..………..
AX:…….…., BX:…..….…, SP:……..…..
AX:…..…..., BX:…………, SP:..………..
AX:…….…., BX:…..….…, SP:……..…..
L’état du registre flag
………………………………............
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 6/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
6 | 1 5
Exercice n° 1 : Stockage en mémoire d’un message et affichage sur l’écran
On se propose d’écrire l’organigramme et le programme permettant d’afficher le message suivant
sur l’écran « BONJOUR » selon les deux cas suivants :
a) Affi chage d’une chaine de caractère : Réserver dans le segment de donnée une chaine de
caractère « Message » initialisée par ‘BONJOUR$’.
Faire appel à la fonction 09H de l’interruption 21 du DOS (09H en AH, La chaine des caractères à
afficher en DX).
NB : Affichage d’une chaine de caractère décalée dans le segment de donnée(DS) et se
termine par $.
organigramme Programme en assembleur
Data segment
Message db ‘BONJOUR$’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax, data
Mov DS,ax
Mov DX, offset Message
Mov ah ,09
Int 21h
Mov ah,4ch
Int 21h
Code segment
End main
b) Affichage d’un seul caractère : Réserver dans le segment de donnée une chaine de caractère
« Message » initialisée par ‘BONJOUR’.
Faire appel à la fonction 06H de l’interruption 21 du DOS (06H en AH, le code du caractère à afficher
en DL).utiliser CX en compteur des caractères et BX en pointeur d’adresse vers les caractères.
debut
Déclaration Message
Initialisation DS
DX offset Message
Affichage Message fonction( 09)
fin
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 7/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
7 | 1 5
organigramme Programme en assembleur
Data segment
Message db ‘BONJOUR’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax, data
Mov DS,ax
Mov BX,0
Mov CX,7
Boucle: Mov DL, Message[BX]
Mov ah ,02
Int 21h
Inc BX
CMP BX,CX
JNZ boucle
Mov ah,4ch
Int 21h
Code segment
End main
Exercice n°2 : Acquisition des caractères du clavier en mémoire
Ecrire le programme permettant de lire les caractères d’un clavier et de les mettre dans un
buffer en mémoire dans le segment de donnée. L’acquisition continue jusqu’à ce que
l’opérateur appuie sur RETURN ou fasse entrer 30 touches.
Ce programme devra retourner l’adresse de départ du buffer en BX et le nombre de
caractères en CX. Seulement BX et CX seront affectés. Vérifier avec DEBUG.
NB : LE CODE ASCII DE LA TOUCHE ENTREE EST : 13 OU 0Dh
debut
Déclaration Message
Initialisation DS
DL Message[BX]
Affichage Message fonction( 02)
fin
BX 0
CX7
BX BX+1
BX= ?cx
Jnz boucle
Boucle:
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 8/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
8 | 1 5
organigramme Programme en assembleur
Data segment
BUFFER DB 30 DUP (?)
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov bx,offset BUFFER ; initialisation de BX (mov BX, 0)
Mov CX,0
Boucle : Mov AH,01
Int 21h
INC CX
CMP CX ,30
JE FIN
CMP AL ,13
JNZ boucle
FIN: mov bx,cx
Mov cx,30-cx
Mov ah,4ch
Int 21h
Code ends
End main
Exercice 1:
En utilisant la structure générale d’un programme assembleur de type.EXE, définir dans le
segment de donnée une table d’octets ‘TAB1’ initialisée avec les valeurs : 4, 7, 3 et 6 et
réserver quatre octets pour ‘TAB2 ‘.
1. Écrire alors le programme permettant de :
a- Remplir la table TAB2 par les valeurs suivante : 1,5 ,2 ,8 en utilisant la fonction
lecture de clavier 01 de l’interruption 21 puis faire l’affichage en utilisant la fonction
02 de l’interruption 21.
Declaration BUFFER
BXOFFSET BUFFER
CX 0
CX CX+1
fin
JNZ BOUCLE
Lecture clavier function (01)
CX= ?30
Initialisation DS
BX CX
DEBUT
AL= ?13
CX30- CX
BOUCLE :
SI NON JZ FIN
FIN :
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 9/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
9 | 1 5
b- Recopier en ordre inverse la table ‘TAB1’ en table ‘TAB2’.
Vérifier le résultat à l’aide du DEBUG, expliquer votre démarche en donnant
l’organigramme et le programme en assembleur.
Organigramme Programme en assembleur
a)
sinon
a) Data segment
TAB1 db ’ 4’,’7’,’3’,’6’
TAB2 db 4 dup (?)
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov si,0
Mov cx,4
Boucle : Mov AH,01
Int 21h
Mov TAB2[SI], AL
Mov DL, TAB2[SI]
Mov ah,02
Int 21h
Inc si
Cmp cx,si
JNZ boucle
Mov ah,4ch
Int 21h
Code ends
End main
Declaration TAB1
Initialisation DS
SI 0
Cx4
TAB 2[SI] AL
fin
JNZ boucle
Boucle:
Lecture clavier function 01
Affichage function (02)
SI= ?cx
Declaration TAB2
debut
SI SI+1
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 10/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
10 | 1 5
Exercice 2:En utilisant la structure générale d’un programme assembleur de type.EXE,
définir dans le segment de donnée une table d’octets ‘TAB1’ initialisée avec les valeurs : 4,7, 3 et 6.
1. Écrire alors le programme permettant de :
a- Faire l’affichage de la table TAB1 en utilisant la fonction 02 de l’interruption 21.
b) b)
Data segment
TAB1 db ’ 4’,’7’,’3’,’6’
TAB2 db ’ 1’,’5’,’2’,’8’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov si,0
Mov DI,3
Mov cx,4
Boucle : Mov AL,TAB1[SI]
Mov TAB2[DI],AL ; AL registre intermédiaire pour l’affectation
Mov DL,TAB2[SI]
Mov ah,02
Int 21h
INC SI
DEC DI
Loop boucle
Mov SI,0
BOUCLE1: Mov DL,TAB2[SI]
Mov ah,02
Int 21h
Inc SI
CMP SI,4
Jnz BOUCLE1
Mov ah,4ch
Int 21h
Code ends
End main
Declaration TAB1 TAB2
DI 3
SI 0
Cx4
TAB 2[SI] AL
fin
JNZ
boucle
Boucle:
Al TAB1[SI]
Affichage function (02)
CX= ?0
Initialisation DS
SI SI+1
DI DI-1
DLTAB 2[SI]
debut
SI 0
SI=4
SI SI+1
JNZ BOUCLE1
BOUCLE1
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 11/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
11 | 1 5
b- Trouver le minimum de ‘TAB1’ et le mettre dans AX.
Vérifier le résultat à l’aide du DEBUG, expliquer votre démarche en donnant
l’organigramme et le programme en assembleur.
organigramme Programme en assembleur
a) Data segment
TAB1 db ’ 4’,’7’,’3’,’6’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov si,0 ; SI pour parcourir le TAB1
Mov cx,4 ; nbre de cases de TAB1
Boucle : Mov dl,TAB1[si]
Mov ah,02
Int 21h
Inc si
Cmp cx,si
JNE boucle
Mov ah,4ch
Int 21h
Code ends
End main
------------------------------------------------------------------------------
------------------------------------------------------------------------------
b)
Data segment
TAB1 dw ‘4’,’7’,’3’,’6’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov si,0
Mov AX, 0; initialiser AX à 0
Mov cx, 4
Mov AX, TAB1[si] ; AX <- TAB1[0]
debut
Declaration TAB1
Initialisation DS
SI 0
CX4
DL TAB1 [SI]
Affichage de DL (fonction 02)
SI Si+1
SI=? CX
fin
JZ fin
JNZ boucle
Boucle:
Fin:
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 12/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
12 | 1 5
b)
Boucle: Inc si
CMP si,cx
JE fin
CMP AX, TAB1[si]
JL boucle ; si AX< TAB1[si] reboucler
Mov AX, TAB1[si] ; le minimum est mis dans AX
JMP boucle
Mov dl,Al ; charger DL par la valeur min trouvée dans Al (m taille)
fin : Mov ah,02
Int 21h
Mov ah,4ch
Int 21h
Code ends
End main
b)
Data segment
TAB1 db ‘4’,’7’,’3’,’6’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov si,0
Mov AL,0
Mov cx,4
Mov AL, TAB1[si]
Boucle: Inc si
CMP si,cx
JZ fin
CMP AL,TAB1[si]
JL boucle
Mov AL, TAB1[si]
JMP boucle
Mov dl,Al
fin : Mov ah,02
Int 21h
Mov ah,4ch
Int 21h
Code ends
End main
debut
Declaration TAB1
Initialisation DS
SI 0
Ax0
AX TAB1 [SI]
AX< TAB1 [SI]
fin
JZ fin
JL boucle
Boucle:
Fin:
CX4
AX TAB1 [SI]
SI SI+1
SI=CX
JMP Boucle Affichage de AX par 02
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 13/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
13 | 1 5
Exercice 3: En utilisant la structure générale d’un programme assembleur de type.EXE,
définir dans le segment de donnée une table d’octets ‘TAB1’ initialisée avec les valeurs : 4,7, 3 et 6 .
a- Trouver le maximum de TAB1 et le mettre dans BX.
b- Afficher le maximum sous la forme : ‘LE MAX EST :’
Vérifier le résultat à l’aide du DEBUG, expliquer votre démarche en donnant
l’organigramme et le programme en assembleur.
Organigramme Programme en assembleur
a) Data segment
TAB1 dw ‘4’,’7’,’3’,’6’
Msg db ‘LE MAX EST :$’
Data ends
Code segment
Assume cs:code, ds:data
Main :
Mov ax,data
Mov ds,ax
Mov si,0
Mov BX,0
Mov cx,4
Mov BL, TAB1[si] ; bl <- TAB1[0]
Boucle: Inc si
CMP si,cx
JZ fin
CMP BL,TAB1[si]
JG boucle ; si bl > TAB1[si] reboucler et trouver le max
Mov BL, TAB1[si] ; bl <- le max de TAB1[si]
JMP boucle
fin : Mov DX, offset Msg ; charger dx par le msg (lea dx, msg)
Mov ah ,09
Int 21h
Mov dl,Bl
Mov ah,02
Int 21h
Mov ah,4ch
Int 21h
Code ends
End main
debut
Declaration TAB1
Initialisation DS
SI 0
Bx0
BL TAB1 [SI]
BL> TAB1 [SI]
fin
JZ fin
JG boucle
Boucle:
Fin:
CX4
BL TAB1 [SI]
SI SI+1
SI= ?cx
JMP Boucle
Affichage de Msg par 09
Affichage de BX par 02
Declaration Ms
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 14/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
14 | 1 5
Le code ASCII
8/3/2019 Correction TP4!5!2011 New(1)
http://slidepdf.com/reader/full/correction-tp452011-new1 15/15
CORRECTION TP04- 05:Architecture des ordinateurs Niveau : 1 E.S.T.I
TP 05 2010-2011
15 | 1 5
Interruption 21H
Fonction Parametre
d’entree
Parametre
de sortie
Syntaxe Fonction
1 AH ALMOV AH,01
INT 21H
Lecture du caractère entre au clavier
avec écho et le range dans AL
2 AH,DLMOV AH,02
INT 21H
Affichage du caractère contenu dans le
registre DL sur l’écran
3 AH ALMOV AH,03
INT 21H
Lecture d’un caractère sur le port série
auxiliaire RS 232 et le range dans AL
4 AH,DLMOV AH,04
INT 21H
Ecriture d’un caractère contenue dans DL
sur le port série auxiliaire RS 232
5 AH,DLMOV AH,05
INT 21H
Ecriture d’un caractère contenue dans DL
sur le port d’imprimante
6 AH,DLMOV AH,06
INT 21H
Lecture et écriture combine sur clavier
écran
7 AH ALMOV AH,07
INT 21H
Lecture directe au clavier sans écho. Le
caractère est range dans AL
8 AH ALMOV AH,08
INT 21H
Lecture du caractère entre au clavier sans
écho et le range dans AL
9 AH,DX
LEA DX,MESSAGE
(MOV DX,OFFSET
MESSAGE)MOV AH,09
INT 21H
Envoi d’un message sur l’écran
0AH AH,DXLEA DX,MESSAGE
MOV AH,0AH
INT 21H
Lecture d’un message entier au clavier