Pl INSTRUC.DOC/fr

From Atari Wiki
Jump to navigation Jump to search


                         -------------------------
                            CHAPITRE    QUATRE

                         LES INSTRUCTIONS DU 68000

                         -------------------------



                     *** LES INSTRUCTIONS DU 68000 ***
                     ---------------------------------

- Voilà un chapitre qui est consacré en entier aux différentes 
  instructions de l'assembleur 68000.

- Maintenant que vous savez, grƒce aux modes d'adressage,atteindre les
  données en mémoire, nous allons nous interesser aux instructions qui
  permettent de modifier,déplacer... donc de se servir des données.

- Pour chaque instruction, je vous donnerais:
 
  .La syntaxe pour l'instruction et ses opérandes.
  .Ses effets,son but.
  .Les modes d'adressages autorisés pour les opérandes.
  .L'effet de l'instruction au niveau des registres et notament au 
   niveau du CCR.
  .Et bien sur des exemples d'utilisation...

- De nouvelles notions apparaitront dans les explications conscernant
  les instructions, elles seront détaillées,expliquées et commentées.



                           --------------------

                    *** LES INSTRUCTIONS DU 68000 ***
                    ---------------------------------

     
   MOVE       source,destination   :(.B),[.W],(.L)
   -----------------------------
   Les 3 tailles d'opérations sont autorisées pour cette instruction,
   La taille [.W] est prise par défaut.
   
   L'opérande 'source' est copiée (et demeure inchangée) à (dans) 
   l'opérande 'destination'

   Les modes d'adressages autorisés pour l'opérande source sont:
                                                    ------
     dn       (registres de données)
     an       (registres d'adresses)
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

   Les modes d'adressage autorisés pour l'opérande destination sont:
                                                   -----------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


   Au niveau du CCR: Seuls les Bits N et Z sont affectés 
                ---


   Exemple d'utilisation:
   ----------------------  
     Move.l    #1456701,d0

     On pose le L-M égal à 1256701 dans le registre de donnée d0

       

   MOVEQ        #D,dn       
   ------------------
   L'opérande source est une donnée immédiate,signée,contenue dans un
   octet (-128<= D <128)
   L'opérande destination est un registre de donnée

   On copie la donnée source,signée,contenue dans un octet dans un 
   registre de donnée après avoir ETENDU LE SIGNE DU REGISTRE:
   
      C.à.d. que la donnée est placée dans l'octet de poids faible du 
   registre Dn et que le MSB a été étendu (copié) jusqu'au 31° bit du
   registre,ceci afin que le registre de donnée soit affecté en entier
   par le  'chargement' de la donnée et que le signe de la donnée soit
   conservé.

   L'opérande source admet donc le mode d'adressage:
              ------
   #BBB   ( -128<= BBB <128 )

   L'opérande destination admet est un registre de donnée.
              -----------              ------------------


   Seuls les Bits N et Z du CCR sont affectés par cette instruction
                            ---  

   Exemple:
   --------
   MOVEQ  #%01100101,d0

   On pose l'octet 01100101 dans d0:

   d0= :          00000000000000000000000001100101
          Bit nr 31                       .
                  .                       .    
             MSB (0) <---------------MSB (0)   

   Il y a eu extension du signe de d0 (ici MSB=0 car 01100101>0)

   NB:Moveq se distingue de Move par une plus grande rapidité, mais
   -- n'oubliez pas les conditions d'utilisation de Moveq !



   MOVEA      source,an   :(.W),(.L)
   --------------------
   L'instruction Movea complète l'instruction Move car elle accepte un
   Registre d'Adresse pour opérande destination.
   
   Sur la plupart des assembleurs,la syntaxe MOVE  source,an est
   acceptée et automatiquement traduite par  MOVEA source,an

   Si l'opérande source utilise la taille d'opérantion .W, il y a
   extension du signe du registre d'adresse an.
   La taille .B n'est pas autorisée pour MOVEA.


   Les modes d'adressage autorisés pour l'opérande source sont:
                                                   ------
     dn
     an  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)


   L'opérande destination est un registre d'adresse
              -----------        ------------------
   L'instruction MOVEA n'influence pas le CCR.
                                          ---

   Exemple d'utilisation:
   ----------------------
   MOVEA.L   #etiq,a5

   Le registre d'adresse a5 est chargé avec l'adresse pointée par le
   label 'etiq'



   LEA    source,an      : [.L]
   ----------------
                   
   Cette instruction se lit:'Load Effective Address'

   Seule la taille d'opération .L est possible,elle est d'ailleurs prise
   par défaut.

   Elle permet de poser l'adresse pointée par l'opérande source dans
   un registre d'adresse.

   L'opérande source admet les modes d'adressage:
              ------

     BBBB
     BB     
     (an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

   L'opérande destination est un registre d'adresse
              -----------        ------------------             
   
   L'instruction LEA n'influence pas le CCR
                                        ---

   Exemple d'utilisation:
   ----------------------
   LEA    etiq,a2

   On pose l'adresse pointée par le label 'etiq' dans le registre
   d'adresse a2.
   En fait,cela peut aussi se faire avec MOVE.L  #etiq,a2 ,  mais
   c'est moins rapide.         



   CLR    destination    :(.B),[.W],(.L)
   ------------------

   Cette instruction se lit: 'CLeaR  destination'  

   Et permet de mettre à 0 tous les bits de l'opérande destination.
   
   Elle admet les 3 tailles d'opération.

   Les modes d'adressages autorisés pour l'opérande destination sont:      
                                                    -----------
     dn 
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

       
   Le bit Z du CCR est mis à 1 , les Bits N,V,C à 0.
               ---

   Exemple d'utilisation:
   ----------------------
   CLR.W   D0

   Les 16 Bits du MOT de poids faible de d0 sont mis à 0.             


   NEG       destination     : (.B),[.W],(.L)
   ---------------------  

   Permet d'effectuer la NEGation de l'opérande destination.
 
   Les 3 tailles d'opération sont possibles.

   L'opérande destination est soustraite de 0, ceci a pour effet de
   changer le signe de l'opérande:Les Bits qui étaient activés sont
   étteints et les Bits qui étaient etteints sont activés.
   
   L'opérande destination admet les modes d'adressage suivants:
              -----------
     dn       
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


   Tous les Bits du CCR sont affectés par la NEGation en fonction du
   résultat obtenu. ---


   Exemple d'utilisation:
   ----------------------
   MOVE   #%1010101010101010,d0
   NEG.W  d0

   On obtient le MOT %0101010101010101 dans d0



   EXT       dn           : [.W],(.L)
   ------------

   Permet d'obtenir une EXTension du signe de l'opérande destination.

   La taille .B n'est pas autorisée.

   Dans le cas de EXT.W  dn:
   Le MSB (bit n°7) du registre de donnée est étendu jusqu'au bit n°15   
   
   Dans le cas de EXT.L  dn:
   Le MSB (bit n°15) du registre de donnée est étendu jusqu'au bit n°31

   Ceci permet de prolonger le contenu du registre de donnée sur un MOT
   ou sur un L-M en préservant le signe de ce registre. 


   L'opérande destination ne peut ètre qu'un registre de donnée.
              -----------                    ------------------

   Les Bits N et Z du CCR sont positionnés suivant le résultat de
   l'opérantion.      ---


   Exemple d'utilisation:
   ----------------------
   MOVE.W   #%0001011001010010,d5
   EXT.L    d5

   Le MSB (ici 0) sera copié du bit n°16 au bit n°31, d5 contiendra donc
   un L-M :%00000000000000000001011001010010 et non plus un MOT.


   EXG     rn,rm
   -------------

   EXG permet d'échanger le contenu de 2 registres dn ou an.

   La taille .L est prise par défaut

   L'opérande source est un registre de donnée ou d'adresse
              ------        --------          
   L'opérande destination est un registre de donnée ou d'adresse
              -----------        --------

   Le CCR n'est pas affecté par EXG
      ---
   Exemple d'utilisation:
   ----------------------
   MOVE.L   #$FF,d0
   MOVE.L   #$A2,d1
   EXG      d1,d0

   D0 contiendra le L-M $A2 et d1 le L-M $FF.



   SWAP     dn  
   -----------

   Echange les 2 MOTS du L-M contenu dans le registre de donnée dn

   L'opérande destination doit être un registre de donnée.
              -----------              ------------------                     
   Les Bits N et Z du CCR sont affectés en fonction du résultat obtenu.
                      ---

   Exemple d'utilisation:
   ----------------------
   MOVE.L     #%11111111111111110000000000000000,d3
   SWAP       d3

   D3 contiendra le L-M :%00000000000000001111111111111111

   Remarquez que le signe du registre dn n'est pas conservé et qu'il
   peut être changé !




   ADD      dn,destination     :(.B),[.W],(.L)
   -----------------------
ou

   ADD         source,dn       :(.B),[.W],(.L)
   ---------------------  

   Ajoute l'opérande source DANS l'opérande destination ( l'opérande
   source est donc inchagée et le résultat se trouve dans l'opérande
   destination! )

   Les 3 tailles d'opération sont acceptées.


   Les modes d'adressage autorisés pour l'opérande source si ADD
   s'écrit: ADD.x  source,dn  sont:                ------          
            ----------------  
     dn
     an  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Si l'opérande source est un registre d'adresse, la taille .B n'est
    pas autorisée,si la taille est .W,il y a EXTension du signe de an.


   Les modes d'adressage autorisés pour l'opérande destination si ADD
   s'écrit ADD.x  dn,destination sont:             -----------    
           --------------------- 

     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


 
    Tous le Bits du CCR peuvent réagir à l'opération ADD en fonction
    du résultat obtenu.

    Exemple d'utilisation:
    ----------------------
    ADD.B  d0,d1
 
    L'octet de poids faible du registre de donnée d0 est ajouté a
    l'octet de poids faible de d1,le résultat est dans d1:
    d0=d0, d1=d1+d0



    ADDI     #BBB,destination     :(.B),[.W],(.L)
    -------------------------

    ADDI se lit: 'ADD Immediate'

    Les 3 tailles d'opération sont autorisées.
 
    La donnée immédiate source est ajouté à l'opérande destination.
              --------- ------
    Les modes d'adressage qui sont autorisés pour l'opérande 
    destination sont:
    -----------
    
     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


    Les 5 codes du CCR sont affectés par ADDI
                   ---      
    Exemple d'utilisation:
    ----------------------
    ADDI.W   #12,(a0)

    On ajoute le mot 12 au mot pointé par le registre d'adresse a0.



    ADDQ     #BBB,destination   :(.B),[.L],(.L)      
    -------------------------

    La donnée immédiate non signée #BBB est ajoutée DANS l'opérande
    destination.

    Il faut obligatoirement que  1<= #BBB <=8

    L'opérande destination admet les modes d'adressage:

     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

     Si l'opérande destination est un registre d'adresse an,la taille
     .B est interdite,si on utilise la taille .W il y aura EXTension
     du signe de an sur un L-M.


     Les 5 Bits du CCR sont modifiés par ADDQ en fonction du résultat.
                   ---

     Exemple d'utilisation:
     ----------------------  
     ADDQ.W   #3,d0

     Ajoute le mot 3 au mot de poids faible de d0.
     
     Remarque:ADDQ est plus rapide que ADDI, ceci explique le nom
     -------- de l'instruction:ADD Quick
              Attention tout de même à ce que 1<= #BBB <=8

   
  
   ADDA       source,an     :(.W),(.L)
   --------------------

   Cette instructon se lit: 'ADD Adress'

   Elle complète ADD car ici l'opérande destination est un registre
   d'adresse.                           -----------        --------
   ---------
   Seuls les tailles .W et .L sont autorisées.

   ADDA ajoute l'opérande source au registre d'adresse an.

   Les modes d'adressages autorisés pour l'opérande source sont:
                                                    ------
     dn  
     an  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)
     
   Le CCR n'est pas modifié par ADDA
      ---
  
   Exemple d'utilisation:
   ----------------------
   ADDA.L    #2,a0

   a0 est incrémenté de 2 unités.



   SUB       dn,destination     :(.B),[.W],(.L)
   ------------------------
