2.3 Jeux d`instructions du 6809

publicité
Royaume du Maroc
OFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL
Module 11
Introduction aux Microprocesseurs
Résumé de Théorie
Télécharger tous les modules de toutes les filières de l'OFPPT sur le site dédié à la formation professionnelle au Maroc :
www.marocetude.com
Pour cela visiter notre site www.marocetude.com et choisissez la rubrique : MODULES ISTA
Première Année
Programme de Formation des Techniciens Spécialisés en
Électronique
DIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATION
Septembre 1995
INTRODUCTION AUX MICROPROCESSEURS
RÉSUMÉ DE THÉORIE
Écrire un Programme Opérationnel en Assembleur
TECCART INTERNATIONAL 2000 inc.
3155, boul. Hochelaga,
Montréal, Québec (Canada)
H1W 1G4
RÉDACTION
Serge Leblanc
DESSINS ET CONCEPTION GRAPHIQUE
Serge Leblanc
RÉVISION TECHNIQUE
Pierre Asselin & Christian Lépine
RÉVISION LINGUISTIQUE
François Gaudreau
COMMISSION DE VALIDATION
Formateurs de l'OFPPT
Les droits de reproduction et de diffusion de ce document sont cédés par Teccart
International 2000 inc. à l’Office de la Formation Professionnelle et de la Promotion
du Travail du Royaume du Maroc, pour sa propre utilisation au Maroc.
Mis à part l’OFPPT, toute reproduction, en tout ou en partie, par quelque procédé
que ce soit, est interdite.
Mp_Rt2.Doc, imprimé à Montréal, le 18 avril 2017
TABLE DES MATIÈRES
2. ÉCRIRE UN PROGRAMME OPERATIONNEL EN ASSEMBLEUR
2-1
2.1 Les langages de programmation
2-1
2.2 La programmation d’un microprocesseur
2-2
2.3 Jeux d’instructions du 6809
2-3
2.4 Durée d’exécution d’un programme
2.4.1 Boucle de délai
2-4
2-4
2.5 Les champs d’un programme en langage assembleur
2-5
2.6 Comment rédiger un programme
2.6.1 Description de la tâche
2.6.2 Algorithme
2.6.3 Ordinogramme
2.6.4 Conseils pratiques pour la réalisation d’un ordinogramme
2.6.5 Exemple d’ordinogramme
2-6
2-6
2-6
2-6
2-8
2-8
2.7 Programmation structurée
2.7.1 Conseils pratiques pour l’écriture d’un programme en assembleur
2.7.2 Dépannage
2.7.3 Documentation
2-9
2-9
2-10
2-10
2.8 Modes d’adressage du 6809
2.8.1 Mode d'adressage immédiat
2.8.2 Mode d'adressage étendu (extended)
2.8.3 Mode d'adressage inhérent
2.8.4 Mode d'adressage direct
2.8.5 Mode d’adressage indirect
2.8.6 Mode d'adressage indexé
2-11
2-11
2-11
2-11
2-12
2-12
2-13
2.9 Pointeur de pile
2.9.1 Instructions manipulant les piles
2.9.2 Mouvement du pointeur de la pile
2.9.3 Contenu de la pile:
2.9.4 Ordres d'empilement et de dépilement.
2.9.5 Exemple de programme utilisant la pile
2.9.6 Observations sur le fonctionnement de la pile
2-15
2-15
2-16
2-16
2-16
2-17
2-18
2.10 Exercices
2-19
Résumé de Théorie
Introduction aux Microprocesseurs
2. Écrire un Programme Opérationnel en Assembleur
2.1 Les langages de programmation
Il existe plusieurs langages de programmation; toutefois, le langage machine est le seul
compris par les microprocesseurs et est incontestablement le plus rapide à exécuter. Le
langage assembleur permet d’utiliser des mnémoniques pour remplacer les codes
machines difficiles à interpréter. Les langages évolués bénificient de librairies de
fonctions rendant la programmation plus simple à développer.
NOM
EXEMPLE DE
PROGRAMME
LANGAGE
En binaire:
10100101
01100000
01100101
01100001
10000101
01100010
MACHINE
PROGRAMME DE
TRADUCTION
EN MACHINE
Hexadecimal Loader
- accepte les codes
hexadécimaux
- les traduit en binaire
- les place en ordre dans
la mémoire
- le seul langage compris par le CPU
ASSEMBLEUR
- accepte les
mnémoniques
- les traduit en binaire
- les place généralement
dans un fichier
- le programme écrit sous forme
mnémonique est appelé
programme Source
INTERPRETEUR
- traduit et exécute le
programme ligne par
ligne.
- langage orienté vers les procédures
plutôt que des instructions données
au CPU
En hexadécimal:
A5
60
65
61
85
62
LANGAGE
ASSEMBLEUR
LDA $60
ADC $61
STA $62
LANGAGE DE
En BASIC:
HAUT NIVEAU
PRINT Allo
N=PEEK(96)
POKE 98,N END
- Basic
-C
- Pascal
- ...
Programmer en Assembleur
REMARQUES
COMPILATEUR:
- traduit tout le
programme en machine
avant de l'exécuter.
page 2-1
- le programme en langage machine
est appelé programme objet
- le programme Hexadecimal Loader
fait en général partie d'un
programme appelé MONITEUR.
ses fonctions: examiner et modifier
le contenu des mémoires et des
registres; il permet l'exécution
partielle ou totale du programme
- il contient les champs: étiquette,
mnémonique (instruction avec
opérande) et commentaire.
- prog. source indépendant du CPU
ou de l'ordinateur.
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.2 La programmation d’un microprocesseur
Pour commencer, définissons ce qu'est un programme. On peut dire simplement qu'un
programme est une suite logique d'instructions dont l'objectif est de produire un
comportement désiré de la machine. Tous les microprocesseurs comprennent un seul type
de programme; c'est le programme machine appelé aussi programme binaire ou objet.
Voici un programme objet exécutable par un MC6809:
code binaire
fonction
instruction
1000 0110
0101 1010
1011 0111
0000 0001
0000 0000
0011 1111
opcode
opérande
opcode
opérande
opérande
opcode
1ère instruction
2ème instruction
3ème instruction
Figure 2-1 Programme objet (binaire)
Le terme opcode signifie operational code ou code d'opération. Ce code représente un
ordre donné au microprocesseur. Lorsqu'une opérande est présente, elle suit toujours
l'opcode et représente, soit une valeur immédiate ou réelle ou une adresse vers laquelle le
microprocesseur doit communiquer. Il est toutefois possible que l'opérande ne soit pas
requise s'il s'agit d'opération interne du microprocesseur (mode inhérent).
Comme vous le remarquez, la représentation du programme sous la forme binaire est
difficile à comprendre et c’est pour cette raison qu’elle n'est pas utilisée. Pour améliorer
la situation, on peut utiliser la représentation hexadécimale. Cela permet de diminuer les
erreurs lors de l'entrée du programme en mémoire, parce qu’il y a moins de touches à
appuyer.
Le même programme sous la forme hexadécimale:
code hexadéc.
fonction
instruction
86
5A
B7
01
00
3F
opcode
opérande
opcode
opérande
opérande
opcode
1ère instruction
2ème instruction
3ème instruction
Figure 2-2 Programme objet (hexadécimal)
On peut très vite conclure que le programme objet, même transformé en hexadécimal,
n'est pas très commode car il est difficile, pour un humain, d'interpréter ce que fera celuici. Dans le but de faciliter la compréhension du programme, on va associer à chaque
instruction une mnémonique qui est une représentation de l'instruction sous la forme d'un
mot court qui, habituellement, est descriptif et plus facile à mémoriser.
Programmer en Assembleur
page 2-2
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
Représentation du programme en mnémonique. Pour plus de clarté, l'opcode et l'opérande
ont été réunis sur la même ligne.
Code machine
Opcode
Opérande
86 5A
B7 01 00
3F
LDA
STA
SWI
#$5A
$0100
1ère instruction
2ème instruction
3ème instruction
Figure 2-3 Programme avec mnémoniques
2.3 Jeux d’instructions du 6809
La carte de codification présente l’ensemble des instructions utilisables par le 6809. La
figure suivante montre comment décoder l’information sur cette carte de codification.
Instruction
Addressing Modes
Immediat Direct Indexed Extended Inherent
5 3 2 1 0
Forms Op ~ # Op ~ # Op ~ # Op ~ # Op ~ # Description H N Z V C
LD
LDA
LDB
1
2
86 2 2 96 4 2 A6 4+ 2+ B6 5 3
C6 2 2 D6 4 2 E6 4+ 2+ F6 5 3
3
4
5
6
•
•
M -> A
M -> B
7
8
0
0
•
•
9
Figure 2-4 Carte de codification du 6809
Chaque colonne est numéroté et correspond à ce qui suit.
Col. #1
Contient les instructions possibles pour le microprocesseur.
Col. #2
Détermine si l'instruction opère avec la mémoire ou avec un registre; dans
ce cas avec quel registre.
Col. #3, 4, 5, 6 et 7
Ces 5 colonnes représentent les 5 types de base des modes
d'adressages du microprocesseur:
 Immediat (opérande: une valeur)
 Direct
(opérande: une adresse de 8 bits)
 Indexed (opérande: un registre pointeur)
 Extended (opérande: une adresse de 16 bits)
 Inhérent (il n'y a pas d'opérande)
Chacune de ces colonnes est subdivisée en 3 autres colonnes:

Op
(code d'opération de l'instruction)

~
#
(nombre de cycles de l'instruction)

(nombre d'octets de l'instruction)
Col. #8
C'est une explication courte de ce que fait l'instruction.
Col. #9
Cette section (5 colonnes) indique comment les drapeaux H, N, Z, V et C
vont réagir à l'exécution de l'instruction. Vous trouverez la légende des
symboles, utilisés dans ces colonnes, sur la carte de codification à la suite
des instructions.
Programmer en Assembleur
page 2-3
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.4 Durée d’exécution d’un programme
La durée d’exécution d’une instruction se calcule en tenant compte du nombre de cycles
de l’instruction, multiplié par la période du cycle machine du microprocesseur. Dans le
cas du microprocesseur 6809, la fréquence d’horloge déterminant la durée du cycle
machine est égale à la fréquence du crystal divisée par quatre.
Par exemple, si la fréquence du crystal du microprocesseur 6809 vaut 4 Mhz, alors la
fréquence d’horloge (E ou Q) vaut:
Fréq. de E = Fréq. du crystal / 4 = 1 Mhz
La durée d’un cycle machine est égale à la période de l’horloge (E ou Q) et vaut:
Période de E = 1 / Fréq. de E = 1µs
Pour une instruction durant 5 cycles, le temps d’exécution est donc 5 fois le temps d’un
cycle machine, c’est-à-dire 5 µs. Le nombre de cycles de l’instruction se trouve dans les
colonnes de la carte de codification du 6809 dont l’entête commence avec le signe ~.
2.4.1 Boucle de délai
CODE
MACHINE
86 05
4A
26 FD
39
ETIQUETTE
ENCORE
OPCODE
LDA
DECA
BNE
RTS
OPÉRANDE
#5
ENCORE
NBR. DE
CYCLES
2
2
3
5
Cet exemple montre un sous-programme permettant de créer un délai dont la durée
dépend de la valeur placée dans le registre A. On peut voir, par l’analyse du programme,
que seules les instruction DECA et BNE vont se répéter 5 fois. Le calcul du nombre de
cycles total pour le programme est:
nombre de cycles = 2 + 5 * (2 + 3) + 5 = 32 cycles
Avec un crystal à 4 Mhz, un cycle vaut 1s et la durée du sous-programme est:
durée = 32 cycles * 1µs = 32 µs
Programmer en Assembleur
page 2-4
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.5 Les champs d’un programme en langage assembleur
Voici un exemple de programme en langage assembleur. Les champs étiquettes,
mnémonique et commentaires sont créés par le programmeur. Les champs adresse
hexa. et code machine sont générés par un programme nommé assembleur.
ADRESSE
HEXA
0200
0200
0201
0204
0207
CODE
MACHINE
ÉTIQUETTE
A5
DONNEE
PORTB
DEBUT
B6 02 00
B7 60 02
7E 02 01
MNÉMONIQUE
Opération
Opérande
ORG
$0200
DB
$A5
EQU
$6002
LDA
DONNEE
STA
PORTB
JMP
DEBUT
END
COMMENTAIRES
adresse du prog.
déclaration de la variable DONNEE
déclaration de la constante PORTB
lire la donnée et la placer dans le reg. A
déposer le code du reg. A sur le port de sortie
le programme boucle sur lui-même
directive fin de programme pour l’assembleur
ADRESSE:
La progression des adresses dépend de la longueur en octets de l'instruction.
CODE MACHINE:
Ce sont les codes sous la forme hexadécimale correspondant à l'instruction. On les trouve
sur la carte de codification du MC6809.
ÉTIQUETTE:
Ce sont des mots représentatifs qui servent de références. Elles remplacent des adresses
ou des constantes.
MNÉMONIQUE:
C'est l'instruction complète incluant l'opération et l'opérande.
OPERATION: C'est l'instruction de base.
OPERANDE: C'est la donnée de l'instruction. Elle peut représenter une valeur,
une adresse ou un registre. Certaines instructions n'utilisent pas
d’opérande.
COMMENTAIRE:
Champ optionnel mais très utile pour la compréhension du programme. Chaque ligne ne
doit pas être nécessairement commentée; seules les lignes clés doivent l'être.
Conseils pratiques:
- Éviter de répéter l'instruction textuellement.
- N’utiliser que des commentaires pertinents à la compréhension du programme.
- Les commentaires sont de type télégraphique pour éviter que le programme
ressemble à une oeuvre littéraire!!!
Programmer en Assembleur
page 2-5
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.6 Comment rédiger un programme
La rédaction d'un programme se divise en 6 étapes, toutes aussi importantes les unes que
les autres:






description de la tâche;
rédaction d'un algorithme;
rédaction d'un ordinogramme;
rédaction du programme;
dépannage;
documentation.
2.6.1 Description de la tâche
C'est la donnée du problème. Il s'agit en fait de décrire clairement, simplement mais sans
rien omettre, tout ce que le programme doit être capable de réaliser.
La description de la tâche est au programme ce que la liste des spécifications est pour un
appareil électronique quelconque.
Pour le programmeur, une bonne description de la tâche évitera l'ennui de devoir
recommencer plusieurs fois la rédaction de l’algorithme, de l’ordinogramme et du
programme parce qu'on a oublié de considérer certaines options.
Pour l'utilisateur, une bonne description de la tâche permettra de mieux exploiter le
programme, tout en étant conscient de ces limites.
2.6.2 Algorithme
L'algorithme est la description, étape par étape, des opérations à effectuer sur un
ensemble de données pour arriver aux résultats. Ces données doivent avoir été bien
définies dans la description de la tâche.
Les différentes étapes sont ordonnées de façon séquentielle, c'est-à-dire comment elles se
déroulent dans le temps.
2.6.3 Ordinogramme
Un ordinogramme est une représentation graphique des étapes suivies par un programme.
Cette façon d'illustrer la séquence logique des opérations a trois avantages:
- facilite le codage ou l'écriture du programme;
- facilite la compréhension du programme;
- est utile pour le dépannage du programme.
Après le tracé de l'ordinogramme, il faut en vérifier le cheminement logique par des
essais théoriques avec quelques données numériques avant d'écrire les instructions en
détail.
Programmer en Assembleur
page 2-6
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
- Début ou fin d'un prog. ou d'un sous-prog.
Début: contient le nom du prog. ou du sous-prog.
Fin: contient le mot FIN pour un prog. et le mot
RETOUR pour un sous-programme.
- Traitement d'information.
- Opération de test pour prendre une décision. Sert à faire un branchement
conditionnel.
- Opération d'entrée/sortie comme lire, afficher, écrire ...
- Renvoi. Utilisé pour diminuer le nombre de flèches ou éviter qu'elles se
croisent.
- Renvoi de page.
ou
- Sous-programme. Contient le nom du sous-programme. appelé aussi
sous-routine.
- Utilisé pour écrire les remarques explicatives ou commentaires.
- Flèche de direction du cheminement de l'information dans
l'ordinogramme.
Figure 2-5
Programmer en Assembleur
page 2-7
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.6.4 Conseils pratiques pour la réalisation d’un ordinogramme

Ne jamais croiser les flèches.
Utiliser les renvois pour réduire le nombre de flèches, s'il y en a trop, et pour éviter
qu'elles se croisent.
 Autant que possible, donner à l'ordinogramme une structure linéaire, de haut en bas.
 Utiliser un gabarit ou un logiciel d'édition graphique.
 Utiliser des noms courts et représentatifs des variables qu'ils symbolisent.
 L'ordinogramme doit représenter une solution générale, indépendante du langage et de
l'ordinateur utilisé.
 Vérifier la logique de l'ordinogramme en essayant quelques valeurs numériques avant
de rédiger le programme.

2.6.5 Exemple d’ordinogramme
La figure suivante représente l’ordinogramme d’un jeux de lumière nommé
CHENILLARD. On y trouve deux parties: une pour le programme principal, l’autre pour
le sous-programme DELAI. La variable CODE est une valeur à 8 bits et représente le
code transmis sur les Led tandis que la variable VALUE est une variable à 16 bits et
détermine la durée du délai.
CHENILLARD
DELAI
$01 -> CODE
$xxxx -> VALUE
CODE -> LEDs
decremente
VALUE
DELAI
oui
décalage à
gauche de
CODE
oui
VALUE
différent de 0
?
non
Retour
CODE
est différent de
0?
non
Figure 2-6
Programmer en Assembleur
page 2-8
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.7 Programmation structurée
La technique de programmation structurée ou modulaire consiste à subdiviser le
programme en modules ou sous-programmes. Ainsi, le problème à solutionner, au début
d'apparence très complexe, est remplacé par plusieurs petits problèmes beaucoup plus
simples à solutionner séparément. Il est donc recommandé de rédiger les programmes en
incluant les sections suivantes:

identification et titre du programme;
description du programme;
 section d'initialisation;
 programme principal;
 sous-programmes ou modules.

La section d'initialisation décrit et initialise toutes les constantes et les variables utilisées
dans le programme. Un rapide coup d'oeil à cette section empèche d'utiliser le même
symbole pour deux quantités différentes.
Le programme principal unit tous les sous-programmes et coordonne la suite d'exécution
de ceux-ci. Il suffit donc de regarder cette section pour voir les grandes tâches
qu'accomplira le programme.
Chaque module ou sous-programme, appelé aussi sous-routine, est un petit bloc de
programmation qui réalise une partie bien spécifique (formant toutefois un tout
indépendant) de l'ensemble logique nécessaire à la résolution du problème.
Les avantages de la programmation structurée sont:

la lisibilité;
la facilité de compréhension par autrui;
 la rapidité dans la réalisation;
 la rapidité à dépanner;
 la facilité à modifier.

2.7.1 Conseils pratiques pour l’écriture d’un programme en assembleur
Pour les programmes en langage ASSEMBLEUR, débutez toujours les sous-routines en
fournissant les informations suivantes:

une brève description de la sous-routine;
un registre contenant les paramètres d'entrée;
 des registres contenant les paramètres de sortie;
 des registres affectés par la sous-routine.

Programmer en Assembleur
page 2-9
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
Si les registres affectés par la sous-routine sont déjà utilisés par le programme qui appelle
cette sous-routine, il faudra, avant d'appeler cette dernière, sauver le contenu de ces
registres sur la pile. Ainsi, lorsque l'exécution de la sous-routine sera terminée, le contenu
de ces registres pourra être récupéré avant de reprendre l'exécution du programme
principal. Cette méthode s'applique aussi avec les sous-routines du moniteur dans la
ROM. De manière générale, une sous-routine sera plus claire si ces registres sont sauvés
au tout début de celle-ci et récupérés avant de retourner au programme principal.
Sauvez votre programme souvent au fur et à mesure que votre travail avance. Si le
système a une défaillance, vous ne serez pas obligé de recommencer au complet.
2.7.2 Dépannage
Pour dépanner vos programmes, utilisez des points d’arrêts aux endroits stratégiques afin
de trouver l'endroit où le programme cafouille. Ainsi, l'ordinateur se rendra rapidement
jusqu'au point d'arrêt puis arrêtera et attendra que vous lui donniez la permission de
continuer l'exécution du programme. Vous pourrez consulter les registres et les variables
du programme afin de déceler l’intermittance (BUG) avant de continuer l'exécution. On
peut aussi exécuter le programme en mode pas-à-pas et surveiller la progression des
registres et les actions sur les sorties.
2.7.3 Documentation
Pour pouvoir utiliser, corriger ou améliorer un programme, il est essentiel de bien le
documenter. Deux types de renseignements doivent être fournis:

la documentation pour l'usager;
 la documentation technique.
La documentation pour l'usager doit regrouper tous les renseignements pertinents
pour utiliser le programme sans nécessairement le comprendre à fond.
La documentation technique sert à l'entretien et la mise à jour du programme. Elle
contient:

la description de la tâche;
l'algorithme;
 l'ordinogramme;
 une liste commentée du programme;
 toute information pertinente additionnelle.

Programmer en Assembleur
page 2-10
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.8 Modes d’adressage du 6809
Dès que l'on commence à programmer, il est extrêmement important de comprendre les
modes d'adressage si l'on veut profiter de toute la puissance du 6809. Dans une
instruction, l'adressage spécifie l'emplacement de l'opérande avec lequel l'instruction doit
être exécutée. Cet emplacement sera dorénavant appelé l'adresse effective.
2.8.1 Mode d'adressage immédiat
Dans ce mode d'adressage, la donnée à utiliser est dans l'opérande. L'adressage immédiat
est identifié par le symbole #. L'opérande peut être de 8 bits ou de 16 bits, selon le registre
utilisé. Voici quelques exemples d'instructions de ce mode:
LDX #$6000
; place la valeur $6000 dans le registre X
ORA #$80
; fait un ou logique entre le reg.A et la valeur $80. Résultat dans A
2.8.2 Mode d'adressage étendu (extended)
Le mode d'adressage étendu utilise l'adresse effective de la donnée comme opérande
plutôt que la donnée elle-même. Ce mode est utilisé pour lire ou écrire une donnée dans
la mémoire ou sur une entrée/sortie. Avec l'assembleur, on peut forcer le mode étendu par
l'usage du symbole > placé en avant de l'opérande; cela évite que l'assembleur utilise le
mode direct quand il détecte la possibilité de le faire. Voici quelques exemples
d'instructions de ce mode:
LDA $6000
; place la valeur contenu à l'adresse $6000 dans le reg. A
ANDA $00FF
; fait un et logique entre la valeur contenue à l'adresse $00FF et le
reg.A et dépose le résultat dans le reg. A
STA PORTB
; dépose le contenu du reg. A à l'adresse correspondante à
l'étiquette PORTB
2.8.3 Mode d'adressage inhérent
Ce mode d'adressage se caractérise par le fait qu'il n'utilise pas d'opérandes. Aucun appel
à une case mémoire est nécessaire pour effectuer la fonction demandée. Le CPU sait que
le traitement s'effectue directement sur le(s) registre(s). Voici quelques exemples
d'instructions de ce mode:
CLRA
; remise à zéro du reg. A
LSLB
; fait un décalage logique à gauche avec le contenu du reg.B
RTS
; exécute le retour au prog. principal pour terminer un sous-prog.
(adr. de retour --> reg. PC)
SWI
; interruption logicielle (appelle un programme d'interruption)
souvent utilisé par les prog. moniteurs comme point d'arrêt
Programmer en Assembleur
page 2-11
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.8.4 Mode d'adressage direct
Le mode direct est très similaire au mode étendu. L'opérande représente aussi une
adresse, comme le mode étendu; sauf que seul l'octet le moins significatif est défini. Pour
le 6809, une adresse est composée de 2 octets; il en manque un et c'est l'octet représentant
la partie la plus significative de l'adresse. Cet octet manquant est remplacé par le registre
de page direct nommé DP. Pour former l'adresse effective, le CPU va combiner le registre
DP avec l'opérande.
LDA $02
; si le reg. DP vaut $60, le reg. A sera chargé avec le contenu de
l'adresse effective $6002
2.8.5 Mode d’adressage indirect
L'adressage indirect permet de recueillir l'adresse effective dans le contenu de celle
spécifiée par l'opérande; on travaille donc avec l'adresse de l'adresse de la donnée. Les
modes d'adressage Étendu et Indexé peuvent utiliser l'adressage indirect. Voici quelques
instructions utilisant l'adressage indirect:
JSR [OUTCAR] ; appel du sous-prog. OUTCAR; on forme l'adresse effective de
la sous-routine par l'assemblage de l'octet lu par le CPU à
l'adresse de OUTCAR constituant la partie msb de l'adr. eff. et
le code lu à l'adresse de OUTCAR+1 constituant l'octet lsb de
l'adresse effective
LDA [$1000]
; les contenus des adresses $1000 et $1001 deviennent l'adresse
effective de la donnée à charger dans le registre A
STB[,Y]
; la valeur du reg. B est déposée à l'adresse effective; celle-ci est
formée par le contenu de deux cases mémoires consécutives
pointées par le registre d'index Y; à l'adresse du pointeur on
trouve l'octet msb de l'adr. eff. tandis qu'à l'adresse suivante on
trouve l'octet lsb de l'adr. eff.
Programmer en Assembleur
page 2-12
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.8.6 Mode d'adressage indexé
Le mode indexé est utilisé principalement pour la manipulation de tableaux ou de blocs
mémoire. Avec le MC6809, on peut utiliser comme registre d'index les registres X et Y.
Notez que la dimension de ces registres est de 16 bits.
Le mode indexé se sert d’un pointeur (généralement X et Y, possiblement U,S et PC) qui
contient l'adresse effective de la donnée à traiter. Ce mode d'adressage est surtout efficace
avec des tableaux constitués d'un grand nombre de données à traiter. Voici quelques
instructions utilisant le mode indexé:
STA,X
; dépose le contenu du reg. A à l'adresse contenu dans X
LEAX 1,X
; incrémente le pointeur d'index X
LDB 5,Y
; le reg. B est chargé avec le contenu de l'adresse effective
qui est égale à la somme du reg. Y et de l'offset 5. (AE = Y+5 )
Les différents types du mode indexé:
La carte de codification du 6809 montre dans la section INDEXED ADDRESSING MODES les
différentes façons d’utiliser le mode indexé comme le tableau ci-dessous:
FORME ASSEMBLEUR
TYPES
Constant offset from R (offset signé)
,R
n,R
Accumulator offset from R (offset signé)
A,R
B,R
Auto increment/decrement from R
,R+
,R++
Constant offset from PC (offset signé)
n,PCR
Extended indirect
[n]
R= registre X, Y, U ou S , n= offset
D,R
,-R
,--R
Le MC6809 utilise la postincrémentation et la prédécrémentation avec le type Auto
increment/decrement from R du mode indexé. En d'autre mots, si l'instruction est
LDA, X+ , le registre X s'incrémente après le chargement de l'accumulateur A. Alors que
pour l'instruction LDA ,-X, le registre X décrémente avant le chargement de
l'accumulateur A.
Programmer en Assembleur
page 2-13
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
Les modes indexés non-indirect et indirect:
Dans le mode non-indirect, l'adresse effective (l'adresse où se trouve la donnée à traiter)
est simplement la valeur de l'index plus son offset.
exemple:
LDA 2,X
mode non-indirect
X + offset = adr. effective
(adr. eff.) --> A
Dans le mode indirect, l'adresse effective est le contenu de l'adresse pointée par l'index
plus son offset. Évidemment, il est nécessaire d'utiliser le contenu de deux adresses
consécutives pour former l'adresse effective. On reconnait le mode indirect par la
présence des crochets.
exemple:
LDA [2,X]
mode indirect
(X + offset) = MSB de l’adr. effective.
(X + offset + 1) = LSB de l’adr. effective.
(adr. eff.) --> A
Utilisation du mode indexé
MODE INDEXE
Constant offset
from R
Accumulator
offset from R
Autoincrement/
decrement from R
Constant offset
fromPC
NON-INDIRECT
Pour accéder à 1 seul item (toujours
le même) d'une table de données.
Pour accéder aléatoirement au
contenu d'une table de données.
INDIRECT
Pour accéder à 1 seul item
(toujours le même) d'une table
d’adressess.
Pour accéder aléatoirement au
contenu d'une table d’adressess.
Pour accéder séquentiellement au
contenu d'une table de données.
Pour accéder séquentiellement au
contenu d'une table d’adressess.
Idem. à Constant offset from R sauf que le programme et les données
(tables) sont relocalisables.
Extended indirect
Programmer en Assembleur
non-applicable
page 2-14
La somme de l'offset et du registre
d'index donne une adresse où l'on
trouve l'adresse effective.
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.9 Pointeur de pile
La pile est une zone de stockage située dans la mémoire RAM servant à mémoriser
temporairement des informations. La gérance de la pile est réalisée par un pointeur de
pile, celui-ci ayant pour fonction de pointer la prochaine case mémoire utilisée par la pile
durant l'exécution d'une instruction d'empilement. Dans le 6809, il existe 2 pointeurs de
pile:
U -> pointeur de pile de l'usager
S -> pointeur de pile du système
2.9.1 Instructions manipulant les piles
On peut installer une pile n'importe où dans la mémoire volatile RAM par les instruction
LDS , LDU , TFR ou EXG. Par exemple, LDS #$0080 définit une pile système à l'adresse
$0080. Cette adresse reçoit le nom de haut de pile. Dans un système de développement, la
pile S est toujours initialisée. Dès la mise sous tension, le microprocesseur est occupé à
exécuter le programme moniteur;.celui-ci nécessite une pile fonctionnelle parce qu’il
appelle fréquemment des sous-programmes et doit obligatoirement faire usage de la pile
pour mémoriser les adresses de retour des sous-programmes.
La pile S est gérée par un ensemble d'instructions du type:

PSHS qui pousse les données dans la pile S.
(ex: PSHS A,X)

PULS qui retire les données de la pile S.
(ex: PULS A,X)

JSR ou BSR qui poussent la valeur du compteur de programme (PC) dans
la pile S pour sauvegarder l'adresse de retour d'une sous-routine.

RTS qui retire l'adresse de retour d'une sous-routine de la pile S.
La pile U n'est jamais utilisée par le système lors d'un appel à une sous-routine. Cette
fonction est réservée à la pile S. À part cette différence, les deux pointeurs de pile
fonctionnent de la même façon que les registres LIFO (last in first out). La donnée
poussée en dernier doit être retirée en premier.
Programmer en Assembleur
page 2-15
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.9.2 Mouvement du pointeur de la pile
L'exemple démontre le mouvement du pointeur de pile S lorsque qu'un appel à une sousroutine survient.
Programme:
ADRESSE
ETIQUETTE
MNEMONIQUE
1000
DEBUT
BSR JOB1
1002
SWI
1003
JOB1
RTS
2.9.3 Contenu de la pile:
On voit ici le contenu de la pile avant l’appel de la sous routine, pendant la sous routine et
après l’appel de la sous routine.
ADRESSE
AVANT
PENDANT
APRES
S
XX<-- S
XX
XX <-- S
S-1
XX
02
02
S-2
XX
10 <-- S
10
S-3
XX
XX
XX
2.9.4 Ordres d'empilement et de dépilement.
L'instruction PSHS et PULS permet de sauver ou de récupérer un ou plusieurs registres
dans la pile.
exemple:
PSHS A,B,X,Y,U sauve les registres
PULS A,B,X,Y,U récupère les registres
Voyons maintenant l'ordre dans lequel sont placés les registres dans la pile, lorsque le
CPU exécute une instruction de type PSHS ou PULS. Le pointeur de pile se déplace vers
les adresses basses pour une instruction push et vers les adresses hautes pour un pull. Un
tableau sur la carte de codification montre les ordres d'empilement et de dépilement.
CONTENU ADRESSE CONTENU ADRESSE
PC LO
PC HI
S/U LO
S/U HI
Y LO
Y HI
X LO
Programmer en Assembleur
S-1
S-2
S-3
S-4
S-5
S-6
X HI
DP
B
A
CC
page 2-16
S-7
S-8
S-9
S-10
S-11
S-12
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.9.5 Exemple de programme utilisant la pile
Aussitôt qu’un appel à un sous-programme est effectué, la pile du système est sollicitée. Il
faut donc qu’elle soit déjà initialisée. Dans une application autonome, le programmeur
doit lui-même initialiser le pointeur de pile avec une instruction comme:
LDS #$xxxx où xxxx est une adresse de la RAM représentant le haut de la pile.
Généralement, une centaine d’octets sont nécessaires pour la dimension de la pile.
Certains programmes utilisent la pile pour y emmagasiner temporairement une quantité
importante d’informations; le programmeur doit prévoir une zone mémoire plus grande.
L’exemple démontre l’initialisation du pointeur de pile dans un programme autonome.
6809 Macro Assembler
-----------------------------------------------Input Filename : pile.ASM
Output Filename : pile.OBJ
1
*****************************************
2
* Programme demontrant l'initialisation
3
* et le fonctionnement de la pile S.
4
* par: Serge Leblanc (mai 1995)
5
*****************************************
6
E000
ORG
$E000
etabli l'adresse du programme
7
8
2000
LED
EQU
$2000
adr. du dispositif de sortie
9
10 E000 10 CE 01 00 DEBUT
LDS
#$0100
initialise le pointeur de pile
11 E004 86 01
ENCORE
LDA
#$01
valeur de depart
12 E006 B7 20 00
GAUCHE
STA
LED
ecriture port de sortie
13 E009 8D 05
BSR
DELAI
appel du sous-pro DELAI
14 E00B 48
LSLA
decalage a gauche de la valeur
15 E00C 26 F8
BNE
GAUCHE
test si rotation termine
16 E00E 20 F4
BRA
ENCORE
oui, recommence
17
*----------------------18
* Sous-programme DELAI.
19
*
20
* para. d'entree : aucun
21
* para. de sortie: aucun
22
* reg. affectes : CC
23
24 E010 34 10
DELAI
PSHS
X
sauve le registre X
25 E012 8E 30 D4
LDX
#$30D4
etabli la duree du DELAI
26 E015 30 1F
REPETE
LEAX
-1,X
decremente le compteur X
27 E017 26 FC
BNE
REPETE
test si rendu a zero
28 E019 35 10
PULS
X
oui, on recupere valeur de X
29 E01B 39
RTS
retour au programme principal
30
*----------------------31 FFFE
ORG
$FFFE
pointe le vecteur RESET
32
33 FFFE E000
DW
DEBUT
etabli le contenu du vect. RESET
34
*----------------------35 0000
END
Programmer en Assembleur
page 2-17
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.9.6 Observations sur le fonctionnement de la pile

Dans le programme précédent, le pointeur de pile du système est initialisé avec la
valeur $0100 voir la ligne #10.

Lorsque le microprocesseur quitte le programme principal pour aller exécuter la sousroutine DELAI, le registre PC est automatiquement sauvé pour conserver l’adresse de
retour.

La valeur de l'adresse de retour, que le microprocesseur doit sauvegarder lorsqu’il va
exécuter le sous-programme DELAI, est l’adresse de l’instruction qui suit l’appel du
sous-programme. Dans ce cas, cette adresse se trouve à la ligne #14 et correspond à
$E00B.

Selon l’ordre d’empilement établit par le manufacturier, l'octet le moins significatif de
l'adresse de retour du sous-programme a été sauvé dans la pile à l’adresse $00FF et
l'octet le plus significatif à l’adresse $00FE.

La valeur du pointeur de pile au moment où le microprocesseur commence la lecture
de la première instruction du sous-programme est $00FE. Seul le registre PC a été
sauvegardé jusqu’à maintenant.

La valeur du pointeur de pile, au moment où le microprocesseur commence la lecture
de la deuxième instruction du sous-programme, est $00FC. Le registre X est ajouté
dans la pile par l’instruction PSHS X, et le pointeur de pile S est automatiquement
ajusté.

La valeur du pointeur de pile, après que le microprocesseur ait exécuté l'instruction
RTS du sous-programme, est $0100. Le pointeur est donc revenu à sa position
initiale puisque tous les registres sauvegardés dans la pile ont été retirés.

Le programme plante si on oublie de placer l'instruction PULS X avant l'instruction
RTS. Au moment où l’on croit reprendre la valeur du PC, le pointeur de pile pointe la
valeur sauvegardée pour le registre X et c’est cette valeur qui sera retournée au PC.

Durant l'exécution de ce programme, la valeur la plus basse du pointeur de pile S a été
$00FC. Quatre octets ont été sauvé dans la pile, le pointeur de pile a donc descendu
de quatre adresses ($0100 - $0004 = $00FC).
Programmer en Assembleur
page 2-18
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
2.10 Exercices
Exercices sur les modes d'adressage
# 1 - Trouvez le mode d’adressage utilisé pour chaque instruction. Les instructions de cet
exercice ne représentent pas un programme utilisable.
Mnémonique
Opcode
Opérande
CLRA
LDB
#$B4
INCA
LDX
#0100
LDA
$1400
STA
$1402
LDA
,X
DECB
ORA
#%10000000
ANDB
#$FE
JMP
$0200
Mode
# 2 - Trouvez les codes machines de chaque instruction et écrivez une brève description de
ce que fait l'instruction dans la colonne commentaire.
Code machine
Mnémonique
Opération Opérande
CLRA
INCB
DECA
LSLA
ROLB
COMA
Commentaire
# 3 - Réalisez un programme qui fait un 'ET' entre le contenu de la case $0300 et la case
$0301. Le résultat doit être placé dans la case $0302. L'origine du programme est à
l'adresse $0200. L’arrêt du programme s’effectue par un retour au moniteur.
Mnémonique
Opcode
Opérande
Programmer en Assembleur
Commentaire
page 2-19
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
Exercices sur le mode indexé
# 4 - À quel type de mode indexé appartient l'instruction suivante?
LEAX 1,X
a) constant offset from PC
b) constant offset from R
c) extended indirect
d) accumulator offset from R
e) auto increment/decrement R
# 5 - Que vaut le registre X après l'exécution du programme ?
ORG
----------------------BARGRAF
EQU
TABLEAU
DB
*----------------------DEBUT
STOP
*----------------------SENDCODE
LDA
$0200
$4000
1,2,3,4,5
LDX
BSR
BRA
#TABLEAU
SENDCODE
STOP
,X+
CMPA
BEQ
STA
BRA
#4
SEND_FIN
BARGRAF
SENDCODE
SEN_FIN
RTS
*----------------------END
réponse: X=_______
Programmer en Assembleur
page 2-20
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
# 6 - Dans le numéro précédent, combien d'instruction(s) utilise(nt) le mode d'adressage
indexé?
réponse: __________________________
# 7 - Quelles sont les instructions qui ne sont pas valables ?
a) LDA A,U
e) ORA D,U
b) STB ,X-
f) ANDB -200,Y
c) STA DP,X
g) CLR A,S
d) CMPA 2,X+
h) ADDD ,U++
réponse: __________________________
# 8 - Quelle sera la valeur écrite sur le bargraph ?
BARGRAF
DEBUT
EQU
ORG
LDA
BSR
BRA
STOP
*----------------------ENVOIE
LDX
LDA
STA
RTS
*----------------------TABLE
DW
DW
DW
*----------------------END
$4000
$0200
#$03
ENVOIE
STOP
#TABLE
A,X
BARGRAF
$1234
$5678
$9ABC
réponse: __________________________
Programmer en Assembleur
page 2-21
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
Questions sur la Programmation
# 9 - Quelles sont les six étapes nécessaire pour la réalisation d’un programme?
a) _______________________
b) _______________________
c) _______________________
d) _______________________
e) _______________________
f) _______________________
# 10 - Quelle est la définition d’un algorithme?
_____________________________________________________________________
_____________________________________________________________________
# 11 - À quoi sert le symbole suivant dans un ordinogramme?
Réponse:
_________________________________________
# 12 - À quoi sert le symbole suivant dans un ordinogramme?
Réponse:
_________________________________________
# 13 - Quelle est l’utilité de ce symbole dans un ordinogramme?
Réponse:
_________________________________________
Programmer en Assembleur
page 2-22
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
Exercices sur les pointeurs de pile
# 14 - Supposez que le registre S est initialisé avec la valeur $0080 et que l'instruction
suivante est exécutée:
PSHS A, X
a) Que vaudra le registre S après l'instruction ?
Réponse: _______________
b) À quelle adresse a été sauvegardé l'accumulateur A ?
Réponse: _______________
# 15 - Sachant qu'au départ : S = $2000 et que l'instruction est: PSHS Y, X. À quelle adresse
sera déposée la partie LSB du registre X?
Réponse: ________________
# 16 - À la fin du programme quel sera le contenu du registre D ?
au départ:
S = $0080
X = $1234
programme:
PSHS X
PULS B
PULS A
Réponse: __________
Programmer en Assembleur
page 2-23
OFPPT/TECCART
Résumé de Théorie
Introduction aux Microprocesseurs
# 17 - Dans le sous-programme suivant, identifiez:
*-----------------------* Routine de conversion ASCII-->HEXA
*
ASCHEX
SUBA
#$30
CMPA
#9
BLS
ASC1
SUBA
#7
ASC1
RTS
*------------------------
a) paramètre(s) d'entrée(s) =
___________________________
b) paramètre(s) de sortie(s)=
___________________________
c) registre(s) affecté(s)
___________________________
=
# 18 - Dans le sous-programme DELAI, identifiez:
*-----------------------* Routine qui produit un delai de 20 mS
* avec un crystal de 3.6864Mhz
DELAI
PSHS
LDX
DEL
LEAX
BNE
PULS
RTS
*------------------------
X,CC
#2301
-1,X
DEL
X,CC
a) paramètre(s) d'entrée(s) =
___________________________
b) paramètre(s) de sortie(s)=
___________________________
c) registre(s) affecté(s)
___________________________
=
# 19 - Combien d'octets sont retirés de la pile par l'instruction: PULS X,CC dans le sousprogramme DELAI?
Réponse: _______________
# 20 - Quel est le dernier registre retiré de la pile dans le sous-programme DELAI ?
Réponse: _______________
Programmer en Assembleur
page 2-24
OFPPT/TECCART
Téléchargement