Copy Link
Add to Bookmark
Report
Tutorial Assembleur - Chapitre 03
TUTORIAL ASSEMBLEUR - chapitre 3
--------------------------------
Pile - Interruptions - Second programme
---------------------------------------
La pile (Stack) et ses instructions
-----------------------------------
La pile (stack en anglais) est un emplacement où des données de petites tailles peuvent être
placées. Cette mémoire temporaire (elle se comporte comme la mémoire vive mais en plus petit)
est utilisée aussi dans les calculatrices et dans tous les ordinateurs. Le système qu'elle
employe pour stocker les données est du principe du "dernier stocké, premier à sortir" (LIFO -
last in, first out). Cela veut dire que lorsqu'on place une valeur (un registre, un nombre)
dans la pile, elle est placée au premier rang (placée en priorité par rapport aux autres
valeurs dans la pile). Lors de la lecture de la pile pour récupérer la valeur, ce sera la
première qui sera prise. La pile se comporte comme une pile d'assiettes à laver.
Au fur et à mesure que les assiettes sont sales, vous les empilez. L'assiette qui se
trouve tout en bas sera la dernière à être lavée, tandis que la première assiette empilée
sera lavée au tout début. Même chose en asm, sauf les assiettes vont finir dans des registres.
Les instructions de la pile
--------------------------
Nous avons tout d'abord l'instruction PUSH qui signifie Pousser. Cette instruction permet de
placer une valeur au sommet de la pile. PUSH doit être accompagné d'une valeur de
16 ou 32 bits (souvent un registre) ou d'une valeur immédiate.
Exemple 1:
PUSH AX
PUSH BX
En premier lieu, AX est placé en haut de la pile et ensuite BX est placé au sommet,
AX est repoussé au deuxième rang.
Exemple 2:
PUSH 1230
PUSH AX
Nous plaçons dans la pile, la valeur 1230 (qui aurait pu être aussi un 32 bits)
et ensuite AX, ce qui place 1230 au deuxième rang.
Passons maintenant à l'instruction de "récupération" qui se nomme POP (sortir-tirer).
Cette instruction demande comme PUSH, une valeur de 16 ou 32 bits (seulement un registre).
Elle prend la première valeur de la pile et la place dans le registre qui suit l'instruction.
Exemple 1:
Nous avions PUSH AX et PUSH BX et maintenant nous allons les sortir de la pile en utilisant
POP BX
POP AX
Nous retrouvons les valeurs initiales de AX et BX mais nous aurions eu aussi la
possibilité de faire d'abord POP AX et POP BX, ce qui aurait placé dans AX, la valeur
BX (1er dans la pile) et dans BX, la valeur AX (2ème).
Exemple 2:
La première partie était PUSH 1230 et PUSH AX. Nous allons placer dans CX, la valeur
de AX (1er de pile) et dans DX, le nombre 1230 (2ème puisque "pilé" après)
POP CX
POP DX
Dans CX, nous avons la valeur de AX et dans DX, nous avons 1230.
La pile est très utile pour garder la valeur d'un registre que l'on va utiliser afin de le
retrouver intact un peu plus loin. Souvent dans des routines, le programmeur doit utilise tout
les registres mais leur nombre est limité (utilisation des registres au maximum = gain de vitesse). Le programmeur va donc utiliser les fonctions de la pile pour pouvoir utiliser les registres et garder leur
valeur actuelle pour une utilisation ultérieure. Malheureusement les instructions de la pile
ralentissent le programme, la pile étant de toute façon plus lente que les registres qui sont
au coeur du CPU.
Les interruptions - Instructions
--------------------------------
Dans un ordinateur, il y a plusieurs périphériques (imprimante, souris, modem,...). Vous
connaissez certainement le BIOS qui se charge chaque fois que vous allumez votre ordinateur.
Il y a différents BIOS qui dépendent des constructeurs mais ils sont généralement tous
compatibles aux niveaux des interruptions. Le BIOS possède différentes fonctions, ce sont les
interruptions. Ces interruptions sont divisées en 7 parties principales (il y en a d'autres):
- Fonctions vidéos (int 10h)
- Fonctions disques (int 13h)
- Fonctions de communication sur port série (int 14h)
- Fonctions système - Quasiment inutiles (int 15h)
- Fonctions clavier (int 16h)
- Fonctions imprimante (int 17h)
- Fonctions de gestion de l'horloge (int 1Ah)
Vous trouverez une description plus détaillée de chaque fonction (elles sont nombreuses,
c'est pourquoi je ne peux les détailler ici) dans des listes comme HelpPC de David Jurgens mais
il en existe des livres comme La Bible PC qui en proposent. Ce type de liste est indispensable
pour programmer, alors trouvez-en une le plus rapidement possible.
Les instructions des interruptions
----------------------------------
Il n'y en a qu'une qui est importante, il s'agit de INT. Elle permet d'appeler une des 7
catégories d'interruptions. Pour pouvoir séléctionner une fonction, il faut configurer les
registres avec certaines valeurs que vous trouverez dans la liste d'interruptions (une
dernière fois, procurez-vous en une !!!). Souvent, il faut juste changer AX mais parfois, tout
les registres sont modifiés. Ensuite on appelle INT accompagné du numéro de catégorie de la
fonction désirée. Par exemple, pour rentrer en mode texte 80x25 caractères, il faut écrire
ceci:
MOV AX,03h
INT 10h
Le nombre 03 qui se trouve dans AX, signifie que nous voulons le mode texte 80x25 (13h est
le mode 320x200x256 couleurs). L'instruction INT 10h appelle la catégorie 10h (fonctions vidéos).
Et c'est tout. Les interruptions permettent de faire plus facilement certaines actions qui
demanderaient une programmation plus compliquée.
Deuxième programme
------------------
Cette fois, le programme fait au moins quelque chose de visible. Il affiche un texte, le fameux
Hello World. Tout d'abord, voici le fichier texte que vous assemblerez (voir précédent
chapitre pour utiliser les programmes).
;-----[ PROGRAMME A COMPILER AVEC A86 ] ------
MOV AX,03h
INT 10h
MOV DX,offset Message
MOV AH,9
INT 21h
MOV AX,04c00h
INT 21h
Message DB "Hello World !$"
;----------------------------------------------
Analysons maintenant le contenu du programme. En premier lieu, nous avons MOV AX,03h et
INT 10h servent à initialiser le mode 03h (mode texte 80x25 carac.). Ces instructions sont
inutiles dans ce cas (c'est juste pour montrer) car le DOS est déjà en mode 80x25 mais si
un autre mode était en vigueur avant de lancer le programme, on pourrait avoir de petits
problèmes d'affichage sans l'initialisation du mode 80x25.
Ensuite nous avons le MOV DX,offset Message et MOV AH,9. Souvenez-vous, les instructions
demandent des paramètres. Le "offset Message" est le nombre correspondant à l'emplacement du
texte dans le programme (voir chapitre segment et offset). Il va permettre à l'instruction
INT 21h de trouver ce qu'il faut afficher. MOV AH,9 car c'est la fonction d'affichage d'une
chaîne de caractères.
A la fin, nous avons le MOV AX,04c00h qui indique que nous voulons la fonction de retour au
système d'exploitation et le INT 21h qui signale une interruption système. Le programme
retourne donc au système d'exploitation en affichant le texte (retour au DOS).
Encore une petite explication sur le texte. Le mot Message est le label qui sert à identifier
le texte, on aurait bien pu le remplacer par n'importe quoi (Text, Blabla,...) mais il
aurait fallu aussi modifier le MOV DX,offset Message en MOV DX,offset TEXT ou BLABLA. Lorsque
le programme est assemblée, les caractères sont transformés en nombre (leur code
ascii). Les ' qui englobent le texte indique une chaîne de caractères. Enfin, nous avons le
symbole $, il sert à indiquer la fin du texte, si on l'oublie, le programme ne sait pas
quand la chaîne se finit, et des problèmes d'affichage peuvent survenir
(voir meme des plantages dans les cas extremes).
### Chapitre 3 - dake / c a l o d o x ###
### http://www.space.ch/scene/calodox ###