ou

   SUB            source,dn     :(.B),[.W],(.L)
   ------------------------  

   Retranche l'opérande source DANS l'opérande destination ( l'opérande
   source est donc inchagée et le résultat se trouve dans l'opérande
   destination! )

   Les 3 tailles d'opération sont acceptées.


   Les modes d'adressage autorisés pour l'opérande source si SUB
   s'écrit: SUB.x  source,dn  sont:                ------          
            ----------------  
     dn
     an  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Si l'opérande source est un registre d'adresse, la taille .B n'est
    pas autorisée,si la taille est .W,il y a EXTension du signe de an.


   Les modes d'adressage autorisés pour l'opérande destination si SUB
   s'écrit SUB.x  dn,destination sont:             -----------    
           --------------------- 

     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


 
    Tous le Bits du CCR peuvent réagir à l'opération SUB en fonction
    du résultat obtenu.

    Exemple d'utilisation:
    ----------------------
    SUB.B  d0,d1
 
    L'octet de poids faible du registre de donnée d0 est retranché a
    l'octet de poids faible de d1,le résultat est dans d1:
    d0=d0, d1=d1-d0



    SUBI     #BBB,destination     :(.B),[.W],(.L)
    -------------------------

    SUBI se lit: 'SUBtract Immediate'

    Les 3 tailles d'opération sont autorisées.
 
    La donnée immédiate source est retranchée à l'opérande destination.
              --------- ------
    Les modes d'adressage qui sont autorisés pour l'opérande 
    destination sont:
    -----------
    
     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


    Les 5 codes du CCR sont affectés par SUBI
                   ---      
    Exemple d'utilisation:
    ----------------------
    SUBI.W   #12,(a0)

    On retranche le mot 12 au mot pointé par le registre d'adresse a0.


    SUBQ     #BBB,destination   :(.B),[.L],(.L)      
    -------------------------

    La donnée immédiate non signée #BBB est retranchée DANS l'opérande
    destination.

    Il faut obligatoirement que  1<= #BBB <=8

    L'opérande destination admet les modes d'adressage:
               -----------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

     Si l'opérande destination est un registre d'adresse an,la taille
     .B est interdite,si on utilise la taille .W il y aurra EXTension
     du signe de an sur un L-M.


     Les 5 Bits du CCR sont modifiés par SUBQ en fonction du résultat.
                   ---

     Exemple d'utilisation:
     ----------------------  
     SUBQ.W   #3,d0

     Retranche le mot 3 au mot de poids faible de d0.
     
     Remarque:SUBQ est plus rapide que SUBI, ceci explique le nom
     -------- de l'instruction:SUBtarct Quick
              Attention tout de même à ce que 1<= #BBB <=8

   
  
   SUBA       source,an     :(.W),(.L)
   --------------------

   Cette instructon se lit: 'SUBtract Adress'

   Elle complète SUB car ici l'opérande destination est un registre
   d'adresse.                           -----------        --------
   ---------
   Seuls les tailles .W et .L sont autorisées.

   SUBA ajoute l'opérande source au registre d'adresse an.

   Les modes d'adressages autorisés pour l'opérande source sont:
                                                    ------
     dn  
     an  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)
     
   Le CCR n'est pas modifié par SUBA
      ---
  
   Exemple d'utilisation:
   ----------------------
   SUBA.L    #2,a0

   a0 est décrémenté de 2 unités (comme avec .W, -(a0) ).


   
   MULS    source,dn    
   -----------------

   Permet une MULtiplication Signée de l'opérande source DANS le 
   registre de donnée dn.

   L'entier relatif 'source' est étendu sur 16 bits et il est multi-
   plié par le MOT de poids faible de dn.   -------
               ---
   Le résultat est dans dn et c'est un L-M, entier relatif SIGNE.
                                        ---                ------
   L'opérande source admet les modes d'adressage:
              ------
     dn  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Les bits V et C du CCR sont mis à 0,les bits N,Z sont positionnés
    suivant le résultat, X n'est pas affecté.

    Exemple d'utilisation:
    ----------------------
    MOVE.W     #3,D0
    MULS       #-5,D0

    D0 contiendra le L-M égal à 3*(-5)=-15


  
   MULU    source,dn    
   -----------------

   Permet une MULtiplication non signée (Unsigned) de l'opérande source
   DANS le registre de donnée dn.

   L'entier relatif 'source' est étendu sur 16 bits et il est multi-
   plié par le MOT de poids faible de dn.   -------
               ---
   Le résultat est dans dn et c'est un L-M,entier relatif NON SIGNE.
                                       ---                ----------
   L'opérande source admet les modes d'adressage:
              ------
     dn  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Les bits V et C du CCR sont mis à 0,les bits N,Z sont positionnés
    suivant le résultat, X n'est pas affecté.

    Exemple d'utilisation:
    ----------------------
    MOVE.W   #4,d2     
    MULU     #3,d2

    D2 contiendra le L-M égal à 4*3=12

   
   DIVS    source,dn    
   -----------------

   Permet une Division Signée du registre de donnée dn par l'entier 
   relatif étendu sur 1 mot 'source'.

   L'entier relatif 'source' est étendu sur 16 bits et c'est le diviseur
   du registre de donnée dn.                -------
      
   Le résultat est dans dn et c'est un L-M, entier relatif SIGNE tel que:
                                       ---                 -----
   Le quotient occupe le mot de poids faible de dn.
      --------         
   Le reste (si il y en a) a le signe du dividende et occupe le mot de 
      -----  
   poids fort de dn.

   L'opérande source admet les modes d'adressage:
              ------
     dn  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Le bit C du CCR est mis à 0,les bits N,Z,V sont positionnés suivant
    le résultat, le bit X n'est pas affecté.

    Exemple d'utilisation:
    ----------------------  
    MOVE.W   #4,D2     
    MOVE.W   #12,D0
    DIVS     D2,D0
    MOVE.L   D0,RES

    BSS

