Vous êtes sur la page 1sur 12

Institut Supérieur d’Informatique L1IRS 2021-2022

TP4 : Chaines de Caractères


Objectifs :
 Maitriser les notions de base de l’Assembleur.
 Ecrire des programmes en Assembleur permettant de traiter une chaine de
caractères.
I- Notions de Programmation en Assembleur :
Avant de commencer ce T.P, on énonce quelques notions basiques de la
programmation en Assembleur :
1- Structure d’un Programme Assembleur
données SEGMENT ; données est le nom du segment de données
; directives de declaration de données
données ENDS ; fin du segment de données
code SEGMENT ; code est le nom du segment d’instructions
ASSUME DS:données, CS:code
Mov AX,données
Mov DS, AX
debut :

Mov ah,4ch
Int 21h
code ENDS
END debut ; fin du programme avec l’étiquette de la première instruction.

1
Institut Supérieur d’Informatique L1IRS 2021-2022

2- Définitions des données


 DB : Define Byte
Permet de réserver un emplacement mémoire de 1octet
Exemple :
Nom-var DB ?
→ Permet de déclarer une variable Nom-var de 1 octet non initialisée
Nom-var DB 23
→ Permet de déclarer une variable Nom-var de 1 octet initialisée à 23.
Nom-tab DB 4, 3, 10, 15
→ Permet de déclarer un tableau Nom-tab contenant les valeurs 4, 3, 10, 15
 DW : Define Word
Permet de réserver un emplacement mémoire de 1mot (16 bits pour le processeur
80×86).
 DD : Define Doubleword
→ Permet de réserver un emplacement mémoire sur un double mot (32 bits).

2
Institut Supérieur d’Informatique L1IRS 2021-2022

3- INT 21h
Cette interruption offre un regroupement de tous les services offerts par le système
d’exploitation DOS ou compatible. Pour réaliser les opérations standards (affichage,
saisie), le système d’exploitation (ici DOS) fournit les fonctions pré-écrites (fonctions
de l’interruption 21H) :

Fonction 1 : permet la saisie d’un caractère au clavier et le met (code ASCII) dans le

registre AL.

MOV AH, 1

INT 21H ;

Fonction 2 : affiche le caractère contenu dans le registre DL.

MOV DL,61H ; Le code ASCII 61H (caractère a) est transféré dans DL

MOV AH,2; fonction n°2

INT 21H ;

Fonction 9 : affiche une chaine de caractères pointés par DX

mov DX,OFFSET chaine ; pointe vers l’adresse du premier caractère de la chaine de


carcatères chaine

MOV AH,9; fonction n° 9

INT 21H

chaine db "Hello world$" ; message à afficher

Fonction 4CH : fin d’un programme.

MOV AX,4c00h

Int 21h

3
Institut Supérieur d’Informatique L1IRS 2021-2022

4- Affichage d’une chaine de caractères à l’écran


Pour indiquer à la routine d’interruption 21 qu’elle doit afficher à l’écran une chaîne
de caractère, il faut cette fois mettre la valeur 9H dans AH (au lieu de 2H pour un
simple caractère).
L’adresse du début de la chaîne de caractères est donnée par : L’adresse du segment
dans lequel elle se trouve. (Dans notre cas le contenu du registre CS) que l’on doit
charger dans le registre DS (Data Segment). NB : on ne peut charger DS qu’à partir
d’un registre. Il faudra donc d’abord charger la valeur de CS par exemple dans AX,
puis transférer AX dans DS. L’offset par rapport à cette adresse que l’on doit charger
dans le registre DX. La fin de la chaîne de caractère doit être indiquée par la présence
d’un caractère $ qui doit obligatoirement finir cette chaîne, sinon la routine
d’interruption affiche tous les caractères jusqu’à la fin du segment ou jusqu’à ce
qu’elle rencontre un octet contenant le code du caractère. (13 → retour chariot, 10 →
ligne suivante, $ → fin de chaîne de caractères).

4
Institut Supérieur d’Informatique L1IRS 2021-2022

5- Les jeux d’instruction du 80×86


 Le transfert des données
 MOV
Syntaxe : MOV Destination, Source
Description : Copie le contenu de Source dans Destination.
Mouvements autorisés : MOV Registre général, Registre quelconque
MOV Mémoire, Registre quelconque. Exemple : MOV [100h], BX
MOV Registre général, Mémoire. Exemple : MOV CX,[100h]
MOV Registre général, Constante. Exemple : MOV AX, 100h
MOV Mémoire, Constante. Exemple : MOV [100h], 100 h

 Adressage :
