Initiation à lassembleur 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é nest pas formulé daprès son numéro mais par sa valeur, ce
qui permet de tester plusieurs bits simultanément. Si lon 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, puisquun 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 sil
est négatif/positif, cest à dire si le bit 7 du registre est à 0 ou à 1. Seul
« TST » nécessite la formulation dun registre dans le champ
opérande :
TST $A000 Teste létat de loctet 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 naille 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 dun registre dans le champ opérande :
CLR $A000 Met à $00 loctet 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 dun 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 loctet 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
dun 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 lopposé en $A000
...
Il existe dautres instructions assembleur, sur lesquelles nous ne nous attarderons pas :
DAA Ajustement décimal
Voir « Optimisation de routine : affichage dun 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 darrêt par ASSEMBLER
sur TO et pour lappel 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 à lExtraMoniteur
sur MO6.
SWI3 Interruption logicielle 3.
RTI Retour dinterruption
CWAI Attente dinterruption
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 lassembleur.
|