RES DS.W     1
QUO DS.W     1

    Le mot pointé par QUO contient 3 et le mot pointé par RES contient
    0 car il n'y a pas de reste.

    NB:.Pour atteindre facilement les 2 mots (reste/quotient) du registre
    --  de donnée destination, on peut par exemple utiliser l'instruction
        'SWAP dn' vue précédement.

       .Si on pratique une division par 0, ceci entraine une procédure
        d'exception et interromps l'execution du programme !
        (J'expliquerai plus tard ce que sont les procédures d'exception.)

       
   DIVU    source,dn    
   -----------------

   Permet une Division NON SIGNEE du registre de donnée dn par l'entier 
   relatif étendu sur 1 mot 'source'.

   L'entier relatif 'source' est étendu sur 16 bits et c'est le diviseur
   du registre de donnée dn.                -------
     
   Le résultat est dans dn et c'est un L-M, entier relatif NON SIGNE
   tel que:                            ---                 ---------
  
   Le quotient occupe le mot de poids faible de dn.
      --------         
   Le reste (si il y en a) occupe le mot de poids fort de dn.
      -----

   L'opérande source admet les modes d'adressage:
              ------
     dn  
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Le bit C du CCR est mis à 0,les bits N,Z,V sont positionnés suivant
    le résultat, le bit X n'est pas affecté.


    NB:.Il faut bien veiller à ce que les données ('source' et 'dn') sont
    --  positives et à ce que l'opérande source soit différente de 0 !

       .Les Instructions qui oppèrent sur des donnnées non signées sont
        plus rapides que leurs instructions complémentaires qui opèrent
        sur des données signées (MULS/MULU, DIVS/DIVU) , c'est là leur
        unique intérèt.

        Les instructions MULS et DIVS peuvent bien entendu aussi oppèrer
        sur des instructions positives.


   CLR      destination  (.B),[.W],(.L)
   --------------------
   L'instruction CLR permet d'éteindre tous les BITS de l'opérande  
   destination (CLeaR).
   
   Les 3 tailles d'opérantion sont possibles.

   Les modes d'adressage autorisés pour l'opérande destination sont:
                                                   -----------
     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


   Le bit Z du CCR est mis à 1, les bits N,V,C à 0 , le bit X n'est pas
   affecté.    ---

   Exemple d'utilisation:
   ----------------------
   MOVE.W    #%1111011101110110,d0
   CLR.B     d0
 
   L'octet de poids faible de d0 est mis à 0, d0 contiendra donc le mot:
   %1111011100000000 .

   NB: .L'instruction CLR.x est logiquement équivalente à l'instruction 
   ---  'MOVEQ.x  #0,destination' mais est curieusement moins rapide !
   



   AND  source,dn       (.B),[.W],(.L)
   --------------
   ou 

   AND  dn,destination  (.B),[.W],(.L)
   -------------------
  
   Permet d'effectuer un AND (et) logique entre ses deux opérandes.   

   C.à.d qu'on ajoute les 2 opérandes codées en Binaire en se fixant
   une règle selon laquelle:

   1+1 donne 1
   1+0 donne 0
   0+0 donne 0
   0+1 donne 0

   Et cela pour chacun des bits des 2 opérandes de l'instruction.
   
   Exemple:  MOVE.B     #%11101011,d0;  %11101011
   -------   MOVE.B     #%10101000,d1;  %10101000
             AND.B      d0,d1        ;   ||||||||
                                         ||||||||
                                         ''''''''
             on obtient l'octet:        %10101000

   Pour la première syntaxe possible de AND, les modes d'adressage 
   possibles pour l'opérande 'source' sont:
                              ------
     dn      
     an
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

   Pour la seconde forme de AND,les modes d'adressage autorisés pour 
   l'opérande 'destination' sont:
               -----------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

    
    Seuls les bits N et Z du CCR sont affectés par cette instruction.         
                             ---                             


   OR   source,dn       (.B),[.W],(.L)
   --------------
   ou 

   OR   dn,destination  (.B),[.W],(.L)
   -------------------
  
   Permet d'effectuer un OR (ou) logique entre ses deux opérandes.   

   C.à.d qu'on ajoute les 2 opérandes codées en Binaire en se fixant
   une règle selon laquelle:

   1+1 donne 1
   1+0 donne 1
   0+1 donne 1
   0+0 donne 0

   Et cela pour chacun des bits des 2 opérandes de l'instruction.
   
   Exemple:  MOVE.B     #%11101011,d0;  %11101011
   -------   MOVE.B     #%10101000,d1;  %10101000
             OR.B      d0,d1         ;   ||||||||
                                         ||||||||
                                         ''''''''
             on obtient l'octet:        %11101011

   Pour la première syntaxe possible de OR, les modes d'adressage 
   possibles pour l'opérande 'source' sont:
                              ------
     dn      
     an
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

   Pour la seconde forme de OR,les modes d'adressage autorisés pour 
   l'opérande 'destination' sont:
               -----------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

    
    Seuls les bits N et Z du CCR sont affectés par cette instruction.         
                             ---                             
        


   EOR  dn,destination  (.B),[.W],(.L)
   -------------------
  
   Permet d'effectuer un EOR (ou exclusif) logique entre ses deux 
   opérandes.   

   C.à.d qu'on ajoute les 2 opérandes codées en Binaire en se fixant
   une règle selon laquelle:

   1+1 donne 0
   0+0 donne 0
   0+1 donne 1
   1+0 donne 1

   Et cela pour chacun des bits des 2 opérandes de l'instruction.
   
   Exemple:  MOVE.B     #%11101011,d0;  %11101011
   -------   MOVE.B     #%10101000,d1;  %10101000
             EOR.B      d0,d1        ;   ||||||||
                                         ||||||||
                                         ''''''''
             on obtient l'octet:        %01000011


   Les modes d'adressage autorisés pour l'opérande 'destination' sont:
                                                    -----------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

    
    Seuls les bits N et Z du CCR sont affectés par cette instruction.         
                             ---                             


   NOT  dn,destination  (.B),[.W],(.L)
   -------------------
  
   Permet d'effectuer un NOT (négation) logique.   

   NOT calcule le complément à 1 d'un nombre. (NEG le complément à 2)
    
   Les modes d'adressage possibles pour l'opérande 'source' sont:
                                                    ------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

    
    Seuls les bits N et Z du CCR sont affectés par cette instruction.         
                             ---                             

    
    
    Les instructions  AND,OR,EOR sont complètées par les 3 instructions
    logiques immédiates:

    ANDI    #BBB,destination (.B),[.W],(.L)
    ------------------------
    ORI     #BBB,destination (.B),[.W],(.L)
    ------------------------
    EORI    #BBB,destination (.B),[.W],(.L)
    ---------------------------------------
    .Ces instructions ont un  r“le commun à leurs instructions
     complémentaires mais elles admettent une donnée immédiate 
     comme opérande source.                   ----------------
                    ------
     L'opérandes destination admet les modes d'adressage:
                 -----------
     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
    
    Seuls les bits N et Z du CCR sont affectés par ces 3 instructions.         
                             --- 
    NB: L'opérande destination peut aussi être: 'SR' ou 'CCR'.
    --  Mais dans le cas o— l'opérande destination est CCR, l'exectution 
        de ces instruction nécessitent qu'on soit en MODE SUPERVISEUR !
                                                    ----------------
        Exemple:  ANDI.B  #%11111011,sr
        -------  
        met à 0 le bit Z du SR sans changer les autres bits du SR. 
        
        
        Je répète: ATTENTION! 
        Le CCR ne peut ètre atteint qu'en MODE SUPERVISEUR , sinon ceci 
        provoquerait l'execution d'une procédure d'exception et l'arrêt 
        du programme.
        Avec les modes d'adressage SR ou CCR ,les instructions ANDI, 
        ORI,EORI sont donc des instructions qui nécessitent que l'on 
        soit un mode superviseur si l'on modifie le CCR ,c'est l'unique
        manière d'atteindre le CCR.
        Ce sont donc des INSTRUCTIONS PRIVILEGIEES dans ce cas.
        Le SR est par contre aussi disponible en mode utilisateur.
       


    MOVE     sr,destination  
    -----------------------

    Sauve le registre d'état SR à l'adresse destination.

    Le contenu du CCR n'est pase affecté par l'instruction.
                  ---  
    Les modes d'adressage autorisés pour l'opérande destination sont:
                                                    -----------   
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


     Exemple d'utilisation:
     ----------------------
     MOVE   sr,dest

     BSS

