TP N°: 4-5 - Programming in Assembly Language

1/15
100%

TP n° :4-5

RAPPEL

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

END Main

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

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

Publicité

É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

mov ax, data

mov ds,ax

Les tableaux.

Il est également possible d'utiliser, conjointement avec les pseudo-instructions de déclaration de 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 :

Publicité

tab3   dw   100   dup   (?)

\* Les deux pseudo-instructions suivantes sont équivalentes :

tab4   dw   512,97,0,3,7

tab4   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

Pile SEGMENT STACK

DW 80DUP( ?) ; Le DOS construit automatiquement une pile dans le segment STACK on réserve ici 80 mots

PILE ENDS

Pour utiliser une pile en assembleur, il faut déclarer un segment de pile, et y réserver un espace suffisant. Ensuite, il est nécessaire d'initialiser les registres SS et SP pour pointer sous le 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 espace

pile ENDS

Noter le mot clef ``stack '' après la directive SEGMENT, qui indique à l'assembleur qu'il s'agit d'un segment de pile.

(voir figure ).

| | | | |

| --- | --- | --- | --- |

| | | | | --- | | ![ps/basepile.png](data:image/png;base64...) | | |

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 peut accé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 instructions composant la procédure entre des mots clés. L'ensemble de cette manipulation est appelée déclaration de procédure.

Ces mots clés permettant la déclaration de la procédure sont une étiquette (qui représente le nom de la fonction) précédant le mot clé PROC marquant le début de la procédure, suivi de near (qui signale que la procédure est située dans le même segment que le programme appelant) et RET désignant la dernière instruction, et enfin le mot clé ENDP qui annonce la fin de la procédure. Ainsi une déclaration de procédure ressemble à ceci :

| | | |

| --- | --- | --- |

| étiquette | PROC | near |

| | instruction1 | |

| | instruction2 | |

| | ... | |

Publicité

| | RET | |

| étiquette | ENDP | |

Appel d’une procédure : C’est l'instruction CALL qui permet l'appel d'une procédure. Elle est suivie soit d'une adresse 16 bits, désignant la position du début de la procédure, ou bien du nom 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,AX MOV AX, PILE MOV SS, AX 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 | 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 ………………………………............ |

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 :

1. Affichage 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 |

| Déclaration Message Initialisation DS DX🡨 offset Message Affichage Message fonction( 09) | 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 |

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

| | |

| --- | --- |

| organigramme | Programme en assembleur |

| Déclaration Message Initialisation DS BX🡨 0 CX🡨7 Boucle: DL🡨 Message[BX] Affichage Message fonction( 02) BX🡨 BX+1 Jnz boucle BX= ?cx | 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

| | |

| --- | --- |

| organigramme | Programme en assembleur |

| Declaration BUFFER Initialisation DS BX🡨 OFFSET BUFFER BOUCLE : CX 🡨 0 Lecture clavier function (01) CX🡨 CX+1 JZ FIN SI NON CX= ?30 AL= ?13 JNZ BOUCLE FIN : BX🡨 CX CX🡨30- CX | 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.

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.

Publicité

| | |

| --- | --- |

| Organigramme | Programme en assembleur |

| a) Declaration TAB1 Declaration TAB2 Initialisation DS SI 🡨 0 Boucle: Cx 🡨4 Lecture clavier function (01) TAB 2[SI] 🡨 AL Affichage function (02) SI🡨 SI+1 sinon SI= ?cx JNZ boucle b) Declaration TAB1,TAB2 Initialisation DS DI🡨 3 SI 🡨 0 Boucle: Cx 🡨4 Al🡨 TAB1[SI] TAB 2[SI] 🡨 AL SI🡨 SI+1 JNZ boucle DI🡨 DI-1 CX= ?0 BOUCLE1 SI 🡨 0 DL🡨TAB 2[SI] Affichage function (02) SI 🡨 SI+1 SI=4 JNZ BOUCLE1 | 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 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 |

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- 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) Declaration TAB1 Initialisation DS SI 🡨 0 CX 🡨4 DL 🡨 TAB1 [SI] Affichage de DL (fonction 02) SI 🡨 Si+1 SI=? CX JZ fin JNZ boucle Boucle: Fin: b) Declaration TAB1 Initialisation DS SI 🡨 0 Ax 🡨0 CX🡨4 AX 🡨 TAB1 [SI] Boucle: SI 🡨 SI+1 JZ fin SI=CX AX< TAB1 [SI] JL boucle AX 🡨 TAB1 [SI] Affichage de AX par 02 JMP Boucle Fin: | 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] 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 |

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) Declaration TAB1 Declaration Msg Initialisation DS SI 🡨 0 Bx 🡨0 CX🡨4 BL 🡨 TAB1 [SI] Boucle: SI 🡨 SI+1 JZ fin SI= ?cx BL> TAB1 [SI] JG boucle Fin: BL 🡨 TAB1 [SI] JMP Boucle Affichage de Msg par 09 Affichage de BX par 02 | 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 |

