Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le documentLes cours d'assembleur de Prehis-To
Retour à la liste

Initiation à l’assembleur 6809

Cours n°10

Tests

  BITA    Teste le(s) bit(s) de A
  BITB    Teste le(s) bit(s) de B

Pour ces deux tests, le bit testé n’est pas formulé d’après son numéro mais par sa valeur, ce qui permet de tester plusieurs bits simultanément. Si l’on voulait tester le bit n°5 du registre A, il faudrait écrire « BITA #$20 ». Si le bit n°5 de A est à 1, le branchement conditionnel « BNE » sera activé. Si le bit n°5 de A est à 0, le branchement conditionnel « BEQ » sera activé. Dans le cas du test de plusieurs bits simultanément, seul le branchement « BEQ » est significatif, puisqu’un seul des bits testés à 1 fausse la condition :

        BITA  #$C0        Teste si les bits 6 et 7 de A sont à 0
        BEQ   EXIT        Si oui, sort du programme
        ...
  TSTA    Teste le registre A
  TSTB    Teste le registre B
  TST     Teste le registre mémoire 8 bits

Le test porte ici sur les 8 bits du registre. Il permet de savoir si le registre est à 0 ou s’il est négatif/positif, c’est à dire si le bit 7 du registre est à 0 ou à 1. Seul « TST » nécessite la formulation d’un registre dans le champ opérande :

      TST   $A000       Teste l’état de l’octet en $A000
      BEQ   EXIT        Si registre à 0, sort du programme
        ...
  CMPA        Compare la valeur 8 bits avec le registre A
  CMPB        Compare la valeur 8 bits avec le registre B
  CMPX        Compare la valeur 16 bits avec le registre X
  CMPY        Compare la valeur 16 bits avec le registre Y
  CMPU        Compare la valeur 16 bits avec le registre U
  CMPS        Compare la valeur 16 bits avec le registre S

Les tests comparatifs permettent toutes les déductions : si la valeur est supérieure (signée ou non), inférieure (signée ou non) ou égale. Pour exemple, dans le cas où vous voudriez filtrer les caractères ASCII et ne prendre que les caractères standard affichables, il faudrait que le caractère n’aille pas en deçà de 32 et au-delà de 127. Il suffirait alors de comparer la valeur à 32 et sortir du programme si elle est inférieure (<32) ou négative (de 128 à 255) :

        CMPA  #32         Compare la valeur à 32
        BLT   EXIT        Si inférieure ou négative, sort du programme
        ...

Translations

  EXG     Echange les valeurs de registres de même taille
  TFR     Transfère la valeur dans un registre de même taille

Pour « EXG », la valeur du premier registre passe dans le second et la valeur du second passe dans le premier. Pour « TFR », la valeur du premier registre passe dans le second : la valeur du second registre est perdue. Dans la syntaxe, ils seront séparés par une virgule :  les registres 8 bits A, B, CC et DP peuvent être échangés ou transférés entre eux, de même que les registres 16 bits X, Y, U, S et PC :

      EXG   A,B         Echange A et B
      TFR   X,U         Transfère X dans U

Effacement et complémentations

  CLRA    Met le registre A à 0
  CLRB    Met le registre B à 0
  CLR     Met le registre mémoire 8 bits à 0

Seul « CLR » nécessite la formulation d’un registre dans le champ opérande :

           CLR  $A000        Met à $00 l’octet en $A000
  COMA     Commute l’état des bits du registre A
  COMB     Commute l’état des bits du registre B
  COM      Commute l’état du registre mémoire 8 bits

Au résultat, tous les bits primitivement à 1 seront mis à 0 et tous les bits primitivement à 0 seront mis à 1. Seul « COM » nécessite la formulation d’un registre dans le champ opérande :

           LDA   #$23        Charge le registre avec une valeur => %00100011
           COMA              Dans A se trouve NOT(&H23) soit &HDC=> %11011100
           ...
           COM   $A000       Commute l’octet en $A000
           ...
  NEGA     Convertit la valeur du registre A en son opposé
  NEGB     Convertit la valeur du registre B en son opposé
  NEG      Convertit la valeur du registre mémoire 8 bits en son opposé

Au résultat, on trouvera dans le registre la valeur « opposée » du registre. Seul « NEG» nécessite la formulation d’un registre dans le champ opérande :

LDB   #$20        Charge le registre avec la valeur 32
NEGB              Dans B se trouve -32 soit, sur 8 bits, &HE0
...
NEG   $A000       Fixe l’opposé en $A000
...

Il existe d’autres instructions assembleur, sur lesquelles nous ne nous attarderons pas :

  DAA   Ajustement décimal
               Voir « Optimisation de routine : affichage d’un nombre hexadécimal »
               du bulletin n°34 de ContacThoms.
  MUL   Multiplication de A par B. Résultat dans D
  NOP   Instruction sans effet
               Les chiens aboient, la caravane passe...
  SEX   Le signe de B se retrouve dans A (A=$00 pour B>=0, A=$FF pour B<0)
               Pratique pour étendre le registre 8 bits B au registre 16 bits D dans 
               une configuration signée.
  JMP   Branchement inconditionnel
               Equivalant à LBRA mais avec un offset absolu. Retour par RTS
  JSR   Branchement inconditionnel à un sous-programme
               Equivalant à LBSR mais avec un offset absolu. Retour par RTS
  SWI   Interruption logicielle. Utilisée comme point d’arrêt par ASSEMBLER
               sur TO et pour l’appel des routines moniteur par le biais de CALL
               pour le MO (CALL a le même code instruction que SWI).
  SWI2  Interruption logicielle 2. Utilisée pour les appels à l’ExtraMoniteur
               sur MO6.
  SWI3  Interruption logicielle 3.
  RTI   Retour d’interruption
  CWAI  Attente d’interruption
  SYNC  Synchronisation sur un événement externe

Il vous est conseillé de vous procurer le livre « Programmation en Assembleur 6809 » de Bui Minh Duc aux éditions Eyrolles. Un ouvrage très complet - mais assez ardu - sur tout ce qui concerne le langage assembleur 6809.

A vous maintenant de partir à la découverte de la puissance de l’assembleur.

Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret