> 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 :
DOSSEG
MODEL SMALL

.STACK 100h
.DATA
.CODE

END ( attention j insiste END ) 
l

    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:
  • DOSSEG : Signifie que l on prend la segmentation du DOS (parce qu on programme sous DOS ;-))))))))))) )
  • MODEL SMALL : Signifie que l on prend un model memoire de type SMALL c est a dire: voir plus bas.
  • Stack : Declaration du segment de pile. Dans ce cas on a initialise la pile avec une taille de 256 octets
  • Data : Declaration du segment de donnees: C est ici que seront declarees les donnees
  • Code : Pareil mais pour le code
  • End : La bete noire de Jayce... Erreur fatale

     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...
    MOV AX,@DATA
    MOV DS,AX
    MOV AX,4C00h
    INT 21h
l

    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.
l Attention!!!!! Ne jamais oublier ces deux lignes dans un programme (et le END je sais) sous peine de ne pas retourner au dos a la fin de l execution du programme et la on ne peut rien pour vous vous n avez qu a vous en prendre a vous memes et que meme la force vous laissera tout seul...

     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:
    .DATA
        Phrase DB 'Exception (Jeff rends moi le clavier) (Bon,OKytgyni,huoj,;)
                   Il est vraiment ridicule ce gars',$

    .CODE
        Mov ax,@DATA
        Mov ds,ax
        Mov dx,offset Phrase
        Mov ax,0900h
        Int 21h
        Mov ax,4C00h
        Int 21h
    End
l

     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
l NB: pour des raisons de budget, la ligne suivante sera entierement dicte a la bouche

    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
>LES REGISTRES DU PROCESSEUR.

    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)
  • AX: Ce registre sert a tout. On y met ce que l on veut
  • BX: Pareil que AX mais il a quand meme une specialite. Il sert a gerer l adressage de base.
  • CX: Pareil que AX mais il sert aussi de registre de reference pour les boucles (instructions Loop,rep Movs ...).
  • DX: Comme AX mais il est utilise pour le resultat de certaines instructions de calcul (multiplication et division)


    Les registres d index (DI, SI, BP, SP)
  • DI: Signifie Destination Index. Il sert pour les copies memoires (Movs) et les comparaisons de chaines de caracteres (Scas).
  • SI: Signifie Source Index. Meme utilite que DI
  • BP: Il peut avoir la meme utilite que BX mais il sert aussi lors de creation de bibliotheques pour les langages de haut niveau ou il doit recevoir une valeur particuliere.
  • SP: Il va de pair avec SS (cf plus bas) pour former une adresse en vue d acceder a la pile (lorsqu elle existe, SP=Stack Pointer). Generalement on y touche pas.


    Les registres de segments (CS, DS, SS, ES)
  • CS: C est le segment de code. C est dans le segment de code que se trouve les instructions qui vont etre execute. Sa valeur peut etre changee notamment lors de l appel a des procedures (Call) mais ce changement est directement gere par l assembleur donc il n y a aucune raison que l on y touche (mais vous etes libre et ca fait des plantages rigolos).
  • DS: C est la dedans qu on planque les donnees. Lui aussi est directement gere par l assembleur.Il peut arriver que l on modifie mais il faut prendre garde a le sauver pour restaurer son contenu d origine une fois les manips terminees.
  • SS: Stack Segment.Permet d acceder a la pile (cf SP) ou des donnees peuvent etre sauvees par l utilisateur ou par le microprocesseur.
  • ES: Extra Segment. Il sert notamment dans les instructions de copie memoire.


    Le registre IP: IP=Instruction Pointer. Il va avec CS et pointe sur l instruction en cours de traitement.
l Remarques:
  • Toutes les registres ont une taille de 16 bits.
  • A partir du 80386 les registres generaux ont une taille de 32 bits On a donc acces aux registres EAX, EBX, ECX, EDX mais AX, BX, CX et DX restent accessibles. De plus sur tous les 80x86 ces registres peuvent etre utilises comme des registres 8 bits: AX se decompose en AL et AH (AL = A Low et AH = A High) Pareil pour BX (BL et BH), CX (CL, CH), DX (DL, DH).

    Le registre des indicateurs.

     C est un registre un peu special. Il a une taille de 16 bits et est gere bit par bit.
  • bit0 = CF : Carry Flag. Si apres une instruction de calcul il y a une retenue ce registre est a 1 sinon il est a 0.
  • bit1 : inutilise.
  • bit2 = PF : Parity Flag. Si apres une operation le resultat a un nombre pair de bits a un alors il est a 1 sinon il est 0.
  • bit3 : inutilise.
  • bit4 = AF : bof.
  • bit5 : inutilise.
  • bit6 = ZF : Zero Flag. Si le resultat d une operation est 0 alors il est mis a 1 sinon c est zero.
  • bit7 = SF : Sign Flag. Si SF=1 alors le resultat de l operation est negatif sinon c est positif.
  • bit8 = TF : bof (sert pour les debuggers).
  • bit9 = IF : Interruption Flag. Permet d empecher les interruptions de se declencher.
  • bit10 = DF : Direction Flag. Sert dans les copies memoires.
  • bit11 : OF : Overflow Flag. Lors d operations sur des nombres signes si le resultat est plus grand que le registre qui contient le resultat ce bit est a 1 sinon c est 0.

>LES MODELES MEMOIRES.

     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.
  • TINY : Sert a creer les fichiers .COM
  • SMALL : Le code et les donnees tiennent dans 64Ko.
  • MEDIUM : Les donnees tiennent dans 64Ko et le code dispose de 640Ko.
  • COMPACT : Ici le code doit tenir dans 64Ko et les donnees ont 640Ko.
  • LARGE : Code et donnees ont 640Ko.
>LES INTERRUPTIONS.

     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:
  • DOS ( tout ce qui est Int 21h ).
  • BIOS ( tout le reste ).
>Quel assembleur on utilise.

     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 /? .
>CONCLUSION

     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.