Guide (L2) ASM
Guide (L2) ASM
1. Déclaration de variables
2. Traitement tableaux et chaines de caractères
3. Vecteurs d’entiers
4. Tableaux a deux dimensions (matrices)
5. Les entrées sorties en ASM (interruptions)
6. L’équivalent de quelques instructions du langage C en
assembleur
7. Quelques instructions de base
8. Comparaison
9. Mode d’adressage
10. Quelques remarques
11. Les piles
Manuel
Déclaration de variables
Les variables se déclarent comme suit:
De manière générale:
- décimal: 1, 2, 3, 123, 45
- binaire : 1b,0b,1010b,111101b
Exemple:
mesg DB ‘bonjour$’
Vecteur d’entiers
Le principe est le même pour un vecteur d’entiers où chaque élément est stocké
sur un entier. Pour un vecteur d’entiers stockés sur deux octets nous devons tenir
compte de la longueur d’un élément du vecteur.
Exemple:
; aux valeurs 1, 4, 7 et -1
…………………………………………………………………………………………………………………………
N EQU 12
M EQU 32
tableau DB N*M DUP (?)
……………………………………………………..
Ou bien
Lea registre, tab
Mov registre(par exemple BX),offset (veut dire adresse) tab(le tableau)
Lea (instruction de chargement d’adresse) registre, tab (le tableau « il
ne faut pas mette offset »)
Affichage d’un caratère: mov DL, “A”; caractère A est transfére dans DL
int 21h;
mov AH, 07H; fonction no. 7 (sans écho) (sans écho=veut dire sans affichage a
l’ecran (non visible))
int 21h;
else {
MOV CX,10
endif: ..............
bx = bx + k; MOV CX,0
JA Endfor
ADD BX,CX
INC CX
JMP For
Endfor:
WHILE Assembleur
bx = 5 MOV BX,5
DEC BX
JMP while
Endwhile:
} cmp c, d
jnle endif
..............
endif:
Quelques instructions de base
• Affectations
; Entre registres
MOV AX, BX
MOV CL, DH
MOV variable_de_un_octet, DL
; Incrémentation
INC AX ; AX <- AX + 1
Inc ma_variable
; Décrémentation
DEC AX
Dec ma_variable
; Addition
Add t, Cx ; t <- t+ Cx
; Soustraction
SUB t, CX ; t <- t - CX
; OR bit à bit
MOV AH, 0101b ; AH <- 5 Not AH ; AH <- NOT AH; AH vaut 1010b, soit
10 (8+2)
Comparaison:
; Egalité (Jump if Equal)
CMP AX, 5
JE label_1 ;label_1==etiquette
JNE label_2
CMP CH, 0
JL label_1
CMP DH, Ah
JG label_2
JLE label_3
JZ Saut si zéro. JNZ
• Mode registre
mov AX,BX
mov [adresse],AL
L’opérande est désignée par une adresse placée dans les registres d’adresses
donnée dans l’instruction
pointeur
mov BX,[DI+6]
mov [BP][DI],AX
Quelques remarques
La directive ASSUME permet d'indiquer à l'assembleur où se situe le segment de
données et le segment de code. Puis il s'agit d'initialiser le segment de données à
l’intérieur du segment de code:
MOV AX, nom_du_segment_de_donnees
MOV DS, AX
Boucle:
…… ; le corps de la boucle
Cela signifie que le corps de la boucle est exécuté tant que la valeur de CX n’est
pas nulle. A chaque itération, CX est décrémenté d’une unité.
Exemple :
En C
ax = ax + cx
En Assembleur
MOV AX,0
for:; for==label de l’etiquette (on peut mettre ce qu’on veut come label)
• MonLabel.
La directive EQU
La directive EQU a un rôle voisin de celui des macros. Elle permet de remplacer
un simple mot par d’autres plus complexes. Son intérêt est qu’elle peut être
invoquée en plein milieu d’une ligne.
Exemple :
Version EQU 2
Une pile est une zone de mémoire dans laquelle on peut stocker temporairement des
registres. Il s'agit d'un moyen d'accéder à des données en les empilant, telle une pile de
livre, puis en les dépilant pour les utiliser. Ainsi il est nécessaire de dépiler les valeurs
stocker au sommet (les dernières à avoir été stockées) pour pouvoir accéder aux valeurs
situées à la base de la pile.
En réalité il s'agit d'une zone de mémoire et d'un pointeur qui permet de repérer le
sommet de la pile.
La pile est de type LIFO (Last In First Out), c'est-à-dire que la première valeur empilée
sera la dernière sortie (Si vous empilez des livres, il vous faudra les dépiler en
commençant par enlever les livres du dessus. Le premier livre empilé sera donc le
dernier sorti!).
Les instructions PUSH et POP sont les instructions qui servent à empiler et dépiler
les données.
Ainsi, l'instruction
PUSH BX
et l'instruction
POP AX
Exemple :
Utilisation de la pile sur un exemple
• PUSH AX
• PUSH BX
• ADD BX, AX
• MOV [0140], BX
• POP BX
• POP AX
• En effet, lorsque l'on parcourt la pile de la base vers le sommet, les adresse
décroissent.
Par contre l'instruction POP incrémente de 2 octets (16 bits) la valeur de
SP.
• PUSH: SP <- SP - 2
• POP: SP <- SP + 2
• Ainsi, lorsque la pile est vide SP pointe sous la pile (la case mémoire en-
dessous de la base de la pile) car il n'y a pas de case occupée. Un POP
provoquera alors une erreur...
Noter le mot clef ``stack '' après la directive SEGMENT, qui indique à
l'assembleur qu'il s'agit d'un segment de pile.
Afin d'initialiser SP, il faut repérer l'adresse du bas de la pile; c'est le rôle de
la ligne base_pile EQU this word (voir figure suivante).
Ces mots clés permettant la déclaration de la procédure sont le une étiquette (qui
représente le nom de la fonction) précédant le mot clef 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:
instruction1
instruction2
...
RET
Etiquette ENDP
une adresse
PUSH parametre2 ; où parametre1 correspond à une valeur ou
une adresse
CALL procedure
pile