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 ###