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 1s 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