Initiation à lassembleur 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.
|