Académique Documents
Professionnel Documents
Culture Documents
Chapitre 4 Structure General
Chapitre 4 Structure General
Chapitre 4 Structure General
II. Déclarations :
II.1 Variables de 8 ou 16 bits
Les directives DB (Define Byte) et DW (Define Word) permettent de déclarer des variables de
respectivement 1 ou 2 octets.
Exemple :
A DW 15 ; 2 octets initialises a 15
B DW ? ; 2 octets non initialises
C DB ? ; 1 octet non initialise
D DB -1 ; 1 octet initialise a -1 ; recevera la valeur en Cà2 : 11111111
E DW 0F0AH ; en hexa
F DB 01110000b ; en binaire
Exemple :
data SEGMENT
tab DB ’operating system’, ’$’
data ENDS
code SEGMENT
ASSUME DS:data, CS:code
III. La pile :
La pile est une zone mémoire qui sert à stocker temporairement des valeurs. Elle fonctionnant en
mode LIFO (Last In First Out : dernier entré, premier sorti). Deux opérations sont possibles sur la
pile :
• empiler une donnée : placer la donnée au sommet de la pile ;
• dépiler une donnée : lire la donnée se trouvant au sommet de la pile.
Le sommet de la pile est repéré par un registre appelé pointeur de pile (SP : Stack Pointer) qui
contient l’adresse de la dernière donnée empilée. La pile est définie dans le segment de pile dont
l’adresse de départ est contenue dans le registre SS.
La pile est souvent utilisée pour sauvegarder temporairement le contenu des registres :
; AX et BX contiennent des données à conserver
Exemple :
PUSH AX
PUSH BX
Pour utiliser une pile en assembleur, il faut déclarer un segment de pile, et y réserver un espace
suffisant.
Exemple :
Déclaration d’une pile de 200 octets :
stack SEGMENT; mot clef stack car pile
DW 100 dup (?)
ENDS
Et l’instruction RET :
– Dépiler une valeur et la ranger dans IP.
IV.2 Déclaration d’une procédure
On déclare une procédure dans le segment d’instruction comme suit :
Exemple :
stack segment
dw 128 dup(0)
ends
code segment
start:
mov ax, data
mov ds, ax
Exemple :
On va écrire une procédure “SOMME” qui calcule la somme de 2 nombres naturels de 16 bits.
Convenons que les entiers sont passés par les registres AX et BX, et que le résultat sera placé dans
le registre AX.
La procédure s’écrit alors très simplement :
SOMME PROC ; AX <- AX + BX
ADD AX, BX
RET
SOMME ENDP
Cette instruction charge le contenu du mot mémoire d’adresse BP+6 dans AX.
La procédure SOMME2 va lire la pile pour obtenir la valeur des paramètres. Pour cela, il faut bien
comprendre quel est le contenu de la pile après le CALL :
Le sommet de la pile contient l’adresse de retour (ancienne valeur de IP empilée par CALL).
Chaque élément de la pile occupe deux octets.
Exemple :
ma macro ; declaration de la macro
mov bx,1
add ax,bx
endm
ma ; appel de la macro
VI.1 LODS
LODSB charge le registre AL (respectivement, AX pour l’instruction LODSW) avec l’octet
(respectivement le mot) pointé par le registre SI. SI est automatiquement incrémenté.
VI.2 STOS
STOSB écrit en mémoire l’octet (respectivement le mot pour l’instruction STOSW) se trouvant
dans le registre AL (respectivement dans le registre AX) en mémoire à l’adresse pointée par le
registre DI. Le segment destination est forcément ES. DI est automatiquement incrémenté.
Exemple :
Data segment
TABLEAU DW 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
Data ends
Extra segment
RES DW 10 DUP (0)
Extra ends
Code segment
Start :
mov ax, data
mov ds, ax
mov ax, extra
mov es, ax
mov cx, 10
BOUCLE: lodsw
mov bl, 2
mul bl
stosw
loop BOUCLE
Exercice :
Soit la chaine « SYSTEM ». Donner un pgm qui la met en minuscule.
Data segment
chaine DB ‘SYSTEM’
Data ends
Extra segment
Result Db 6 DUP (?)
Extra ends
Code segment
Start :
mov ax, data
mov ds, ax
mov ax,extra
mov es, ax
mov cx, 6
BOUCLE: lodsb
OR AL, 00100000b ; force bit 5 a un
stosb
loop BOUCLE
VI.3 MOVS
Transfert d’un élément entre deux chaînes. Il copie l’octet (respectivement le mot pour l’instruction
MOVSW) pointé par SI vers l’octet (respectivement le mot) pointé par ES:DI. SI et DI sont
automatiquement incrémentés.
VI.4 CMPS
CMPSB compare l’octet (respectivement le mot pour l’instruction CMPSW) pointé par SI à l’octet
(respectivement le mot) pointé par ES:DI. SI et DI sont automatiquement incrémentés.
VI.6 SCAS
SCASB compare la valeur de l’octet (respectivement le mot pour l’instruction SCASW) contenu
dans le registre AL (respectivement AX) à l’octet (respectivement le mot) pointé par ES:DI. DI est
automatiquement incrémenté.
VI.7 REP
C’est une instruction qui permet d’itérer sur toute une chaîne les opérations élémentaires vues
précédemment. On dit que l’instruction préfixe l’opération à itérer. REP ne peut préfixer que les
instructions LODS, STOS, MOVS. Un compteur (registre CX) indique le nombre d’itérations à
effectuer.
– REP MOVS copie CX éléments de la chaine pointée par SI vers la chaine pointée par ES:DI
– REP LODS charge CX éléments de la chaine pointée par SI dans AL (ou AX)
– REP STOS écrit CX éléments de la chaine pointée par ES:DI avec la valeur contenue dans AL
(ou AX)
Exemple : Copie un tableau de caractères dans un autre tableau.
Data segment
CHAINE db ’system’ ; chaine source
RES db 6 dup (?) ; chaine cible
Data ends
Code segment
….
lea di, RES ; offset chaine cible
lea si, CHAINE ; offset chaine source
mov cx, 6 ; longueur de la chaine
rep movsb ; copie
….
A. REPE CMPS compare au plus CX éléments de la chaine pointée par ES:DI avec ceux de la
chaine pointée par SI. Les itérations sont poursuivies tant que les éléments des deux chaines
sont égaux (sont différents pour REPNE) et tant que le compteur n’est pas nul. Dès que
l’une de ces conditions n’est plus vérifiée, l’instruction REPE CMPS est terminée
B. REPE SCAS compare au plus CX éléments de la chaine pointée par ES:DI avec la valeur du
registre AL, ou AX selon le cas. Les itérations sont poursuivies tant que les éléments de la
chaine sont égaux (sont différents pour REPNE) à la valeur du registre et tant que le
compteur n’est pas nul. Dés que l’une de ces conditions n’est plus vérifiée, l’instruction
REPE SCAS est terminée.
Exemple : Recherche d’un caractère dans une chaine de caractères en utilisant l’instruction SCAS
CHAINE db ‘system’
….
mov al, ’t’
lea di, CHAINE
mov cx,6
repne scasb
...
A l’issue de l’exécution de cette séquence d’instructions, le registre DI pointe sur le caractère qui se
trouve après le ’t’ dans la chaine de caractère, c’est-à-dire ’e’. Puisque l’offset de CHAINE vaut 0,
di vaut 4 à l’issue de l’exécution de repne scasb.
VII. L’accès aux fichiers :
Pour pouvoir accéder aux données d’un fichier, que ce soit en lecture ou en écriture, il faut d’abord
l’ouvrir. A l’ouverture, le programme récupère une poignée. Ensuite, toutes les opérations sur ce
fichier seront effectuées en spécifiant cette poignée.
Les appels ou interruptions pour effectuer les traitements de base sur les fichiers :
Avant l’appel le registre al contient le mode d’accès : 0 pour lecture, 1 pour l’´ecriture, 2 pour les
deux ;
Et dx pointent sur le nom de fichier. C’est une chaine de caractères terminée par un caractère ASCII
de code 0.
Exemple :
Data segment
nomfichier DB ’blida.txt’, 0
data ends
CODE segment
mov ax,data
mov ds,ax
;
; ouverture du fichier
;
mov al,0 ; accès en lecture
lea dx, nomfichier
mov ah,3dh ; ouverture du fichier
int 21h
…. …
Exemple :
….
lea dx, nomfichier
mov ah,3dh ; ouverture du fichier
int 21h
Avant l’appel :
- bx contient la poignée du fichier
- cx contient le nombre de caractères à lire
- dx contient l’adresse du buffer ou il faut stocker les caractères lus.
Après l’appel :
- ax contient le nombre de caractères lus.
Exemple :
Data segment
nomfichier DB ’blida.txt’, 0
Buffer db 100 dup (?), ’$’
data ends
CODE segment
mov ax,data
mov ds,ax
;
; ouverture du fichier
;
mov al,0 ; accès en lecture
lea dx, nomfichier
mov ah,3dh ; ouverture du fichier
int 21h
Avant l’appel
- bx contient la poignée du fichier
- cx contient le nombre de caractères à écrire ;
- ds:dx pointent sur le buffer contenant les caractères à écrire.