Correction TP4!5!2011 New
Correction TP4!5!2011 New
Correction TP4!5!2011 New
Niveau : 1
E.S.T.I
TP n :4-5
RAPPEL
TITLE . ; titre du programme
PARTIE 1 : Dclaration des donnes utilises au cours du programme Data SEGMENT . ; Gnralement toutes les variables se trouvent dans ce segment de donnes appel Data. Data ENDS PARTIE 2 : Dclaration de la pile Pile SEGMENT STACK DW 80DUP( ?) rserve ici 80 mots PILE ENDS PARTIE 3 : Le programme CODE SEGMENT ASSUME CS :CODE, DS :DATA, ES :nothing ;dit lassembleur vers quel segment on dsire que le registre segment pointe Main : ; initialiser les registres de segments (sauf CS ) ;ecrire le code du programme MOV AH, 4CH INT 21h CODE ENDS ; fonction standard sert au retour au DOS ; Le DOS construit automatiquement une pile dans le segment STACK on
PARTIE 1 : Dclaration des donnes utilises au cours dun programme END Main
Data SEGMENT . ; Gnralement toutes les variables se trouvent dans ce segment de donnes Data ENDS
Pour chaque variable, il faut spcifier: - son nom - sa taille (pseudo-instruction) - son contenu initial ventuel
TP 05
2010-2011
1|15
Niveau : 1
E.S.T.I
1/Le nom - ne peut contenir que des lettres ou des chiffres (et "_") - doit commencer par une lettre - doit avoir une taille de 8 caractres 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 nest pas oblig d'initialiser une valeur. Dans ce cas on met un "?". Exemple:
AGE DB ? : Nom(AGE), taille (DB), valeur initiale (?)
ou ou
Qui dclare 23 bytes en mmoire, initialiss par les lettres de la phrase. (Espaces compris) En mmoire, on trouvera donc
C,E,L,A, ,D,E,F,I,N,I,...
ou ou
67,69,76,65,32,68,69,70,73,78,73,... 043h,045h,04Ch,041h,020h,044h,045h,046h,049h,04Eh,049h,...
TP 05
2|15
Niveau : 1
E.S.T.I
Les tableaux.
Il est galement possible d'utiliser, conjointement avec les pseudo-instructions de dclaration de variables, la pseudo-instruction DUP. Ce DUP indique l'assembleur qu'il faut rpter (dupliquer) plusieurs fois l'opration qui le prcde. Exemples:
* Dclaration d'un tableau de 10 octets initialiss 0 : tab1 db 10 dup (0)
* Dclaration d'un tableau de 5 doubles mots initialiss respectivement 0, 1, 2, 3 et 4 : tab2 dd 5 dup (0, 1, 2, 3, 4)
* Dclaration d'un tableau de 100 mots non initialiss : tab3 dw 100 dup (?)
* Les deux pseudo-instructions suivantes sont quivalentes : tab4 tab4 dw dw 512,97,0,3,7 5 dup (512,97,0,3,7)
Pour utiliser une pile en assembleur, il faut dclarer un segment de pile, et y rserver un espace suffisant. Ensuite, il est ncessaire d'initialiser les registres SS et SP pour pointer sous le sommet de la pile. Voici la dclaration d'une pile de 200 octets :
pile SEGMENT stack ; mot clef stack car pile DW 100 dup (?) ; reserve espace pile ENDS
TP 05
2010-2011
3|15
Niveau : 1
E.S.T.I
Noter le mot clef ``stack '' aprs la directive SEGMENT, qui indique l'assembleur qu'il s'agit d'un segment de pile. (voir figure ).
Figure 3.4: Une pile vide. L'tiquette base-pile repre la base de la pile, valeur initiale de SP. Aprs les dclarations ci-dessus, on utilisera la squence d'initialisation : ASSUME SS:PILE MOV MOV AX, PILE SS, AX ; init Stack Segment
Noter que le registre SS s'initialise de faon similaire au registre DS; par contre, on peut accder directement au registre SP.
TP 05
2010-2011
4|15
Niveau : 1
E.S.T.I
Appel dune procdure : Cest l'instruction CALL qui permet l'appel d'une procdure. Elle est suivie soit d'une adresse 16 bits, dsignant la position du dbut de la procdure, ou bien du nom de la procdure (celui de l'tiquette qui prcde le mot cl PROC).
Exemple :
Exemple en assembleur ; Programme DATA SEGMENT SOM DW 5 DUP (?) VAR DB 2 DUP (?) DATA ENDS
pile SEGMENT DW 100 dup (?) pile ENDS stack
Dclaration de la pile
Code segment Assume cs :code, DS :DATA, SS:PILE Main : MOV AX,DATA MOV DS,AX
MOV MOV AX, PILE SS, AX
Corps du programme Dclaration du segment des donnes Initialisation de la pile AX:.., BX:..., SP:....
MOV AX,9 MOV BX,4 PUSH AX PUSH BX Call Somme POP BX POP AX
MOV AH,4CH INT 21H Somme Proc near ADD AX,BX MOV SOM,AX MOV VAR,BL RET SOMME ENDP CODE ENDS END Main
AX <- 9 BX <- 4
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:....
TP 05
2010-2011
5|15
Niveau : 1
E.S.T.I
a) Affichage dune chaine de caractre : Rserver dans le segment de donne une chaine de caractre Message initialise par BONJOUR$. Faire appel la fonction 09H de linterruption 21 du DOS (09H en AH, La chaine des caractres afficher en DX).
NB : Affichage dune chaine de caractre dcale dans le segment de donne(DS) et se termine par $. organigramme
Data segment debut Message db BONJOUR$ Data ends Dclaration Message Code segment Assume cs:code, ds:data Initialisation DS Main : Mov ax, data DX offset Message Mov DS,ax Mov DX, offset Message Affichage Message fonction( 09) Mov ah ,09 Int 21h Mov ah,4ch fin Int 21h Code segment End main
Programme en assembleur
b) Affichage dun seul caractre : Rserver dans le segment de donne une chaine de caractre Message initialise par BONJOUR. Faire appel la fonction 06H de linterruption 21 du DOS (06H en AH, le code du caractre afficher en DL).utiliser CX en compteur des caractres et BX en pointeur dadresse vers les caractres.
TP 05
2010-2011
6|15
Niveau : 1
E.S.T.I
organigramme
debut Data segment
Programme en assembleur
Message db BONJOUR Dclaration Message Data ends Code segment Initialisation DS Assume cs:code, ds:data Main : Mov ax, data BX 0 Mov DS,ax Mov BX,0 CX7 Boucle: Mov CX,7 Boucle: Mov DL, Message[BX] DL Message[BX] Mov ah ,02 Int 21h Affichage Message fonction( 02) Inc BX CMP BX,CX BX BX+1 Jnz boucle BX= ?cx JNZ boucle Mov ah,4ch Int 21h Code segment End main fin
TP 05
2010-2011
7|15
Niveau : 1
E.S.T.I
organigramme
Programme en assembleur
DEBUT
BX OFFSET BUFFER CX 0
BOUCLE :
Mov ds,ax Mov bx,offset BUFFER ; initialisation de BX (mov BX, 0) Mov CX,0
AL= ?13
JNZ BOUCLE BX CX
FIN :
CX30- CX
fin
Exercice 1:
En utilisant la structure gnrale dun programme assembleur de type.EXE, dfinir dans le segment de donne une table doctets TAB1 initialise avec les valeurs : 4, 7, 3 et 6 et rserver 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 linterruption 21 puis faire laffichage en utilisant la fonction 02 de linterruption 21.
TP 05
2010-2011
8|15
Niveau : 1
E.S.T.I
b- Recopier en ordre inverse la table TAB1 en table TAB2. Vrifier le rsultat laide du DEBUG, expliquer votre dmarche en donnant lorganigramme et le programme en assembleur. Organigramme a)
debut
Programme en assembleur
a) Data segment TAB1 db 4,7,3,6
TAB2 db 4 dup (?) Data ends Code segment Assume cs:code, ds:data
Boucle:
Mov si,0 Mov cx,4 Boucle : Mov AH,01 Int 21h Mov TAB2[SI], AL
SI SI+1
Inc si
SI= ?cx
sinon
JNZ boucle
fin
TP 05
2010-2011
9|15
Niveau : 1
E.S.T.I
b)
debut
b)
Data segment TAB1 db 4,7,3,6
Declaration TAB1,TAB2 Initialisation DS
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 intermdiaire pour laffectation Mov DL,TAB2[SI]
Boucle:
SI SI+1 DI DI-1 JNZ boucle CX= ?0 SI 0 DLTAB 2[SI] Affichage function (02) SI SI+1 SI=4 JNZ BOUCLE1 fin BOUCLE1
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
TP 05
2010-2011
10 | 1 5
Niveau : 1
E.S.T.I
b- Trouver le minimum de TAB1 et le mettre dans AX. Vrifier le rsultat laide du DEBUG, expliquer votre dmarche en donnant lorganigramme et le programme en assembleur. organigramme a)
debut
Programme en assembleur
Data segment TAB1 db 4,7,3,6 Data ends
Declaration TAB1
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]
SI Si+1
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]
TP 05
2010-2011
11 | 1 5
Niveau : 1
E.S.T.I
Boucle: Inc si CMP si,cx JE fin CMP AX, TAB1[si] JL boucle ; si AX< TAB1[si] reboucler
b)
debut
Mov AX, TAB1[si] ; le minimum est mis dans AX JMP boucle Mov dl,Al ; charger DL par la valeur min trouve dans Al (m taille)
Declaration TAB1 Initialisation DS SI 0 Ax 0 CX4 AX TAB1 [SI] Boucle: SI SI+1 JZ fin SI=CX
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
Fin:
Affichage de AX par 02
JMP Boucle
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
fin
TP 05
2010-2011
12 | 1 5
Niveau : 1
E.S.T.I
Programme en assembleur
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 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
BL> TAB1 [SI] JG boucle BL TAB1 [SI] Fin: JMP Boucle Affichage de Msg par 09
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
Affichage de BX par 02
fin
TP 05
2010-2011
13 | 1 5
Niveau : 1
E.S.T.I
Le code ASCII
TP 05
2010-2011
14 | 1 5
Niveau : 1
E.S.T.I
Interruption 21H
Fonction Parametre dentree Parametre de sortie Syntaxe Fonction
1 2
AH
AL
MOV AH,01 INT 21H MOV AH,02 INT 21H MOV AH,03 INT 21H
Lecture du caractre entre au clavier avec cho et le range dans AL Affichage du caractre contenu dans le registre DL sur lcran Lecture dun caractre sur le port srie auxiliaire RS 232 et le range dans AL
AH,DL
AH
AL
AH,DL
Ecriture dun caractre contenue dans DL sur le port srie auxiliaire RS 232
AH,DL
AH,DL
AH
AL
AH
AL
MOV AH,08 INT 21H LEA DX,MESSAGE (MOV DX,OFFSET MESSAGE) MOV AH,09 INT 21H LEA DX,MESSAGE MOV AH,0AH INT 21H
AH,DX
0AH
AH,DX
TP 05
2010-2011
15 | 1 5