![](data:image/x-emf;base64...)Le code ASCII

Interruption 21H

| | | | | |

| --- | --- | --- | --- | --- |

| Fonction | Parametre d’entree | Parametre de sortie | Syntaxe | Fonction |

| 1 | AH | AL | MOV AH,01 INT 21H | Lecture du caractère entre au clavier avec écho et le range dans AL |

| 2 | AH,DL | | MOV AH,02 INT 21H | Affichage du caractère contenu dans le registre DL sur l’écran |

| 3 | AH | AL | MOV AH,03 INT 21H | Lecture d’un caractère sur le port série auxiliaire RS 232 et le range dans AL |

| 4 | AH,DL | | MOV AH,04 INT 21H | Ecriture d’un caractère contenue dans DL sur le port série auxiliaire RS 232 |

| 5 | AH,DL | | MOV AH,05 INT 21H | Ecriture d’un caractère contenue dans DL sur le port d’imprimante |

| 6 | AH,DL | | MOV AH,06 INT 21H | Lecture et écriture combine sur clavier écran |

| 7 | AH | AL | MOV AH,07 INT 21H | Lecture directe au clavier sans écho. Le caractère est range dans AL |

| 8 | AH | AL | MOV 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,DX | | LEA DX,MESSAGE MOV AH,0AH INT 21H | Lecture d’un message entier au clavier |

TP N°: 4-5 - Programming in Assembly Language

Assembly Language and Low-Level Programming · notes

Browse all programmation documents

TP n° :4-5

RAPPEL

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

END Main

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

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

Advertisement

É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

mov ax, data

mov ds,ax

Les tableaux.

Il est également possible d'utiliser, conjointement avec les pseudo-instructions de déclaration de 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 :

Advertisement

tab3   dw   100   dup   (?)

\* Les deux pseudo-instructions suivantes sont équivalentes :

tab4   dw   512,97,0,3,7

tab4   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

Pile SEGMENT STACK

DW 80DUP( ?) ; Le DOS construit automatiquement une pile dans le segment STACK on réserve ici 80 mots

PILE ENDS

Pour utiliser une pile en assembleur, il faut déclarer un segment de pile, et y réserver un espace suffisant. Ensuite, il est nécessaire d'initialiser les registres SS et SP pour pointer sous le 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 espace

pile ENDS

Noter le mot clef ``stack '' après la directive SEGMENT, qui indique à l'assembleur qu'il s'agit d'un segment de pile.

(voir figure ).

| | | | |

| --- | --- | --- | --- |

| | | | | --- | | ![ps/basepile.png](data:image/png;base64...) | | |

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 peut accé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 instructions composant la procédure entre des mots clés. L'ensemble de cette manipulation est appelée déclaration de procédure.

Ces mots clés permettant la déclaration de la procédure sont une étiquette (qui représente le nom de la fonction) précédant le mot clé PROC marquant le début de la procédure, suivi de near (qui signale que la procédure est située dans le même segment que le programme appelant) et RET désignant la dernière instruction, et enfin le mot clé ENDP qui annonce la fin de la procédure. Ainsi une déclaration de procédure ressemble à ceci :

| | | |

| --- | --- | --- |

| étiquette | PROC | near |

| | instruction1 | |

| | instruction2 | |

| | ... | |

Advertisement

| | RET | |

| étiquette | ENDP | |

Appel d’une procédure : C’est l'instruction CALL qui permet l'appel d'une procédure. Elle est suivie soit d'une adresse 16 bits, désignant la position du début de la procédure, ou bien du nom 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,AX MOV AX, PILE MOV SS, AX 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 | 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 ………………………………............ |

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 :