Il existe différentes façons de spécifier l’adresse d’une case mémoire dans une
Instruction : c’est le mode d’adressage.
 Adressage par registre
Ce mode d'adressage concerne tout transfert ou toute opération, entre deux registres de
même taille.
Exp : MOV AX, BX
 Adressage immédiat
Dans ce mode d'adressage l'opérande apparaît dans l'instruction elle- même
Exp : MOV AX, 243
MOV AX, 243h
 Adressage direct
Dans ce mode on spécifie directement l'adresse de l'opérande dans l'instruction
Exp : MOV AX, [243]
MOV [243], AX
MOV AX, [ES: 243]
 Adressage indirect
Dans ce mode d'adressage l'adresse de l'opérande est stockée dans un registre qu'il faut
5
Institut Supérieur d’Informatique L1IRS 2021-2022

bien évidemment le charger au préalable par la bonne adresse. L'adresse de l'opérande


sera stockée dans un registre de base (BX ou BP) ou un index (SI ou DI).
Exp: MOV AX, [BX]
MOV AX, [BP]
MOV AX, [ES: BP]
L’adressage indirect est divisé en 3 catégories :
-Adressage basé
Dans ce mode d'adressage Le déplacement est déterminé par le contenu de BX, ou par
le contenu de BP.
Exp : MOV AX, [BX]
MOV AX, [BP]
MOV AX, [BX+5]
-Adressage indexé
Dans ce mode d'adressage Le déplacement est déterminé par le contenu de SI, ou par
le contenu de DI.
Exp : MOV AX, [SI]
MOV AX, [DI]
MOV AX, [SI+500]
-Adressage basé indexé
Exp : MOV AX, [BX+SI]
MOV AX, [BP+SI]
MOV AX, [BX+SI+5]

6
Institut Supérieur d’Informatique L1IRS 2021-2022

 Les Instructions Arithmétiques


 l’instruction INC (« Increment »)
Syntaxe : INC Destination
Description : Incrémente Destination.
Exemple : INC CX ;
 l’instruction DEC (« Decrement »)
Syntaxe : DEC Destination
Description : Décrémente Destination.
Exemple : DEC AX ;
 l’instruction ADD (« Addition »)
Syntaxe : ADD Destination, Source
Description : Ajoute Source à Destination
Exemple : ADD AX,BX ; AX= AX+BX
 l’instruction SUB (« Substract »)
Syntaxe : SUB Destination, Source
Description : Soustrait Source à Destination.

 Les instructions de branchement


*Les instructions de branchement inconditionnel
 L’instruction JMP (« Jump »)
Syntaxe : JMP MonLabel
Description : Saute à l’instruction pointée par MonLabel.
*Les instructions de branchement conditionnel
Les sauts conditionnels sont importants car ils permettent au programme de faire des
choix en fonction des données. Un saut conditionnel n’est effectué qu’à certaines
conditions portant sur les flags (par exemple : CF = 1 ou ZF = 0).

7
Institut Supérieur d’Informatique L1IRS 2021-2022

Certaines mnémoniques de sauts conditionnels sont totalement équivalentes, c’est-à-


dire qu’ils représentent le même opcode hexadécimal.
 JE (« Jump if Equal ») fait un saut au label spécifié si et seulement si ZF = 1.
 JG (« Jump if Greater ») fait un saut au label spécifié si et seulement si ZF = 0 et
SF = OF. On l’utilise en arithmétique signée pour savoir si un nombre est supérieur
à un autre.
Mnémoniqueéquivalent :JNLE (« Jump if Not Less Or Equal »)
 JGE (« Jump if Greater or Equal ») fait un saut au label spécifié si et seulement
si SF = OF. On l’utilise en arithmétique signée pour savoir si un nombre est
supérieur ou égal à un autre.
Mnémoniqueéquivalent :JNL (« Jump if Not Less »)
 JL (« Jump if Less ») fait un saut au label spécifié si et seulement si SF <> OF.
On l’utilise en arithmétique signée pour savoir si un nombre est inférieur à un
autre.
Mnémoniqueéquivalent :JNGE (« Jump if Not Greater Or Equal »)
 JLE (« Jump if Less Or Equal ») fait un saut au label spécifié si et seulement si
SF <> OF ou ZF = 1. On l’utilise en arithmétique signée pour savoir si un nombre
est inférieur ou égal à un autre.
Mnémoniqueéquivalent :JNG (« Jump if Not Greater »)
 JA (« Jump if Above ») fait un saut au label spécifié si et seulement si ZF = 0 et
