MEMO Assembleur

From Atari Wiki
Revision as of 14:50, 11 October 2011 by Admin (talk | contribs)
Jump to navigation Jump to search

                              MEMO ASSEMBLEUR
                                ---------------

    Ce  qui  suit  n'est  pas  une  initiation  …  l'assembleur  ni  mˆme  une 
    documentation  technique,  mais  plut“t  un  aide m‚moire sur l'assembleur 
    68000. Ce document vous sera utile imprim‚, ou bien charg‚ en m‚moire dans 
    un ‚diteur de textes r‚sident, de maniŠre … l'avoir en permanence sous les 
    yeux.


    Les registres
    -------------

    Registres de donn‚es.
    8 registres de 32 bits : D0, D1, D2, D3, D4, D5, D6, D7.

    Registres d'adresses.
    7 registres de 32 bits : A0, A1, A2, A3, A4, A5, A6.
    1 pointeur de pile : A7 (SP).

    Compteur d'instructions sur 32 bits : PC

    Registre d'‚tat de 16 bits : SR.

        5 bits de mode utilisateur :
        Bit 0 : Drapeau de retenue (Carry).
        Bit 1 : Drapeau de d‚passement (oVerflow).
        Bit 2 : Drapeau du valeur nulle (Zero).
        Bit 3 : Drapeau de n‚gativit‚ (Negative).
        Bit 4 : Drapeau d'extension (eXtend).

        5 bits de mode superviseur :
        Bit 8-10 : Masque d'interruption (7 niveaux).
        Bit 13 : Mode superviseur.
        Bit 15 : Mode Trace.



    Les modes d'adressages.
    -----------------------

    La syntaxe g‚n‚rale est :
    [Commande] [Op‚rande source], [Op‚rande destination].
    Le format des donn‚es est :
        .L : mot long (32 bits)
        .W : mot court (16 bits)
        .B : octet (8 bits)

        Registre direct.
        -----------------
        L'op‚rande se trouve dans un registre.
        Ex : move.w D0,D1
        => Mettre le contenu de D0 dans D1.

        Adressage absolu.
        -----------------
        L'op‚rande se trouve dans une adresse de la m‚moire.
        Ex : move.l $FF8240,A0
        => Mettre le contenu de l'adresse $FF8240 dans A0.

        Adressage relatif au PC.
        ------------------------
        L'op‚rande  se trouve dans une adresse m‚moire calcul‚e par rapport au 
        compteur d'instructions.
        Ex : move.l $1000(PC),D0
        => Mettre le contenu d'une adresse se trouvant … PC + $1000 octets.
        Il  est ‚galement possible d'ajouter … ce d‚calage le contenu d'un re-
        gistre.
        Ex : move.l A0,10(PC,D0)
        =>  Mettre  le  contenu  de  A0 dans une adresse se trouvant … PC + 10 
        octets + le contenu de D0.
        Dans  tous les cas, le d‚calage de l'op‚rande destination ne porte sur 
        que sur 8 bits, et la taille du registre ajout‚ doit ˆtre un mot de 16 
        bits.

        Adressage indirect.
        -------------------
        L'adresse de l'op‚rande se trouve dans un registre d'adresse.
        Ex : move.l A0,(A1)
        => Mettre le contenu du registre A0 dans l'adresse que contient le re-
        gistre A1.

        Adressage indirect post incr‚ment‚.
        -----------------------------------
        L'adressage s'effectue comme un adressage indirect, mais le contenu du 
        registre  d'adresse  est  incr‚ment‚  de la taille de l'op‚rande APRES 
        l'ex‚cution de la commande.
        Ex : move.b D0,(A0)+
        =>  Mettre  le  contenu  du registre D0 dans l'adresse que contient le 
        registre  A0, puis l'adresse que contient le registre A0 est augment‚e 
        de 1 octet (.B).
        Ex : move.l (A1)+,(A0)+
        =>  Mettre  le  contenu  de l'adresse que contient le registre A1 dans 
        l'adresse   que  contient  le  registre  A0,  puis  les  adresses  que 
        contiennent A1 et A0 sont augment‚es de 4 octets (.L).

        Adressage indirect pr‚ d‚cr‚ment‚.
        ----------------------------------
        L'adressage s'effectue comme un adressage indirect, mais le contenu du 
        registre  d'adresse  est  d‚cr‚ment‚  de la taille de l'op‚rande APRES 
        l'ex‚cution de la commande.
        Ex : move.l D0,-(A7)
        =>  D‚cr‚menter  de 4 octets l'adresse que contient le registre A7, et 
        mettre  le contenu de D0 dans cette adresse. Le registre A7 servant de 
        pointeur  de  pile, cette op‚ration ‚quivaut … ranger le contenu de D0 
        au sommet de la pile.

        Adressage indirect avec d‚calage.
        ---------------------------------
        L'adressage s'effectue comme un adressage indirect, mais on rajoute un 
        d‚calage de 16 bits au contenu du registre d'adresse.
        Ex : move D0,2(A0)
        =>  Mettre  le contenu de D0 dans l'adresse + 2 octets que contient le 
        registre A0.

        Adressage indirect ind‚x‚ avec d‚calage.
        ----------------------------------------
        L'adressage s'effectue comme un adressage indirect avec d‚calage, mais 
        on  rajoute  le  contenu  d'un  autre  registre au contenu du registre 
        d'adresse.
        Ex : move.l 10(A0,D0),D1
        =>  Prendre l'adresse contenue dans A0, lui ajouter 10 + le contenu de 
        D0;  prendre le contenu de cette adresse et le mettre dans le registre 
        D1.

        Adressage imm‚diat.
        -------------------
        L'op‚rande source est prise comme telle.
        Ex : move #$10000,A2
        => Mettre la valeur $10000 dans le regisre A2.
        Il  existe  une  variante  QUICK  qui  permet  d'adresser  des valeurs 
        imm‚diates  plus  rapidement (la commande prend moins de cycles); pour 
        cela,  il  faut que la valeur tienne sur 3 bits, sauf pour la commande 
        MOVE  o—  elle  peut  tenir sur 8 bits, … condition que la destination 
        soit un registre de donn‚es.
        Ex : moveq #100,D0
        Ex : addq.l #1,A0



    Les instructions.
    -----------------


        Variantes :
        -----------

            Les variantes des instructions sont des suffixes qui sont plac‚s … 
            la fin de la commande.

            A  : Indique que l'op‚rande destination est un registre d'adresse. 
            La plupart des assembleurs le font automatiquement.
            Ex : movea.l D0,A1

            I  :  Indique  que  l'op‚rande source est une donn‚e imm‚diate. La 
            plupart des assembleurs le font automatiquement.
            Ex : addi.l D0,A1

            Q : Indique que l'adressage imm‚diat doit ˆtre trait‚ en QUICK (cf 
            plus haut).
            Ex : moveq #$C0,D0

            X : Sert … reconnaŒtre les op‚rations arithm‚tiques qui se servent 
            du  drapeau  X (extend). En g‚n‚ral, ce drapeau prend la valeur de 
            la  retenue  (carry);  mais il arrive que la retenue soit modifi‚e 
            par  des  op‚rations  de transfert de donn‚es sur 32 bits. Dans ce 
            cas, le drapeau X, lui, n'est pas modifi‚ et reste disponible pour 
            la suite des calculs.


        Sens des op‚rations :
        ---------------------

            Dans le cas d'op‚rations arithm‚tiques ou logiques, le r‚sultat de 
            l'op‚ration se trouve toujours dans l'op‚rande de destination.
            Ex : add D0,D1
            =>  Ajoute le contenu de D0 au contenu de D1; le r‚sultat est dans 
            D1.


        Format des op‚rations :
        -----------------------

            Toutes les instructions peuvent poss‚der une extension de type .B, 
            .W ou .L. Celle-ci pr‚cise la taille du traitement de l'op‚ration. 
            Par  exemple,  bien qu'un registre de donn‚e porte sur 32 bits, la 
            commande  clr.b  D0  n'effacera  que  l'octet le plus faible de ce 
            registre.  La  plupart  des  assembleurs  considŠrent la taille .W 
            comme ‚tant implicite.
            Ex : move #1,D0 ‚quivaut … move.w #1,D0.


        Les commandes :
        ---------------

            ABCD (Add Decimal with Extend)
            Aditionner deux valeurs de type Binaire Cod‚ D‚cimal.
            Ex : abcd #$34,D0

            ADD (Addition binary)
            Additionner les deux op‚randes.
            Ex : adda.l D1,A2

            AND (Logical And)
            Effectuer un ET logique entre les deux op‚randes.
            Ex : andi #$7F,D0

            ASL (Arithmetic Shift Left)
            Effectuer  un  d‚calage  de bits vers la gauche. Le nombre de bits 
            d‚cal‚s  est  sp‚cifi‚  par  l'op‚rande source. Le bit de poids le 
            plus  fort  est  plac‚ dans C et X, le bit de poids le plus faible 
            est  remplac‚  par  un  0. La taille de l'op‚rande source est de 3 
            bits  en adressage imm‚diat, ou de 16 bits s'il est dans un regis-
            tre.  Pour la plupart des assembleurs, l'absence d'op‚rande source 
            ‚quivaut … un d‚calage de 1 bit.
            Ex : asl #2,D0

            ASR (Arithmetic Shift Right)
            Effectuer  un  d‚calage  de bits vers la droite. Le nombre de bits 
            d‚cal‚s  est  sp‚cifi‚  par  l'op‚rande source. Le bit de poids le 
            plus  faible  est  plac‚ dans C et X, le bit de poids le plus fort 
            est  remplac‚  par le bit de signe. La taille de l'op‚rande source 
            est  de  3 bits en adressage imm‚diat, ou de 16 bits s'il est dans 
            un registre. Pour la plupart des assembleurs, l'absence d'op‚rande 
            source ‚quivaut … un d‚calage de 1 bit.
            Ex : asr A1

            Bcc (Branch Condionally)
            G‚rer des sauts conditionnels. La destination du saut est toujours 
            une adresse relative allant de -128 … +127 octets. L'ex‚cution ef-
            fective  du  saut d‚pend de la condition pos‚e par les drapeaux du 
            registre SR.

                BRA : BRanch Always
                => Saut inconditionnel.
                BCC : Branch Clear Carry
                => Saut si C=0.
                BCS : Branch Carry Set
                => Saut si C=1.
                BEQ : Branch EQual
                => Saut si Z=1.
                BGE : Branch Greater or Equal
                => Saut si (N=1 ET V=1) OU (N=0 ET V=0)
                BGT : Branch Greater Than
                => Saut si (N=1 ET V=1 ET Z=0) OU (N=0 ET V=0 ET Z=0)
                BHI : Branch HIgher
                => Saut si (C=0 OU Z=0)
                BLE : Branch Lesse or Equal
                => Saut si Z=1 OU (N=1 ET V=0) OU (N=0 ET V=1)
                BLS : Branch Lower or Same
                => Saut si C=1 OU Z=1
                BMI : Branch MInus
                => Saut si N=1
                BNE : Branch Not Equal
                => Saut si Z=0
                BPL : Branch PLus
                => Saut si N=0
                BVC : Branch oVerflow Clear
                => Saut si V=0
                BVS : Branch oVerflow Set
                => Saut si V=1
                
            BCHG (Bit Test and Change)
            Le  bit  donn‚ par l'op‚rande source de l'op‚rande destination est 
            invers‚.  L'‚tat  d'origine  est  enregistr‚  dans Z. La taille de 
            l'op‚rande  source  est  .B  si elle se trouve en m‚moire ou .L si 
            elle se trouve dans un registre.
            Ex : bchg #1,D1
            
            BCLR (Bit Test and Clear)
            Le bit donn‚ est effac‚. Le reste est identique … BCHG.
            Ex : bclr #3,$1234
            
            BSET (Bit Test and Set)
            Le bit donn‚ est mis … 1. Le reste est identique … BCHG.
            Ex : bset (A0)
            
            BSR (Branch to Subroutine)
            Saut  inconditionnel  …  un sous programme. La destination du saut 
            est toujours une adresse relative allant de -128 … +127 octets.
            Ex : bsr truc
            
            BTST (Bit Test)
            Test  de l'‚tat du bit donn‚, sans le modifier. Le reste est iden-
            tique … BCHG.
            Ex : btst D0
            
            CHK (Check Register against Boundaries)
            V‚rification si le contenu d'un registre de donn‚es est plus grand 
            que  l'op‚rande  source; si tel est le cas, le processeur se bran-
            che sur le vecteur d'exception No 6, et le programme se poursuit … 
            l'adresse  qui  est indiqu‚e … l'adresse $18. Dans les autres cas, 
            il ne se passe rien.
            Ex : chk #$FE,D0
            
            CLR (Clear Operand)
            L'op‚rande donn‚e est effac‚e.
            Ex : clr.l D0
            
            CMP (Compare)
            L'op‚rande  source  est soustraite de l'op‚rande destination, sans 
            que  celle-ci  soit  modifi‚e.  Les  drapeaux  du registre SR sont 
            positionn‚s  selon  le  r‚sultat.  Avec la variante CMPM, les deux 
            op‚randes sont adress‚es selon le mode (Ax)+.
            Ex : cmp #2,D0
            
            DBcc (Test Condition Decrement and Branch)
            Un  registre  de  donn‚es  est  d‚cr‚ment‚ et le saut est effectu‚ 
            selon  le test des drapeaux de SR, ou si le registre est diff‚rent 
            de -1. Les conditions et l'‚tendue du saut sont identiques … Bcc.
            Ex : dbra D0,truc
            
            DIVS (Divide Signed)
            L'op‚rande  destination  est  divis‚e  par l'op‚rande source, avec 
            consid‚ration   des  signes.  AprŠs  cette  op‚ration,  l'op‚rande 
            destination  renferme  dans sa partie inf‚rieure la partie entiŠre 
            du  r‚sultat,  et dans sa partie sup‚rieure, le reste ‚ventuel qui 
            pr‚sente le mˆme signe que le quotient.
            Ex : divs #2,D0
            
            DIVU (Divide Unsigned)
            Mis  … part le signe qui n'est pas utilis‚ ici, tout est identique 
            … DIVS.
            
            EOR (Exclusive Or)
            Effectuer un OU exclusif logique entre les deux op‚randes.
            Ex : eor #$7F,D0
            
            EXG (Exchange Register)
            Interversion de deux registres.
            Ex : exg D0,D1
            
            EXT (Sign Extend)
            L'op‚rande  est  compl‚t‚e  avec son bit 7 (.W) ou avec son bit 15 
            (.L) pour ˆtre mise au format de traitement.
            Ex : ext.l D0
            
            JMP (Jump)
            Saut inconditionnel … l'adresse donn‚e. La diff‚rence avec BRA est 
            que l'adresse n'est pas relative, mais repr‚sente effectivement la 
            destination du saut.
            Ex : jmp (A2)
            
            JSR (Jump to Subroutine)
            Saut  inconditionnel  …  un sous-programme. la diff‚rence avec BSR 
            est la mˆme qu'entre JMP et BRA.
            
            LEA (Load Effective Address)
            Chargement  d'un  registre  d'adresse avec l'adresse elle-mˆme, et 
            non pas avec le contenu de l'adresse.
            Ex : lea truc, A1
            
            LINK (Link Stack)
            Cette  instruction  place tout d'abord le registre d'adresse donn‚ 
            en  op‚rande  source  sur  la pile. Le contenu du pointeur de pile 
            (SP)   est   ensuite   transf‚r‚  dans  ce  registre,  et  il  est 
            ‚ventuellement   additionn‚   au  d‚calage  donn‚  par  l'op‚rande 
            destination et plac‚ su le pointeur de pile.
            Ex : link a6,#0
            
            LSL (Logical Shift Left)
            Identique … ASL.
            
            LSR (Logical Shift Right)
            Identique  …  ASR,  mais le bit de poids le plus fort est remplac‚ 
            par un 0 et non par le bit de signe.
            
            MOVE
            L'op‚rande source est transf‚r‚e dans l'op‚rande destination.
            
            MOVEM (Move Multiple Registers)
            Dans  ce  cas  particulier,  l'op‚rande peut ˆtre constitu‚e d'une 
            liste  de  registres.  De  cette  maniŠre,  une  liste complŠte de 
            registres peuvent ˆtre empil‚s en une seule instruction.
            Ex : movem.l D0-D4,-(SP)
            
            MOVEP (Move Peripheral Data)
            Transfert  de  donn‚es  pour l'emploi de p‚riph‚riques. L'op‚rande 
            source est toujours un registre de donn‚es, et l'op‚rande destina-
            tion un registre d'adresse indirect avec d‚calage.
            Ex : movep d0,12(A0)
            
            MULS (Multiply Signed)
            Multiplication des deux op‚randes avec respect du signe.
            Ex : muls #2,D1
            
            MULU (Multiply Unsigned)
            Multiplication des deux op‚randes sans consid‚ration du signe.
            
            NBCD (Negate Decimal with Extend)
            N‚gation d'une op‚rande BCD avec le drapeau X.
            Ex : nbcd D1
            
            NEG (Negate Binary)
            N‚gation de l'op‚rande donn‚e. Correspond … (0 - op‚rande).
            Ex : neg D1
            Variante : NEGX qui correspond … (0 - op‚rande - X).
            
            NOP (No Operation)
            Instruction qui n'a aucun effet, mais qui consomme deux cycles.
            
            NOT (Logical Not)
            Effectue un NON logique sur l'op‚rande.
            Ex : not D0
            
            OR (Logical Or)
            Effectue un OU logique entre les deux op‚randes.
            Ex : or #$3F,D0
            
            PEA (Push Effective Address)
            L'adresse d‚sign‚e, et non son contenu, est empil‚e.
            Ex : pea truc(pc)
            
            RESET (Reset External Devices)
            Provoque  la  remise  …  z‚ro de tous les composants p‚riph‚riques 
            connect‚s. C'est une instruction privil‚gi‚e.
            
            ROL (Rotate Left)
            Provoque  une  rotation  vers la gauche de l'op‚rande destination. 
            Le  nombre  de  rotations est d‚sign‚ par l'op‚rande source. Le ou 
            les bits perdus sont r‚introduits par la droite. Cette instruction 
            modifie le drapeau C.
            Ex : rol #2,D0
            
            ROR (Rotate Right)
            Mˆme  action  que  ROL, … la diff‚rence que la rotation s'effectue 
            par la droite.
            
            ROXL (Rotate Left with Extend)
            Semblable  …  ROL,  …  la diff‚rence que le bit ‚ject‚ est recopi‚ 
            dans le drapeau X, qui prend sa place.
            Ex : roxl #4,(A0)
            
            ROXR (Rotate Right with Extend)
            Mˆme  action  que ROXL, … la diff‚rence que la rotation s'effectue 
            par la droite.
            
            RTE (Return from Exception)
            Retour de la routine d'exception, … l'endroit o— l'exception a ‚t‚ 
            rencontr‚e. C'est une instruction privil‚gi‚e.
            
            RTS (Return from Subroutine)
            Retour d'un sous-programme, … l'endrit o— celui-ci a ‚t‚ appel‚.
            
            RTR (Return and Restore)
            Semblable  …  l'instruction  pr‚c‚dente, mais avant le saut de re-
            tour, l'instruction prend le mot au sommet de la pile pour le met-
            tre dans SR.

            SBCD (Subtract Decimal With Extend)
            L'op‚rande  source  est  soustraite  de l'op‚rande destination. le 
            format des donn‚es est BCD.
            
            Scc (Set Conditionally)
            L'op‚rande  (qui  ne  peut  ˆtre  que  .B)  est plac‚e … $FF si la 
            condition  est remplie. Dans les autres cas, elle est effac‚e. les 
            tests sont semblables … Bcc.
            Ex : sne D0
            
            STOP
            Interrompt  le  traitement du processeur qui ne peut ˆtre r‚activ‚ 
            que  par  une interruption externe. C'est une instruction privil‚-
            gi‚e.
            
            SUB (subtract Binary)
            L'op‚rande source est soustraite de l'op‚rande destination.
            Ex : sub #10,D1
            
            SWAP (Swap Register Halves)
            Interversion des deux moiti‚s d'un registre.
            Ex : swap d0
            
            TAS (Test and Set)
            L'op‚rande (qui ne peut ˆtre que .B) est test‚e par rapport … z‚ro 
            et sur son signe (C et N), puis son bit 7 est mis … 1.
            Ex : tas D0
            
            TRAP
            D‚clenche  un exception de fa‡on fictive, et le programme se pour-
            suit … l'adresse pr‚cis‚e par le num‚ro du vecteur donn‚. Par cet-
            te  commande,  on peut appeler les fonction du systŠme d'exploita-
            tion (GEMDOS, BIOS, XBIOS, AES et VDI).
            Ex : trap #1
            
            TRAPV (Trap on Overflow)
            D‚clenche  une  exception si le drapeau V est … 1, et le programme 
            continue … l'adresse donn‚e par le vecteur d'exception No 7 ($1C).
            
            TST (Test)
            Mˆme action que TAS, mais l'op‚rande n'est pas modifi‚e.
            Ex : tst D0
            
            UNLK (Unlink)
            Cette  instruction  est l'inverse de LINK. Le pointeur de pile est 
            charg‚  avec le registre d'adresse donn‚, et ce dernier est rempli 
            avec le dernier enregistrement de la pile.



Back to Assembly_language