1. Affichage 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 |

| Déclaration Message Initialisation DS DX🡨 offset Message Affichage Message fonction( 09) | 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 |

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

| | |

| --- | --- |

| organigramme | Programme en assembleur |

| Déclaration Message Initialisation DS BX🡨 0 CX🡨7 Boucle: DL🡨 Message[BX] Affichage Message fonction( 02) BX🡨 BX+1 Jnz boucle BX= ?cx | 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

| | |

| --- | --- |

| organigramme | Programme en assembleur |

| Declaration BUFFER Initialisation DS BX🡨 OFFSET BUFFER BOUCLE : CX 🡨 0 Lecture clavier function (01) CX🡨 CX+1 JZ FIN SI NON CX= ?30 AL= ?13 JNZ BOUCLE FIN : BX🡨 CX CX🡨30- CX | 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.

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.

Advertisement

| | |

| --- | --- |

| Organigramme | Programme en assembleur |

| a) Declaration TAB1 Declaration TAB2 Initialisation DS SI 🡨 0 Boucle: Cx 🡨4 Lecture clavier function (01) TAB 2[SI] 🡨 AL Affichage function (02) SI🡨 SI+1 sinon SI= ?cx JNZ boucle b) Declaration TAB1,TAB2 Initialisation DS DI🡨 3 SI 🡨 0 Boucle: Cx 🡨4 Al🡨 TAB1[SI] TAB 2[SI] 🡨 AL SI🡨 SI+1 JNZ boucle DI🡨 DI-1 CX= ?0 BOUCLE1 SI 🡨 0 DL🡨TAB 2[SI] Affichage function (02) SI 🡨 SI+1 SI=4 JNZ BOUCLE1 | 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 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 |

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- 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) Declaration TAB1 Initialisation DS SI 🡨 0 CX 🡨4 DL 🡨 TAB1 [SI] Affichage de DL (fonction 02) SI 🡨 Si+1 SI=? CX JZ fin JNZ boucle Boucle: Fin: b) Declaration TAB1 Initialisation DS SI 🡨 0 Ax 🡨0 CX🡨4 AX 🡨 TAB1 [SI] Boucle: SI 🡨 SI+1 JZ fin SI=CX AX< TAB1 [SI] JL boucle AX 🡨 TAB1 [SI] Affichage de AX par 02 JMP Boucle Fin: | 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] 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 |

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) Declaration TAB1 Declaration Msg Initialisation DS SI 🡨 0 Bx 🡨0 CX🡨4 BL 🡨 TAB1 [SI] Boucle: SI 🡨 SI+1 JZ fin SI= ?cx BL> TAB1 [SI] JG boucle Fin: BL 🡨 TAB1 [SI] JMP Boucle Affichage de Msg par 09 Affichage de BX par 02 | 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 |

![](data:image/x-emf;base64...)Le code ASCII

Interruption 21H

| | | | | |

| --- | --- | --- | --- | --- |

| Fonction | Parametre d’entree | Parametre de sortie | Syntaxe | Fonction |

| 1 | AH | AL | MOV AH,01 INT 21H | Lecture du caractère entre au clavier avec écho et le range dans AL |

| 2 | AH,DL | | MOV AH,02 INT 21H | Affichage du caractère contenu dans le registre DL sur l’écran |

| 3 | AH | AL | MOV AH,03 INT 21H | Lecture d’un caractère sur le port série auxiliaire RS 232 et le range dans AL |

| 4 | AH,DL | | MOV AH,04 INT 21H | Ecriture d’un caractère contenue dans DL sur le port série auxiliaire RS 232 |

| 5 | AH,DL | | MOV AH,05 INT 21H | Ecriture d’un caractère contenue dans DL sur le port d’imprimante |

| 6 | AH,DL | | MOV AH,06 INT 21H | Lecture et écriture combine sur clavier écran |

| 7 | AH | AL | MOV AH,07 INT 21H | Lecture directe au clavier sans écho. Le caractère est range dans AL |

| 8 | AH | AL | MOV 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,DX | | LEA DX,MESSAGE MOV AH,0AH INT 21H | Lecture d’un message entier au clavier |