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

Additions et soustractions

INCA      ajoute 1 au registre 8 bits A
INCB      ajoute 1 au registre 8 bits B
INC       ajoute 1 au registre 8 bits pointé par l'opérande
DECA      soustrait 1 au registre 8 bits A
DECB      soustrait 1 au registre 8 bits B
DEC       soustrait 1 au registre 8 bits pointé par l'opérande

Les instructions INCA, INCB, DECA et DECB sont très fréquemment utilisées. Elles sont concises, rapides et permettent de faire des boucles de 256 révolutions au maximum. Les instructions DEC et INC permettent aussi de décrémenter ou incrémenter mais seulement des registres mémoires.

LDA    #$41      > A=&H41
INCA             > A=A+1 (soit &H42)
ADDA      ajoute au registre 8 bits A
ADDB      ajoute au registre 8 bits B
ADDD      ajoute au registre 16 bits D (A en poids fort et B en poids faible)
SUBA      soustrait au registre 8 bits A
SUBB      soustrait au registre 8 bits B
SUBD      soustrait au registre 16 bits D (A en poids fort et B en poids faible)

"ADDA #16" ajoute 16 au registre 8 bits A; "SUBB #5" soustrait 5 au registre 8 bits B; "ADDD #$01FF" ajoute $1FF au registre D. On peut remarquer que, au contraire des instructions INCA/INCB/INC/DECA/DECB/DEC, si le résultat de l'opération est censé dépasser le cadre des 8 bits, le "9ème bit" est positionné par le flag C de CC.

ADCA      ajoute au registre 8 bits A et ajoute la retenue
ADCB      ajoute au registre 8 bits B et ajoute la retenue
SBCA      soustrait au registre 8 bits A et soustrait la retenue
SBCB      soustrait au registre 8 bits B et soustrait la retenue

Instructions un peu spéciales. Si le bit C de CC est positionné à 1, l'opération effectuera un ADDA/ADDB/SUBA/SUBB simple et ajoutera/soustraira la retenue (C de CC) selon son état précédant l'instruction, 0 ou 1. En admettant que vous ayez à trouver un numéro de gadget qui varierait entre 7 et 8 selon l'état du bit 0 d'un registre:

CLRB             Efface le numéro
LSRA             Décalage du registre
ADCB   #$07      Addition de 7 et de la retenue au numéro
...

Si le bit 0 de A est à 0, vous obtenez 7. S'il est à 1, vous obtenez 8.

ABX       ajoute la valeur du registre B au registre X

Instruction qui nécessite un aménagement très particulier: la valeur initiale doit être dans le registre X et la valeur à ajouter dans le registre B. Mais aussi une instruction concise, rapide et pratique, puisque l'addition est non signée, résultat rare avec un registre 8 bits. On voit là l'intérêt pour positionner un pointeur ou calculer une somme dépassant le cadre du 8 bits.

LDB    #$C2      > B=&HC2
LDX    #$A100    > X=&HA100
ABX              > X=B+X (soit &HA1C2)
LEAS      ajoute au registre 16 bits S
LEAU      ajoute au registre 16 bits U
LEAY      ajoute au registre 16 bits Y
LEAX      ajoute au registre 16 bits X

Ces instructions sont plutôt utilisées pour les déplacements de pointeur. Mais LEAY et LEAX entrent souvent en jeu pour les compteurs de boucles nécessitant plus de 256 révolutions. Il est à noter que seuls LEAY et LEAX positionnent le flag condition Z (condition d'égalité) ce qui permet d'effectuer consécutivement un branchement sans test préalable:

LEAX    -1,X     > X=X-1
BNE     SUITE    > IF X<>0 THEN [SUITE]

LEAU et LEAS nécessiteraient une comparaison de registre avant le branchement conditionnel

LEAU    -1,U     > U=U-1
CMPU    #$0000   > Z=(U=$0000)
BNE     SUITE    > IF Z=0 THEN [SUITE]

ATTENTION! Ces instructions prennent en compte le signe (bit 7) du registre de déplacement dans le cas de l'utilisation d'un registre 8 bits. "LEAX B,X" n'aura pas le même effet que "ABX": si le bit 7 de B est à 1 (valeur comprise de $80 à $FF), le registre 16 bits X sera décrémenté.

Un programme pour changer les couleurs de forme de l'écran moniteur. Chaque segment de couleur de forme de la mémoire de fond est augmenté de 1. Avant l'exécution du programme, remplissez votre écran moniteur avec un "DE000", par exemple.

Dans la première colonne, le champ étiquette. Dans la deuxième, le programme pour les TO. Dans la troisième, à titre d'information, le programme pour MO. Enfin, dans la quatrième colonne, le commentaire du programme. Pour l'adaptation des programmes TO sur MO, vous devez savoir que les routines moniteur sont sous interruptions logicielles (donc appelées par un CALL + un numéro d'interruption), que l'écran se trouve à une place différente du TO, que sa mémoire de fond est codée différemment et que l'instruction d'arrêt du programme est STOP et non SWI:

DEBUT  | LDB    $E7C3  |               | |
       | ANDB   #$FE   |               | | Passe en RAMB
       | STB    $E7C3  | CALL   $04    | |
SUITE  | BSR    COLOR  | BSR    COLOR  | Change couleurs de forme
       | JSR    $E806  | CALL   $0A    | Test clavier
       | CMPB   #$20   | CMPB   #$20   | | Si pas barre
       | BNE    SUITE  | BNE    SUITE  | | espace, boucle
       | SWI           | STOP          | Arrêt du programme
* Change les couleurs de forme de l'écran
COLOR  | LDU    #$4000 | LDU    #$0000 | Pointeur d'écran
       | LDX    #8000  | LDX    #8000  | Taille de l'écran
COLR0  | LDB    ,U     | LDB    ,U     | Lit le segment
       | ADDB   #$8    | ADDB   #$10   | | Incrémente la
       | ORB    #$80   |               | | couleur de forme
       | STB    ,U+    | STB    ,U+    | Ecrit le segment
       | LEAX   -1,X   | LEAX   -1,X   | | Pour tous les
       | BNE    COLR0  | BNE    COLR0  | | segments de l'écran
       | RTS           | RTS           | Retour de s\programme
       |               |               |
       | END           | END           | * Fin du programme
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