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°9

Branchements

Les branchements sont les équivalents des GOTO sous Basic, à ceci près qu’ils sont conditionnels. Lorsque vous écrivez « IF A = 0 THEN GOTO », vous ajoutez une condition au branchement (IF A=0). En assembleur, la condition des branchements est comprise dans le branchement lui-même. Si la condition est remplie, le branchement se fait. Dans le cas contraire, le branchement ne se fait pas. Chaque condition de branchement a son répondant :

  BEQ    Branchement si le résultat précédent est égal (à 0)
  BNE    Branchement si le résultat précédent est différent (de 0)
    
  BCC    Branchement si la retenue est à 0 (flag C de CC)
  BCS    Branchement si la retenue est à 1 (flag C de CC)
    
  BVC    Branchement si pas de débordement (flag V de CC à 0)
  BVS    Branchement si débordement (flag V de CC à 1)
    
  BGE    Branchement si le résultat précédent est positif ou nul
  BLE    Branchement si le résultat précédent est négatif ou nul
    
  BGT    Branchement si le résultat précédent est positif et non nul
  BLT    Branchement si le résultat précédent est négatif et non nul
    
  BPL    Branchement si le résultat précédent est positif ou nul
  BMI    Branchement si le résultat précédent est négatif et non nul
    
  BLO    Branchement si le résultat précédent est strictement supérieur
  BHI    Branchement si le résultat précédent est strictement inférieur
    
  BLS    Branchement si le résultat précédent est supérieur ou égal
  BHS    Branchement si le résultat précédent est inférieur ou égal
    
  BRA    Branchement inconditionnel (GOTO)
  BRN    Non-branchement
    
  BSR    Branchement à une routine se terminant par RTS (GOSUB)

L’exemple suivant permettra d’analyser les réactions des branchements conditionnels BLO, BHI et BEQ puisqu’une valeur ne peut être que supérieure, inférieure ou égale, un test de plus étant sans signification. Changez les SWI en STOP pour le MO :

DEBUT       LDB   #$01        Charge B
            CMPB  #$42        Compare à une valeur
            BLO   KBLO        Si valeur inférieure, branche en KBLO
            BHI   KBHI        Si valeur supérieure, branche en KBHI
            BEQ   KBEQ        Si valeur égale, branche en KBEQ
KBLO        SWI               Point d’arrêt si valeur inférieure
KBHI        SWI               Point d’arrêt si valeur supérieure
KBEQ        SWI               Point d’arrêt si valeur égale
            END

Vous pourrez changer les deux valeurs comparatives ainsi que les branchements conditionnels et observer les variations.

BRA, BRN et BSR sont les branchements simples. Ils s’effectuent toujours.

BMI, BPL, BEQ, BNE, BVS, BVC, BCS et BCC sont les branchements conditionnels simples. Ils réagissent à l’état d’un seul flag de CC, c’est à dire chacun à un et un seul flag activé dans le registre CC par l’opération précédente. Non seulement ils assurent le branchement après un test comparatif, mais aussi après une simple manipulation sans test préalable avec LDA, STA, LDB, STB, etc... ce qui permet d’écrire, par exemple :

LDB   $A000       Charge la valeur        < 10 B=PEEK(&HA000)
BEQ   EXIT        Si valeur=0, sort       < 20 IF B=0 THEN [EXIT]
...

BLO, BHI, BLS et BHS sont les branchementsconditionnels non signés, les valeurs de 128 à 255 (de $80 à $FF) étant traitées comme positives. BGT, BGE, BLE et BLT sont les branchements conditionnels signés, les valeurs de 128 à 255 étant traitées comme négatives. Pour ces deux types de branchements, il est convenu d’effectuer une comparaison préalable pour activer la condition, ceux-ci ne réagissant qu’à une combinaison particulière des flags de CC.

Tous ces branchements, en l’état, sont des branchements courts. L’instruction est codée sur un seul octet à l’assemblage et l’offset de branchement est aussi sur un octet. Cela permet les branchements en aval ou en amont se trouvant à plus ou moins 127 octets de la position de l’instruction dans le programme. Lorsque le branchement va au-delà, on a recours à un branchement long, converti simplement en ajoutant le préfixe « L » à l’instruction de branchement court (LBRA, LBEQ, LBMI, etc...). L’instruction est alors assemblée sur 16 bits (sauf pour LBRA et LBSR qui restent sur 8 bits) et l’offset de branchement passe à 16 bits. Les branchements longs sont de fait plus longs à l’assemblage ainsi qu’à l’exécution.

L’instruction de non-branchement BRN trouve son utilité dans le cas de routines auto-générées ou des temporisations au cycle machine près.

Les branchements BCC et BCS sont utilisés assez fréquemment. Ils traitent directement avec le bit de retenue et donc les instructions de décalage et les dépassements pour les instructions arithmétiques. Si le bit sortant est à 0, BCC assure le branchement. Si le bit sortant est à 1, BCS assure le branchement. On peut remarquer que BCC a le même code instruction que BHS et que BCS a le même code instruction que BLO. C’est pourquoi les désassemblages ne font pas la différence.

Les branchements BVS et BVC sont rarement utilisés. Ils traitent avec le flag de débordement (flag V de CC). Si le bit sortant est différent du bit sortant de l’opération précédente, BVS assure le branchement. Si le bit sortant est identique au bit sortant de l’opération précédente, BVC assure le branchement. Ce type de branchement est utilisé pour certains calculs de CRC.

Un petit programme pour commuter tous les segments de l’écran différents de 0 :

DEBUT LDB   $E7C3       |                       < 10 B=PEEK(&HE7C3)
      ORB   #$01        |Passe en RAMA          < 20 B=B OR &H01
      STB   $E7C3       |                       < 30 POKE &HE7C3,B
      LDX   #$4000      Pointeur écran          < 40 X=&H4000
      LDY   #8000       Taille écran            < 50 Y=8000
SUITE LDB   ,X          Lit un segment          < 60 B=PEEK(X)
      BEQ   PASSE       Si vide, passe          < 70 IF B=0 THEN 90
      COM   ,X          Commute le segment      < 80 POKE X,NOT(PEEK(X))AND255
PASSE LEAX  1,X         Déplace le pointeur     < 90 X=X+1
      LEAY  -1,Y        Compteur=compteur-1     < 100 Y=Y-1
      BNE   SUITE       Si compteur<>0, boucle  < 110 IF Y<>0 THEN 60 
      SWI               Arrêt du programme      < 120 END
      END               - Fin du programme -

Pour adapter ces programmes au MO, remplacer les 4 premières lignes par:

DEBUT  CALL   $06    Passe en RAMA            < - Pas d'équivalent basic -
       LDX    #$0000 Pointeur écran           < X=&H0000

...et le SWI d'arrêt du programme par STOP.

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