dest DS.W   1

     le mot pointé par 'dest' contiendra le SR.



    MOVE     source,sr  
    ------------------

    Restaure le CCR contenu dans (à) l'opérande source.

    Le CCR est chargé avec sa nouvelle valeur, le SR n'est pas affecté.
       ---                                        --
    Les modes d'adressage autorisés pour l'opérande source sont:
                                                    ------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


     Exemple d'utilisation:
     ----------------------
     MOVE   sr,dest             ;sauve le SR avec Z=0
     CLR    d0                  ;ici le bit Z du CCR est mis à 1 (CLeaR)
     MOVE   aaa,ccr             ;on recharge le CCR de 'aaa': Z=0   
    
     BSS

dest DS.B   1  ;SR
aaa  DS.B   1  ;CCR
   
     le CCR est chargé avec le mot pointé par 'aaa'.


     
     TST      destination    (.B),[.W],(.L)
     --------------------

     TeST compare l'opérande destination à 0 et modifie les bits du
     CCR en conséquence.
     ---
     Les 3 tailles d'opération sont possibles.

     Les modes d'adressage autorisés pour l'opérande destination sont:
                                                     -----------
     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)

    Les bits N,Z du CCR sont affectés en fonction du résultat de la
    comparaison ,Les bits V et C sont mis à 0 ,X n'est pas affecté.
         
    Exemple d'utilisation:
    ---------------------- 
    MOVE.W     #5,d0     ;d0=5
    TST.W      d0        ;le bit Z du CCR est mis à 0 car d0=5
    SUB        #5,d0     ;d0=5-5=0
    TST.W      d0        ;le bit Z du CCR est mis à 1 car d0=0
  
     

     CMP      source,destination    (.B),[.W],(.L)
     ---------------------------

     CoMPare l'opérande destination à l'opérande source en effectuant la
     soustraction 'destination' - 'source' et modifie les bits du CCR en
     conséquence.                                                 ---
                                                            
     Les 3 tailles d'opération sont possibles.

     Les modes d'adressage autorisés pour l'opérande source sont:
                                                     ------
     dn
     an        (taille .B interdite)
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)

    Les modes d'adressage autorisés pour l'opérande destination sont:
                                                    -----------
     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


    Les bits N,Z,V,C du CCR sont affectés en fonction du résultat de 
    la comparaison ,Le bit X n'est pas affecté.
         
    Exemple d'utlisation:
    --------------------- 
    MOVE.B     #2,d0
    MOVE.B     #98,d1
    CMP.B      d0,d1

    L'instruction CMP sera utilisée avec les instructions du type B**
    et DB** que nous étudierons plus loin.



     CMPI      #BBB,destination    (.B),[.W],(.L)
     --------------------------

     CoMPare l'opérande destination à l'opérande source immédiate en
     effectuant la soustraction  'destination' - 'source' et modifie 
     les bits du CCR en conséquence.
                 ---   
     Les 3 tailles d'opération sont possibles.

     Les modes d'adressage autorisés pour l'opérande destination sont:
                                                     -----------
     dn
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


    Les bits N,Z,V,C du CCR sont affectés en fonction du résultat de 
    la comparaison ,Le bit X n'est pas affecté.
         
    Exemple d'utilisation:
    ---------------------- 
    CMPI.L   #3,d3

    Compare le contenu du registre de donnée d3 à 3.



     CMPA      source,an    [.W],(.L)
     -------------------

     CoMPare le registre d'adresse 'an' à l'opérande source en effectuant
     la soustraction  'an' - 'source' et modifie les bits du CCR en con-
     séquence.                                               ---

     Seules les tailles d'opération .W et .L sont possibles.

     Les modes d'adressage autorisés pour l'opérande source sont:
                                                     ------
     dn
     an
     BBBB
     BB
     #BBB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)
     d(pc)
     d(pc,rn)


    Les bits N,Z,V,C du CCR sont affectés en fonction du résultat de 
    la comparaison ,Le bit X n'est pas affecté.
         
    Exemple d'utilisation:
    ---------------------- 
    CMPA.L   a2,a3

    Compare le contenu du registre d'adresse a3 au contenu du regitre
    d'adresse a2.


     CMPM       (an)+,(am)+    (.B),[.W],(.L)
     ----------------------

     CoMPare l'opérande destination à l'opérande source en effectuant
     la soustraction  'destination' - 'source' et modifie les bits du
     CCR en conséquence.

     Les 3 tailles d'opération sont possibles.

     Le mode d'adressage autorisé pour l'opérande destination et pour
     l'opérande destination est le mode POSTINCREMENTE.
                                        --------------                                                   
     Les bits N,Z,V,C du CCR sont affectés en fonction du résultat de 
     la comparaison ,Le bit X n'est pas affecté.

         
     Exemple d'utilisation:
     ----------------------
     LEA      TAB,a1     ;pose l'adresse de 'TAB' dans a1
     LEA      BAT,a2     ;et l'adresse de 'BAT' dans a2
     MOVE     #5,d3

