Vous êtes sur la page 1sur 15

CORRECTION TP04- 05:Architecture des ordinateurs

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

CORRECTION TP04- 05:Architecture des ordinateurs

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 (?)

Dclaration des variables de type "caractres".


L'instruction DB est aussi utilise pour dfinir des chanes de caractres. Une chane de caractres doit se trouver entre apostrophes; si elle est destine l'affichage (sur l'cran), elle devra tre termine par le signe '$'. Si on souhaite dfinir une variable initialise avec la lettre 'A', on crira:
LETTRE LETTRE LETTRE DB DB DB 65 041h 'A'

ou ou

Remarque : On peut dfinir une phrase:


PHRASE DB 'CELA DEFINIT UNE PHRASE'

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,...

Initialisation de data segment


Assume ds:data
2010-2011

TP 05

2|15

CORRECTION TP04- 05:Architecture des ordinateurs

Niveau : 1

E.S.T.I

mov ax, data mov ds,ax

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)

Initialisation de data segment Assume ds:data

mov ax, data mov ds,ax

Dclaration d'une pile


Pile SEGMENT STACK DW 80DUP( ?) PILE ENDS ; Le DOS construit automatiquement une pile dans le segment STACK on rserve ici 80 mots

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

CORRECTION TP04- 05:Architecture des ordinateurs

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.

Dclaration d'une procdure


Etant donn qu'une procdure est une suite d'instructions, il s'agit de regrouper les instructions composant la procdure entre des mots cls. L'ensemble de cette manipulation est appele dclaration de procdure. Ces mots cls permettant la dclaration de la procdure sont une tiquette (qui reprsente le nom de la fonction) prcdant le mot cl PROC marquant le dbut de la procdure, suivi de near (qui signale que la procdure est situe dans le mme segment que le programme appelant) et RET dsignant la dernire instruction, et enfin le mot cl ENDP qui annonce la fin de la procdure. Ainsi une dclaration de procdure ressemble ceci : tiquette PROC instruction1 instruction2 ... RET tiquette ENDP near

TP 05

2010-2011

4|15

CORRECTION TP04- 05:Architecture des ordinateurs

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

Effet Titre du programme Dclaration des donnes

Rsultats Ltat du registre flag ............

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:....

Ltat du registre flag ............

TP 05

2010-2011

5|15

CORRECTION TP04- 05:Architecture des ordinateurs

Niveau : 1

E.S.T.I

Exercice n 1 : Stockage en mmoire dun message et affichage sur lcran


On se propose dcrire lorganigramme et le programme permettant dafficher le message suivant sur lcran BONJOUR selon les deux cas suivants :

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

CORRECTION TP04- 05:Architecture des ordinateurs

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

Exercice n2 : Acquisition des caractres du clavier en mmoire


Ecrire le programme permettant de lire les caractres dun clavier et de les mettre dans un buffer en mmoire dans le segment de donne. Lacquisition continue jusqu ce que loprateur appuie sur RETURN ou fasse entrer 30 touches. Ce programme devra retourner ladresse de dpart du buffer en BX et le nombre de caractres en CX. Seulement BX et CX seront affects. Vrifier avec DEBUG. NB : LE CODE ASCII DE LA TOUCHE ENTREE EST : 13 OU 0Dh

TP 05

2010-2011

7|15

CORRECTION TP04- 05:Architecture des ordinateurs

Niveau : 1

E.S.T.I

organigramme

Programme en assembleur

DEBUT

Data segment BUFFER DB 30 DUP (?)

Declaration BUFFER Initialisation DS

Data ends Code segment Assume cs:code, ds:data

BX OFFSET BUFFER CX 0

Main : Mov ax,data

BOUCLE :

Mov ds,ax Mov bx,offset BUFFER ; initialisation de BX (mov BX, 0) Mov CX,0

Lecture clavier function (01) CX CX+1 SI NON CX= ?30 JZ FIN

Boucle : Mov AH,01 Int 21h

INC CX CMP CX ,30 JE FIN

AL= ?13

