> Théorie |
PrograZine issue #9 - http://www.citeweb.net/discase/9/ASMTUT.htm | Edito | Sommaire | Contribution | Contacts |
Un tutorial sur l'assembleur
par Sylvain Gaeremynk - 8 Rue Beethoven 59420 Mouvaux |
Débutant | DOS | Assembleur |
Quelque part en France Jayce chevalier de la force lumiere cherche a faire partager son experience de l assembleur avec Sly. Sly : Bonjour Jayce alors comment tu vas bien aujourd hui Jayce : Aujourd hui je vais bien et toi tu vas bien comme je vais bien S : Ouais Ouais. Bon y parait que tu as enfin reussis a aligner deux lignes d assembleur sans faire d erreur... J : J ai fais confiance a la force lumiere (l anneau) mais tu t es plante dans le chiffre deux je t en prie mon cher Sly... S : Ola respect. Je te signal que c est moi qui t es tout appris. M enfin je sais que t es pas si nul. Rapelle moi l entete d un fichier assembleur pour voir. J : Ah Ah Ah ... Anneau de lumieeeeerrrrreeee :
S : Bon retire la lampe de ma gueule ca fait mal aux yeux. C est vrai que tu deviens impressionnant mon coco. Je rapelle quand meme la signification de chaque terme:
Mais au fait tu nous mettrais pas un petit bout de code pour rendre tout ca un peu interessant. J : T aimes pas ma lampe ? Voyons voir...
S : Oh putain (je vais me faire censurer) le gars. T es un vrai genie Jayce. Bon je rapelle que Mov sert a deplacer une valeur d un accumulateur a un autre (Mov ax,dx par exemple) ou une donnee dans un accu (Mov ax,Ma_Belle_Donnee) On peut aussi faire des melanges (Mov ma_donnee,ax) ... D autres exemples viendront lors des transferts de zones memoires mais pour l instant ca suffit. J : Pas tout a fait. Ben oui il faut se rendre a l evidence ces lignes de code ressemblent a un cours de physiques de spe (surtout avec certains prof). Le Mov ax,@data et le Mov ds,ax sont lies en ce sens qu (je sais pas ce que ca veut dire) il faut charger les donnees dans le segment adequat a savoir DS. Mais on n y a pas acces directement donc on a recourt a un accu (ici ax). Les deux dernieres lignes permettent de rendre la main au dos. Pour ce faire on utilise le service 4C00h de l interuption 21h.
Il serait cool d expliquer (sans exemples et sans schemas) le fonctionnement de la pile... S : Le probleme Jayce c est que depuis tout a l heure y a quatre gars qui sont rentres dans ma piaule sans crier gare. Alors surtout ne te retournes pas. Bon la pile fonctionne comme une pile d assiette. Tu prends une pile d assiette. Si tu mets une assiette au dessus (i.e. empile une donnee ) tu devras la depiler en premier pour pouvoir acceder a celles d en dessous. Une pile fonctionne donc sur le schema LIFO (Last In First Out). Mais je me demande pourquoi tu parles de ca parce que tu sais meme pas faire un push ( push ax permet d empiler le contenu de ax) et encore moins un pop (pop ax met le contenu du haut de la pile dans ax). Mais avant d acceder a la pile ca serait bien de donner un exemple avec les donnees. Vas y explique nous ces lignes Jayce:
Alors tu dis plus rien... J : Je vais te refoutre ma lampe dans la gueule : Anneau de luu... S : Vas y Jeff chope lui les bras... Jeff : Je ne peux pas lui choper les bras et taper sur le clavier en meme temps... J : EERREEUURR FFAATTAALLEE S : NOOOOOOOOONNNNNNNNNNNNNNNNN J : ...mmmiiieeerrrreee S: AAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHH Jeff : GNARRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHH
J : S : Jeff : S : (NB : merci de votre comprehension) J : ... et tu pourras te la faire extraire par un chirurgien !!! Bon les deux premieres et dernieres lignes n ont plus de secret pour vous. Il faut savoir quand meme que l assembleur etant un langage de tres bas niveau il faut tout lui dire meme la localisation des espaces memoires. C est pourquoi il faut sauver dans accu (generalement) l adresse de la memoire ou se trouve le texte a afficher (ben oui ces lignes permettent d afficher un texte a l ecran). Cela s appelle l OFFSET. Ensuite on invoque le service 0900h de l interruption 21h. C est en effet le service qui permet d afficher un texte a l ecran. Le texte a afficher doit se trouver dans le segment DS a l adresse DX : DS:DX. C est pourquoi on a mis l offset dans DX (les deux premieres lignes permettant de charger les donnees dans le segment DS). S : Ok Jayce, j avoue: tu es tres fort pour expliquer un petit prog comme ca. Mais ce que je voudrais savoir c est lorsque tu as commence a programmer en assembleur ( c est a dire il y a six mois (anecdote : le DVD de Jayce etait en conflit avec le linker!!!!! ) ) qu est ce qui t as pose des difficultes ou qu est ce que tu aurais aime savoir faire plus vite. J : Debutants comme vous etes il faudra maitriser avec aisance la base deux (le binaire) et l ecriture hexadecimale (base seize). Il n y a pas de secret: travail quotidient sueur deprime... Un jour en croisade avec chevalier Faktoryail je me suis initie au fonctionnement inverse de la pile. Le combat fut rude : contrer des push repondre avec des pop. Combat si impressionnant que Sly trouve inutile ce genre de gymnastique (Sly est tres doux DL peut temoigner). N est ce pas ? S : Bon Jayce si c est pour dire des conneries c est pas la peine de venir. Mais c est vrai tu as raison: L assembleur demande beaucoup de travail et une maitrise de l hexadecimal (cf prograzine 2). Mais comme tu commences a fatiguer on va en rester la pour l instant. Dans le deuxieme fichier certaines structures sont approfondies. Allez dis au revoir Jayce. J : Aanneeaauuuee ddeee llluuuummmm... S : ????? The End. Bon, plus serieusement je vais continuer seul cette introduction a la programmation en assembleur (Jayce etant retourne a ses penattes). Pourtant meme si ce dialogue semble etre completement debile (si bon d accord) je crois qu il jette la base de la syntaxe d un programme en assembleur Si vous comprenez pas tout des le depart c est pas grave: ca viendra au fur et a mesure
Je vais presenter ici les registres des processeurs 80x86. Les registres sont des emplacements memoires internes au processeur donc leur acces est tres rapide. Les registres generaux (AX, BX, CX, DX)
Les registres d index (DI, SI, BP, SP)
Les registres de segments (CS, DS, SS, ES)
Le registre IP: IP=Instruction Pointer. Il va avec CS et pointe sur l instruction en cours de traitement.
Le registre des indicateurs. C est un registre un peu special. Il a une taille de 16 bits et est gere bit par bit.
Vous vous souvenez plus haut on a utilise le modele SMALL pour notre programme.Et bien il est temps de comprendre a quoi ca correspond.
Les interruptions sont des sous-programmes que l ordinateur a dans la memoire pour que tous les ordinateurs soient compatibles. Il y en a deux sortes:
Bof, y en existe beaucoup. Personnellement j utilise TASM (donc tout ce qu on a vu est valable avant tout pour lui) mais il y en a d autres comme MASM (compatible avec TASM), A86 et NASM pour les plus connus. NASM est freeware et est compatible avec Windows95 et compagnie ce qui lui donne peut etre l avantage par rapport aux autres. Les autres generent du code DOS. Avec TASM la syntaxe sera TASM fichier.asm ce qui va creer un fichier .obj . Pour creer le fichier .exe il faut utiliser un linker, ici ca sera TLINK donc TLINK fichier.obj . Il est possible qu un fichier .map soit cree; il contient des informations sur les segments utilises. Pour plus d infos consulter une voyante ou faites TLINK /? et TASM /? .
Essayer de trouver HELPPC de David Jurgens sur le Net: Il contient la description de toutes les interruptions et des instructions assembleur. La fois prochaine on verra tout ce qu il faut savoir sur la memoire du PC et l addressage. D ici la, coder bien May the force be with you ... |
Cet article est la propriété de Sylvain Gaeremynk . La copie et la diffusion sont libres sauf dans un but lucratif sans accord explicite de l'auteur. |