BBB  CMPM.B   (a1)+,(a2)+     ;CMPM l'octet pointé par a1 à l'octet pointé
                              ;par a2 et incrémente d'une unité les 2
                              ;registres d'adresses.
     DBF      d3,BBB          ;boucle 6 fois

     DATA                     ;table des données (octets)     

TAB  DC.B      1,2,3,4,5,6
BAT  DC.B      6,5,4,3,2,1




     B**     label      (Branch & Condition Code)
     -------------
     
     L'instruction admet différents Codes Condition (**) qui peuvent
     changer l'action de B**. 

     B** oppère un saut à l'adresse pointée par le 'label' si le
     code condition demandé est justifié après une CoMParaison ,
     sinon le programme continue normalement.


     Les ** sont:

     B**         Si A et B sont SIGNES            | Sinon, syntaxe:
     ---------------------------------------------+----------------
     Bgt  si   A>B  (Greater Than)                | Bbi  (Higher)
     Beq  si   A=B  (EQual)                       | Beq  (EQual)   
     Blt  si   A<B  (Less Than)                   | Bcs  (inférieur)   
     Bne  si   A est différent de B   (Not Equal) | Bne  (Not Equal)   
     Bge  si   A >= B (Greater or Equal)          | Bcc  (sup. ou égal)   
     Ble  si   A <= B (Less or Equal)             | Bls  (inf. ou égal)
                                                  

     L'instruction B** teste en fait les bits du CCR:

     Beq test si le bit Z du CCR est à 1 (CPM soustrait les opérandes
                                          pour les tester)


     On retrouve aussi les Codes de condition qui ne tiennent que compte
     de certains bits du CCR et non pas du résultat d'une comparaison :
     
     Bmi  si le bit N du CCR est à 1  
          (Donc Négatif)

     Bpl  si le bit N du CCR est nul OU si le bit Z du CCR est à 1 
          (Donc Positif ou nul)
 
     Bvc  si le bit V du CCR est nul 
          (Donc si il n'y a pas débordement)

     Bvs  si le bit V du CCR est à 1
          (Donc si il y a débordement)

     Bcc  si le bit C du CCR est à 1

     Bcs  si le bit C du CCR est nul


     Exemple d'utilisation:
     ----------------------
     MOVE.W    #4,d3     ;d3=4
     MOVE.W    dat,d0    ;d0=-20
     ADD       d3,d0     ;d0=-20+4=-16
     CMPI      #4,d0     ;Compare -16 à 4
     BEQ       egal      ;Si c'est ègal (Z=1) on saute en 'egal'
     BMI       negatif   ;Si c'est négatif (N=1) on saute en 'negatif'

     DATA

dat  DC.W      -20 


     Dans notre exemple, le programme sautera en 'negatif', ceci serait
     le cas même si il n'y avait pas de 'CMPI #4,d0' car avec Bmi, seul
     le bit N du CCR intervient, il n'y a pas besoin de comparaison,
     contrairement à Beq.

     NB: Le saut au label destination s'effectue par le chargement de
     --  la valeur du PC à ce label dans le PC actuel.




     DB**    dn,label
     ----------------

     Permet d'effectuer une boucle:

     Le nombre de passages est contenu dans le registre de donnée dn.
     L'adresse a laquelle le saut pour la boucle doit d'effectuer est
     un label.
     L'instruction admet aussi différents codes condition (**) qui 
     peuvent opérer un débranchement de la boucle si ils sont
     vérifiés.

     Les Codes condition possibles sont les mêmes qu'avec l'instruction
     B** .

     DB** teste d'abord la condition ** ,si celle-ci est vérifiée il y
     a débranchement de la boucle et le programme continue à l'instruc-
     tion suivante, sinon , le registre dn est décrémenté d'1:
     Si dn vaut -1 il y a arrèt de la boucle et le programme continue à
     la prochaine instruction.
     Si dn est positif ou nul, il s'oppère un saut à l'adresse pointée
     par le label.

     Le CCR n'est pas modifié par DB**
        ---

     NB:DB** admet aussi les codes condition suivant:
     --
        .DBf  = toujours faux, il n'y a pas de comparaison ou de test
 
        .DBt  = toujours vrai, idem

     Exemple d'utilisation:
     ----------------------
     LEA       dat,a0    ;adresse de 'dat' dans a0
     MOVE      #7,d1     ;7 dans d1

boo  MOVE.W    (a0)+,d2  ;pose le MOT pointé par a0 dans le MOT de poids
                         ;faible de d2 en mode postincrémenté
     DBMI      d1,boo    ;teste si N=1 (mi), décrémente d1 et saute en
                         ;'boo' si d1 est positif ou nul.
     MOVE.W    d2,res    ;pose le MOT de poids faible de d2 en 'res'

     DATA

dat  DC.W      1,5,486,0,-2,0,4,8,100,20,5   ;11 mots
 
     BSS

res  DS.W      1                        ;réserve 1 mot en 'res'

     END

     La condition MI (N=1) a été vérifiée au bout de 5 passages en 'boo',
     il y a eu débranchement de la boucle avant l'execution des 8 pass-
     ages prévus car on a posé le MOT -2 dans d2: Ceci avait pour effet
     de mettre le bit N du CCR à 1 et par là mème de sortir de la boucle
     car la condition MI a été vérifiée.
 
     A la fin du programme: d2=-2, a0 pointe le mot égal à 0, d1=3 
     et 'res' pointe sur le mot égal à -2




    S**    Destination
    ------------------

    L'instruction S** admet elle aussi les différents Codes condition.

    Elle teste si la condition ** est vérifiée.

    Si elle s'avère vraie, l'OCTET qui se trouve à l'adresse pointée 
    par l'opérande destination est mis à -1 (soit $FF ou %11111111)

    Si elle s'avère fausse, l'OCTET est mis à 0 ($00 ou %00000000)

    Il faudra bien entendu réservé cet Octet ! (avec DS.B 1 par exp)

    Les modes d'adressage possibles pour l'opérande destination sont:
                                                    -----------

     dn
     an
     BBBB
     BB
     (an)
     (an)+
     -(an)
     d(an)
     d(an,rn)


    Le CCR n'est pas affecté par S**
       ---
 
    Exemple d'utilisation:
    ---------------------- 
     MOVE      #3,d0     ;mot 3 dans d0
     MOVE      #3,d1     ;mot 3 dans d1
     CMP.W     d0,d1     ;compare les mots de poids faible de d1 et d0
     SEQ       res       ;Si c'est Egal:met L'octet de 'res' à -1 sinon
                         ;met le à 0 (ici d1=d0 on le met donc à -1)
     TST.B     res       ;Compare loctet de 'res' à 0 (0=faux pour S**)
     BEQ       fin       ;si il est égal à 0:va en 'fin'
     BNE       egal      ;sinon (Not Equal) va en 'egal'

     BSS

res  DS.W      1         ;l'octet pour S**

     END

     Dans notre exemple: Le programme va sauter en 'egal'.


          
     
                        ------------------------



  PIECHOCKI Laurent
  8,impasse Bellevue                    Suite dans :INSTRUC2.DOC
  57980 TENTELING                       ------------------------



        

Back to ASM_Tutorial