CMP AL ,13 JNZ boucle FIN: mov bx,cx

JNZ BOUCLE BX CX

FIN :

Mov cx,30-cx Mov ah,4ch Int 21h

CX30- CX

Code ends End main

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

CORRECTION TP04- 05:Architecture des ordinateurs

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

Declaration TAB1 Declaration TAB2

TAB2 db 4 dup (?) Data ends Code segment Assume cs:code, ds:data

Initialisation DS SI 0 Cx 4 Lecture clavier function (01) TAB 2[SI] AL

Main : Mov ax,data Mov ds,ax

Boucle:

Mov si,0 Mov cx,4 Boucle : Mov AH,01 Int 21h Mov TAB2[SI], AL

Affichage function (02)

Mov DL, TAB2[SI] Mov ah,02 Int 21h

SI SI+1

Inc si

SI= ?cx

sinon
JNZ boucle

Cmp cx,si JNZ boucle Mov ah,4ch

fin

Int 21h Code ends End main

TP 05

2010-2011

9|15

CORRECTION TP04- 05:Architecture des ordinateurs

Niveau : 1

E.S.T.I

b)
debut

b)
Data segment TAB1 db 4,7,3,6
Declaration TAB1,TAB2 Initialisation DS

TAB2 db 1,5,2,8 Data ends Code segment

DI 3 SI 0 Cx 4 Al TAB1[SI] TAB 2[SI] AL

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

Exercice 2: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. 1. crire alors le programme permettant de : a- Faire laffichage de la table TAB1 en utilisant la fonction 02 de linterruption 21.

TP 05

2010-2011

10 | 1 5

CORRECTION TP04- 05:Architecture des ordinateurs

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

Code segment Assume cs:code, ds:data

Initialisation DS SI 0 CX 4 DL TAB1 [SI] Boucle:

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]

Affichage de DL (fonction 02)

Mov ah,02 Int 21h

SI Si+1

Inc si Cmp cx,si

SI=? CX JNZ boucle JZ fin Fin: fin

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

CORRECTION TP04- 05:Architecture des ordinateurs

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

AX< TAB1 [SI] JL boucle AX TAB1 [SI]

Mov cx,4 Mov AL, TAB1[si]


Boucle: Inc si CMP si,cx JZ fin CMP AL,TAB1[si]

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

CORRECTION TP04- 05:Architecture des ordinateurs

Niveau : 1

E.S.T.I

Exercice 3: 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 . a- Trouver le maximum de TAB1 et le mettre dans BX. b- Afficher le maximum sous la forme : LE MAX EST : 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 dw 4,7,3,6 Msg db LE MAX EST :$

Declaration TAB1 Declaration Msg

Data ends Code segment Assume cs:code, ds:data Main : Mov ax,data

Initialisation DS SI 0 Bx 0 CX4 BL TAB1 [SI] Boucle: SI SI+1 JZ fin SI= ?cx

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

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

Mov dl,Bl Mov ah,02 Int 21h

Affichage de BX par 02

Mov ah,4ch Int 21h

fin

Code ends End main

TP 05

2010-2011

13 | 1 5

CORRECTION TP04- 05:Architecture des ordinateurs

Niveau : 1

E.S.T.I

Le code ASCII

TP 05

2010-2011

14 | 1 5

CORRECTION TP04- 05:Architecture des ordinateurs

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

MOV AH,04 INT 21H

Ecriture dun caractre contenue dans DL sur le port srie auxiliaire RS 232

AH,DL

MOV AH,05 INT 21H

Ecriture dun caractre contenue dans DL sur le port dimprimante

AH,DL

MOV AH,06 INT 21H

Lecture et criture combine sur clavier cran

AH

AL

MOV AH,07 INT 21H

Lecture directe au clavier sans cho. Le caractre est range dans 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

Lecture du caractre entre au clavier sans cho et le range dans AL

AH,DX

Envoi dun message sur lcran

0AH

AH,DX

Lecture dun message entier au clavier

TP 05

2010-2011

15 | 1 5