Académique Documents
Professionnel Documents
Culture Documents
Assembleur
114
Programme assembleur
115
NomData SEGMENT
;Espace de réservation des constantes et des variables.
NomData ENDS
NomCode SEGMENT
Exemple:
117
Déclaration des constantes "prog16.asm"
Data SEGMENT
X EQU 7
Y EQU 2*X+1
Data ENDS
Code SEGMENT
ASSUME CS:Code, DS:Data
PROG:
MOV AX,Data
MOV DS,AX
MOV AX,X
MOV BX,Y
Code ENDS
118
END PROG
Déclaration des variables
Pour déclarer une variable on peu utiliser l'un des mots clés:
119
Déclaration des variables
Nomvar DB Val
Nomvar DW Val
Exemple:
a DB 10 ; Déclare la variable a sur un octet et l'initialise à 10.
b DW 15 ; Déclare b sur deux octets et l'initialise à 15.
c DB ? ; Déclare une variable c sans l'initialisée.
120
Variables et constantes "prog17.asm"
Data SEGMENT
Cte EQU 5
Ecrire le programme assembleur de X DB 0F0h
Y DW 0A000h
S DW ?
l'algorithme ci-dessous avec: Data ENDS
Code SEGMENT
X (8 bits) et Y(16 bits) ASSUME CS:Code,DS:Data
PROG:
MOV AX,Data
Cte=5 MOV DS,AX
MOV AX, [BX+0] ;charger dans AX deux octets a partir de l'adresse @T1+0. AH=02 et AL=01
;AX=0201h
MOV DX, [BX+1] ;charger dans DX deux octets a partir de l'adresse @T1+1.DH=03 et DL=02
;DX=0302h
Code ENDS T1[i] ≡ T1+i ≡ [offset T1+i] ≡ valeur à partir de
124 ème case
END PROG la i
Accès aux éléments d'un tableau "prog19.asm"
Data SEGMENT
@T2+5≡BX+5 FFh
T2 DW 0BBAAH, 0DDCCH, 0FFEEH
Data ENDS @T2+4≡BX+4 EEh
MOV AX, [BX+1] ; charger dans DX deux octets a partir de l'adresse @T2+1. AX=0CCBBh
MOV DX, T2[3] ; charger dans DX deux octets a partir de l'adresse @T2+3. DX=0EEDDh
Code ENDS
125 PROG
END
Exercice "prog20.asm" Data SEGMENT
ecart EQU 3
T DB DUP 10 (0)
Data ENDS
Code SEGMENT
Ecrire un programme assembleur ASSUME CS:Code,DS:Data
PROG:
qui initialise un tableau T avec 10 MOV AX,Data
MOV DS,AX
nombres (0, 3, 6, ... , 27) .
XOR AX,AX
Penser à utiliser un compteur SI ou MOV CX,10
MOV SI,0
DI comme indice pour parcourir le boucle:
MOV T[SI],AL
ADD AL, ecart
tableau T ( T[SI]) INC SI
LOOP boucle
Code ENDS
126
END PROG
Entrées/Sorties
Pour faire des entrées/sorties (essentiellement avec l’écran et le
clavier), on passe par des interruptions (des sous-programmes
préexistants dans la machine) du BIOS, la plus importante est
l’interruption 21h.
129
Saisie et affichage d'un caractère "prog22.asm"
Data SEGMENT
a db ?
Ecrire un programme Data ENDS
Code SEGMENT
assembleur qui sépare le caractère ASSUME CS:Code,DS:Data
PROG:
lu au clavier et celui afficher par MOV AX,Data
MOV DS,AX
un tiret '-'. MOV AH, 1
int 21h
Exemple : MOV a,AL
MOV DL,'-'
• Le premier S est celui saisie MOV AH,2
INT 21H
• Afficher un tiret MOV DL,a
MOV AH,2
• Puis le caractère lu S INT 21H
code ENDS
130 end PROG
Saisie et affichage d'un caractère "prog23.asm"
Data SEGMENT
a db ?
Ecrire un programme assembleur qui Data ENDS
Code SEGMENT
ASSUME CS:Code,DS:Data
sépare le caractère lu au clavier et celui PROG:
MOV AX,Data
afficher par un retour à la ligne suivante: MOV DS,AX
MOV AH, 1
Exemple : int 21h
MOV a,AL
MOV DL,13
• Le premier D est celui saisie MOV AH,2
INT 21H
• Retour à la ligne suivante MOV DL,10
MOV AH,2
• 10 = LF (line feed - saut de ligne) INT 21H
MOV DL,a
• 13 = CR (carriage return - retour à la ligne) MOV AH,2
INT 21H
• Puis le caractère lu D
131
code ENDS
end PROG
Exercice "prog24.asm"
data SEGMENT
msg db 'Bonjour'
data ENDS
code SEGMENT
ASSUME CS: code, DS: data
begin:
Ecrire un programme MOV AX,data
MOV DS, AX
assembleur qui affiche Bonjour. MOV SI,0
MOV CX,7
boucle:
MOV DL, msg[SI]
MOV AH, 02h
int 21h
INC SI
LOOP boucle
code ENDS
END begin
132
Exercice "prog25.asm" data SEGMENT
msg db 'Bonjour tout le monde!!$'
data ENDS
code SEGMENT
ASSUME CS: code, DS: data
Ecrire un programme assembleur begin:
MOV AX,data
qui affiche une chaîne de taille MOV DS, AX
MOV SI,0
quelconque. boucle:
CMP msg[SI],'$'
JZ FIN
MOV DL, msg[SI]
MOV AH, 02h
int 21h
INC SI
JMP boucle
FIN:
code ENDS
133
END begin