Votre première application en Assembleur
Application "Bonjour les visiteurs de ZNsoft" :
;**************************
;*** ZNsoft Asm Exemple ***
;**************************
.model small
;**************************
;*** Segment de donnée ***
;**************************
.data
texte db "Bonjour les visiteurs de ZNsoft",13,10,"$"
;*****************
;*** Programme ***
;*****************
.code
;Segment de donnée dans DS
mov ax,@data
mov ds,ax
mov ah,09h
mov dx,offset texte
int 21h
mov ax,4c00h
int 21h
end
Bon, vous l'aurez compris, ce n'est pas aussi simple qu'en C. Au début de notre
programme, on a : .model small. Cette instruction indique à l'assembleur que
notre programme pourra se contenter d'un petit modèle mémoire.
Ensuite,
on a le segment de données. C'est ici qu'on doit déclarer toutes les variables
utilisées dans le programme. Pour afficher bonjour, on doit donc créer une
chaîne de caractères contenant le texte bonjour les visiteurs de ZNsoft. C'est ce que fait la ligne :
texte db "Bonjour les visiteurs de ZNsoft",13,10,"$"
Ici :
texte est le nom de la variable
db est le type (b comme byte, octet en français)
"Bonjour les visiteurs de ZNsoft",13,10,"$" permet d'initialiser la chaîne avec la valeur Bonjour, suivie des codes ASCII 13 et 10 (qui permettent de sauter une ligne) et du
symbole $ (qui indique la fin d'une chaîne de caractères en assembleur)
Enfin, on a la partie programme. Les 2 premières instructions :
mov ax,@data
mov ds,ax
Ces deux instructions permettent d'initialiser le registre DS avec la valeur du
segment de données alloué au programme. Je vais essayer de m'expliquer (un peu)
plus clairement. Il faut que je commence par expliquer ce qu'est le mode
réel.
C'est un problème qui date des années 80. A l'époque, les
ingénieurs de chez IBM avaient pour objectif de concevoir un PC gérant 1 Mo de
mémoire vive (pour l'époque, c'était énorme, c'est comme si on parlait de 100 Go
de mémoire actuellement). Pour gérer une telle quantité de mémoire, il faut un
registre d'adresse de 20 bits (je n'explique pas pourquoi, je suppose que vous
le savez). A l'époque, de tels registres n'existaient pas : le maximum était de
16 bits. Ces ingénieurs ont donc eu l'idée d'utiliser 2 registres d'adresse : un
registre de poids fort : le registre de segment, et un registre de poids faible
: le registre d'offset (il est appellé ainsi, car il sert à se déplacer dans un
segment donné).
Notre adresse sur 20 bits est donc donnée par :
segment*16 + offset. Notre programme étant " petit " (on l'a précisé par la
ligne .model small), on ne dispose que d'un segment. On peut donc initialiser DS
au début du programme, puis on agira sur le registre d'offset pour " jongler "
entre les différentes variables.
Après avoir initialisé DS, on peut
afficher notre texte. On utilise pour cela une interruption. Ici aussi, c'est
assez simple. Un PC dispose de 256 interruptions. Ce sont des groupes de
sous-programmes (exactement comme des fonctions) fournis par un système
d'exploitation pour réaliser une tâche particulière.
Pour chaque
interruption, on peut trouver une documentation avec ce qu'elle attend en
entrée, et ce qu'elle retourne en sortie. Par exemple, pour l'interruption
21h, qui est une interruption DOS, on a la description suivante :
Int 21h, Fct 09h Sortie d'une chaine de
caractères DOS (> 1.0)
Cette fonction permet de sortir une chaîne de caractères sur le périphérique de
sortie standard. Comme ce périphérique standard peut être redirigé sur un autre
périphérique ou vers un fichier, il n'y a aucune garantie que la chaîne de
caractères apparaisse sur l'écran. Si la sortie est redirigée sur un fichier, le
programme d'appel n'a aucune possibilité de détecter si le support (disquette,
disque dur) sur lequel figure le fichier est déjà plein, autrement dit s'il est
encore possible d'écrire la chaîne de caractères dans le fichier.
Entrée
:
AH = 09h DS = Adresse de segment de la chaîne de caractères DX =
Adresse d'offset de la chaîne de caractères
Sortie :
aucune
Remarques :
La chaîne de caractères doit être stockée dans la mémoire sous forme d'une
séquence d'octets correspondant aux codes ASCII des caractères composant la
chaîne. La fin de la chaîne de caractères doit être signalée au DOS à l'aide
d'un caractère "$" (code ASCII 36).
Si la chaîne de caractères contient des codes de commande comme Backspace,
Carriage Return ou Line Feed, ceux-ci seront traités comme tels.
Seul le contenu du registre AL est modifié par l'appel de cette fonction.
On voit donc que pour utiliser cette fonction, on doit fournir en entrée
:
AH = 09h DS = Adresse de segment de la chaîne de caractères DX =
Adresse d'offset de la chaîne de caractères
On s'est déjà occuper du
registre DS au début du programme. On doit donc mettre les valeurs
correspondantes dans AH et DX, et appeler notre interruption, ce qui est fait
par les instructions :
mov ah,09h
mov dx,offset texte
int 21h
Enfin, on n'a plus qu'à quitter le programme. Ca peut paraître étonnant, mais pour quitter, il faut aussi appeler
une interruption :
Int 21h, Fct
4Ch Terminer programme avec un code de fin DOS (> 1.0)
Cette fonction permet de terminer un programme en définissant un code de fin que
le programme d'appel pourra tester à l'aide de la fonction 4Dh. La mémoire RAM
occupée par le programme à terminer est libérée après appel de cette fonction,
de sorte qu'elle peut à nouveau être attribuée à d'autres
programmes.
Entrée : AH = 4Ch AL = Code de fin
Sortie : aucune
Remarques :
Cette fonction est à utiliser de préférence aux autres fonctions pour
terminer un programme.
Lorsque cette fonction est appelée, les 3 vecteurs d'interruption dont le
contenu avait été stocké dans le PSP avant le lancement du programme sont
restaurés.
Avant que le contrôle ne soit rendu au programme d'appel, tous les handles
qui ont été ouverts par le programme appelé, ainsi que tous les fichiers
correspondants, sont refermés. Cela ne concerne toutefois que les fichiers
auquel on accédait par FCB.
Le code de fin peut être examiné dans un fichier batch à l'aide des
instructions ERRORLEVEL et IF.
-
Déposez votre CV
-
lien de téléchargement direct
-
50 tirages offerts à l'inscription chez myPIX.com!
-
Dépot de CV gratuit sur Touslesemplois
-
Logiciel de référencement automatique
|