CF = 0. On l’utilise en arithmétique non signée pour savoir si un nombre est
supérieur à un autre.
Mnémoniqueéquivalent :JNBE (« Jump if Not Below Or Equal »)
 JAE (« Jump if Above or Equal ») fait un saut au label spécifié si et seulement si
CF = 0. On l’utilise en arithmétique non signée pour savoir si un nombre est supérieur
ou égal à un autre.
Mnémoniqueéquivalent :JNB (« Jump if Not Below »)
 JB (« Jump if Below ») fait un saut au label spécifié si et seulement si CF = 1. On

8
Institut Supérieur d’Informatique L1IRS 2021-2022

l’utilise en arithmétique non signée pour savoir si un nombre est inférieur à un


autre.
Mnémoniqueéquivalent :JNAE (« Jump if Not Above Or Equal »)
 JBE (« Jump if Below or Equal ») fait un saut au label spécifié si et seulement si
CF = 1 ou ZF = 1. On l’utilise en arithmétique non signée pour savoir si un
nombre est inférieur ou égal à un autre.
Mnémoniqueéquivalent :JNA (« Jump if Not Above »)
 JZ (« Jump if Zero ») fait un saut au label spécifié si et seulement si ZF = 1. Ce
mnémonique correspond au même opcode que JE.
 JNZ (« Jump if not Zero ») fait un saut au label spécifié si et seulement si ZF = 0.
Cette mnémonique correspond au même opcode que JNE.

Remarque : les indicateurs sont positionnés en fonction du résultat de la dernière


opération.
Il existe un autre type de saut conditionnel, les sauts arithmétiques. Ils suivent en
général l’instruction de comparaison : CMP opérande1, opérande2

9
Institut Supérieur d’Informatique L1IRS 2021-2022

 Les instructions de Boucle


 l’instruction LOOP
Syntaxe : LOOP MonLabel
Description : Décrémente CX, puis, si CX <> 0, fait un saut à MonLabel.
Exemple : exécution d’un bloc d’instructions 4 fois
MOV cx, 4
Etiquette : ensemble d’instructions
LOOP Etiquette

10
Institut Supérieur d’Informatique L1IRS 2021-2022

II- Travail Demandé :


Exercice 1 :
Ecrire un programme en assembleur qui calcule le nombre de caractères dans une
chaîne de caractères situés avant le caractère *.
; Segment de donnees
data SEGMENT
chaine DB 'Hello*world'
data ENDS
; Segment de code
code SEGMENT
ASSUME DS:data, CS:code ;DS pointera vers le segment « data » et CS vers le
;segment « code »
main: ; main est un label, indiquant le debut du programme
; Initialisation du registre de segment de donnees DS
MOV AX,data
MOV DS,AX
; Chargement de l'adresse de la chaine dans BX
; Il s'agit de l'adresse relative au debut du segment
MOV BX,offset chaine
; Initialisation compteur CX
MOV CX,0
mov dl,0
Repeter: MOV AL,[BX] ; charger AL avec le contenu d'adresse de BX
CMP AL,'*' ; Test de fin de chaîne
JZ finito ; SI AL='*', saut vers le label finito
INC BX ; va de l'avant dans la chaine
INC CX ; Incrementation compteur
JMP Repeter ; saut automatique vers repeter
finito: ; finito est un label (RETOUR AU DOS)

11
Institut Supérieur d’Informatique L1IRS 2021-2022

mov dl,cl ; Placer dans dl la valeur de cl (compteur)


add dl,30h ;30h est le code ASCII de '0' (Placer dans dl le code ASCII du compteur cl)
mov ah,02h ; Afficher un caractere
int 21h
MOV AH,4CH; Fin du programme
INT 21H
code ENDS ; fin du segment code
END main ; Fin main

Exercice 2 :
Ecrire un programme assembleur qui permet d'afficher une ligne de N caractères '*'
sur l'écran, la valeur de N doit être donnée par l'utilisateur.

Exercice 3 :
Ecrire un programme assembleur qui permet de saisir deux valeurs N et P et un
caractère C, puis d'afficher P lignes de N caractères C.

Exercice 4 :
Modifier le programme de l'exercice 3 pour qu'il puisse afficher le résultat comme
indique l'exemple suivant :
Exemple : N=5 P=3 C= #
#####
####
###

12

Vous aimerez peut-être aussi