TUTORIAL ASSEMBLEUR - chapitre 3
--------------------------------

Pile - Interruptions - Second programme
---------------------------------------

La pile (Stack) et ses instructions
-----------------------------------

La pile (stack en anglais) est un emplacement o des donnes de petites tailles peuvent tre 
places. Cette mmoire temporaire (elle se comporte comme la mmoire vive mais en plus petit) 
est utilise aussi dans les calculatrices et dans tous les ordinateurs. Le systme qu'elle 
employe pour stocker les donnes 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 place au premier rang (place en priorit par rapport aux autres 
valeurs dans la pile). Lors de la  lecture de la pile pour rcuprer la valeur, ce sera la
premire 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 dernire   tre lave, tandis que la premire assiette empile
sera lave au tout dbut. Mme 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 immdiate.

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 deuxime rang.

Exemple 2:

PUSH 1230
PUSH AX

Nous plaons dans la pile, la valeur 1230 (qui aurait pu tre aussi un 32 bits) 
et ensuite AX, ce qui place 1230 au deuxime rang.

Passons maintenant  l'instruction de "rcupration" qui se nomme POP (sortir-tirer). 
Cette instruction demande comme PUSH, une valeur de 16 ou 32 bits (seulement un registre). 
Elle prend la premire 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 (2me).

Exemple 2:

La premire 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 (2me puisque "pil" aprs)

POP CX
POP DX

Dans CX, nous avons la valeur de AX et dans DX, nous avons 1230.

La pile est trs 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 ultrieure. Malheureusement les instructions de la pile 
ralentissent le programme, la pile tant de toute faon plus lente que les registres qui sont
au coeur du CPU.

Les interruptions - Instructions
--------------------------------

Dans un ordinateur, il y a plusieurs priphriques (imprimante, souris, modem,...). Vous 
connaissez certainement le BIOS qui se charge chaque fois que vous allumez votre ordinateur. 
Il y a diffrents BIOS qui dpendent des constructeurs mais ils sont gnralement tous 
compatibles aux niveaux des interruptions. Le BIOS possde diffrentes fonctions, ce sont les 
interruptions. Ces interruptions sont divises en 7 parties principales (il y en a d'autres):

- Fonctions vidos (int 10h)
- Fonctions disques (int 13h)
- Fonctions de communication sur port srie (int 14h)
- Fonctions systme - 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 dtaille de chaque fonction (elles sont nombreuses, 
c'est pourquoi je ne peux les dtailler 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 
catgories d'interruptions. Pour pouvoir slctionner une fonction, il faut configurer les 
registres avec certaines valeurs que vous trouverez dans la liste d'interruptions (une 
dernire fois, procurez-vous en une !!!). Souvent, il faut juste changer AX mais parfois, tout 
les registres sont modifis. Ensuite on appelle INT accompagn du numro de catgorie de la 
fonction dsire. Par exemple, pour rentrer en mode texte 80x25 caractres, 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 catgorie 10h (fonctions vidos).
Et c'est tout. Les interruptions permettent de faire plus facilement certaines actions qui 
demanderaient une programmation plus complique. 

Deuxime 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 prcdent 
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 dj en mode 80x25 mais si 
un autre mode tait en vigueur avant de lancer le programme, on pourrait avoir de petits 
problmes 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 paramtres. 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 
chane de caractres. 

A la fin, nous avons le MOV AX,04c00h qui indique que nous voulons la fonction de retour au 
systme d'exploitation et le INT 21h qui signale une interruption systme. Le programme 
retourne donc au systme 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 assemble, les caractres sont transforms en nombre (leur code
ascii). Les ' qui englobent le texte indique une chane de caractres. Enfin, nous avons le 
symbole $, il sert  indiquer la fin du texte, si on l'oublie, le programme ne sait pas
quand la chane se finit, et des problmes 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 ###

