Fiche technique | |
---|---|
Type de produit : | Langage de programmation |
Auteur : | MOS Technology |
Date de publication : | 1975 |
Introduction
Le langage de programmation assembleur 6502 est destiné au microprocesseur 6502 de MOS Technology datant de 1975. Son prix était dérisoire pour l'époque, il coût 6 fois moins que les autres microprocesseurs de la même catégorie. Ce microprocesseur eut énormément de succès entre autre avec les ordinateurs Apple II et la console de jeu NES de Nintendo. Le langage de programmation assembleur 6502 est supporté par les microprocesseurs MCS6501, MCS6502, MCS6503, MCS6504 et MCS6505, MCS6506, MCS6507 et ils sont tous des microprocesseurs en 8 bits. Cette désignation signifie que 8 bits de données sont transférés ou exploités pendant chaque cycle d'instructions ou cycle d'horloge d'opération. Tous les périphériques de la famille MCS650X fonctionnent sur des données 8 bits à la fois, bien que certaines opérations ressemblent à des opérations série ou 16 bits de large. L'industrie informatique traite des combinaisons de données à 8 bits par un terme connu sous le nom d'octet. Dans de nombreux micro-ordinateurs fonctionnant simultanément sur plusieurs octets de données, le nombre d'octets étant transférés et exploités par la machine en parallèle est appelé un mot. Étant donné que ces microprocesseurs sont des microprocesseurs 8 bits, les mots et les octets sont de longueur égale.
Le bus de données
Bien que la majeure partie de la discussion suivante considérera comment on fonctionne avec un registre à usage général appelé accumulateur, il faut comprendre que les données doivent être transférées entre l'accumulateur et des sources extérieures en passant par le microprocesseur sur 8 lignes appelées bus de données. Les sources extérieures comprennent le programme contrôlant le microprocesseur, la mémoire étant utilisée comme entreposage intermédiaire pour les registres internes lorsqu'ils doivent être utilisés dans une opération en cours, et les communications réelles avec le monde via les ports d'entrée/sortie. Voici le diagramme de bloc partiel du MC650X :
La seule opération du bus de données est de transférer des données entre la mémoire et les registres internes du microprocesseur tels que l'accumulateur. La figure précédente montre la communication de base entre l'accumulateur, A, et la mémoire, M, grâce à l'utilisation de 8 lignes de données bidirectionnelles appelées bus de données.
Accumulateur
L'accumulateur est un registre dans lequel sont conservées les données sur lesquelles des opérations sont effectuées. Toutes les opérations entre les emplacements de mémoire doivent être communiquées via l'accumulateur ou l'un des registres d'index auxiliaires. L'accumulateur est utilisé comme entreposage temporaire pour déplacer des données d'un emplacement de mémoire à un autre. Par conséquent, la première utilisation de l'accumulateur (A) consiste simplement à transférer des données de la mémoire vers l'accumulateur ou de l'accumulateur vers la mémoire. On peut apporter des données dans l'accumulateur, y effectuer des opérations telles que ET / OU, tester les résultats de ces opérations, y insérer de nouveaux bits ou les transférer vers le monde extérieur. Il sert d'entreposage intermédiaire pour une série d'opérations telles que l'addition de 2 valeurs ensemble; où l'un d'eux est chargé dans l'accumulateur, le second y est ajouté et les résultats sont entreposés dans l'accumulateur. L'accumulateur agit en réalité comme deux fonctions : 1) C'est l'un des principaux points d'entreposage de la machine; 2) C'est le point auquel les résultats intermédiaires sont normalement entreposés.
LDA - Accumulateur de charge avec mémoire
Lorsque l'instruction LDA est exécutée par le microprocesseur, les données sont transférées de la mémoire vers l'accumulateur et entreposées dans l'accumulateur. Plutôt que de continuer à donner une image de mot de l'opération, sera introduite la représentation symbolique M → A, où la flèche signifie «transfert vers». Par conséquent, la représentation symbolique de l'instruction LDA est lue, «mémoire transférée à l'accumulateur». L'instruction LDA affecte le contenu de l'accumulateur, n'affecte pas les drapeaux de retenue ou de débordement; définit le drapeau de zéro si l'accumulateur est égal à zéro en raison du LDA, sinon réinitialise le drapeau de zéro; définit le drapeau négatif si le bit 7 de l'accumulateur est un 1, sinon réinitialise le drapeau négatif. Bien que le concept des modes d'adressage reste à développer, à des fins de référence, LDA est une instruction de «groupe un» et dispose de tous les principaux modes d'adressage de la machine. Ces modes d'adressage incluent Immédiat; Absolu; Page zéro; Absolue X; Absolue Y; Page zéro, X; Indexé Indirect; et Indirect Indexé.
STA - Entreposer l'accumulateur en mémoire
Cette instruction transfère le contenu de l'accumulateur en mémoire. La représentation symbolique de cette instruction est A → M. Cette instruction n'affecte aucun des drapeaux du registre d'état du microprocesseur et n'affecte pas l'accumulateur. Il s'agit d'une instruction "Groupe un" et dispose des modes d'adressage suivants: Absolue; Page zéro; Absolue X; Absolue Y; Page zéro, X; Indexé Indirect; et Indirect Indexé.
L'unité arithmétique
L'une des fonctions attendues de tout micro-ordinateur est la capacité de calculer ou d'effectuer des opérations arithmétiques. Même dans un problème de contrôle simple, on trouve souvent utile d'ajouter 2 nombres pour déterminer qu'une valeur a été atteinte, ou de soustraire 2 nombres pour calculer une nouvelle valeur devant être obtenue. De plus, de nombreux problèmes impliquent une forme rudimentaire d'arithmétique décimale ou binaire; certainement de nombreuses applications du microprocesseur impliqueront les deux. Le MCS650X dispose d'une unité arithmétique 8 bits s'interfaçant avec l'accumulateur comme le montre la figure suivante :
L'unité arithmétique est composée de plusieurs parties principales. Le plus important d'entre eux est le circuit nécessaire pour effectuer une addition complémentaire à deux de valeurs parallèles de 8 bits et générer un résultat binaire de 8 bits parallèles plus une retenue. Cependant, un examen rapide du concept de retenue s'impose. La plus grande plage pouvant être représentée dans un nombre de 8 bits est de 256 avec des valeurs comprises entre 0 et 255. Si nous ajoutons 2 nombres quelconques donnant une somme supérieure à 255, nous représentons le résultat avec un neuvième bit plus le 8 bits de l'excédent sur 255. Le neuvième bit est appelé retenue.
ADC - Ajoute de la mémoire à l'accumulateur avec la retenue
Cette instruction ajoute la valeur de mémoire et de retenue de l'opération précédente à la valeur de l'accumulateur et entrepose le résultat : dans l'accumulateur. La représentation symbolique de cette instruction est A + M + C → A. Cette instruction affecte l'accumulateur; définit le drapeau de retenue lorsque la somme d'une addition binaire dépasse 255 ou lorsque la somme d'une addition décimale dépasse 99, sinon la retenue est réinitialisée. Le drapeau de dépassement de capacité est défini lorsque le signe ou le bit 7 est modifié en raison du résultat dépassant +127 ou -128, sinon le dépassement est réinitialisé. Le drapeau négatif est activé si le résultat de l'accumulateur contient le bit 7 activé, sinon le drapeau négatif est réinitialisé. Le drapeau de zéro est défini si le résultat de l'accumulateur est 0, sinon l'indicateur zéro est réinitialisé. Il s'agit d'une instruction "Groupe un" et possède les modes d'adressage suivants: Immédiat; Absolu; Page zéro; Absolue X; Absolue Y; Page zéro, X; Indexé Indirect; et Indirect Indexé. Le neuvième bit du résultat est entreposé dans le drapeau de retenue et les 8 bits restants résident dans l'accumulateur. Le drapeau de retenue peut être considéré comme un bit de drapeau étant éloigné de l'accumulateur lui-même mais étant directement affecté par les opérations de l'accumulateur comme s'il s'agissait d'un neuvième bit dans l'accumulateur. La principale raison pour ne pas voir le bit de retenue comme un simple neuvième bit dans l'accumulateur est que l'on a le contrôle du programme sur son état en étant capable de mettre (à 1) ou d'effacer (à 0) le bit et, de bien entendu, il ne fait pas partie de l'accumulateur 8 bits dans les opérations de transfert de données.
Ajout de précision multiple
Pour effectuer l'addition de 2 nombres, on émet au microprocesseur une instruction ADC ajoutant la mémoire et l'accumulateur et entreposant les résultats dans l'accumulateur avec le bit de retenue mis à 1 si les résultats dépassent 255. Pour ajouter des nombres ayant une valeur significativement plus élevée que 255, il serait nécessaire de représenter ces nombres par une série de numéros de série à 8 bits. Avec les 16 bits dans 2 numéros de série de 8 bits, il est possible de représenter des nombres binaires d'une valeur supérieure à 65 000. Afin d'ajouter deux nombres de 16 bits ensemble et ainsi accomplir une addition de double précision, on charge d'abord l'octet le plus bas d'un nombre dans l'accumulateur, efface le drapeau de retenue, puis ajoute le deuxième nombre au premier nombre dans l'accumulateur à l'aide de la commande ADC. On entreposerait alors ce résultat dans un autre emplacement de mémoire en utilisant la commande STA. Le drapeau de retenue représenterait maintenant, la retenue de l'octet le plus bas vers l'octet le plus élevé. On pourrait alors charger l'octet de poids fort du premier nombre, ajouter à nouveau avec la retenue à la valeur haute du deuxième nombre, et entreposer le résultat dans l'octet de poids fort du résultat. Ainsi, on peut voir que la retenue nous permet d'effectuer autant d'arithmétique de précision que nécessaire. L'exemple de liste ci-dessous affiche les commandes utilisées pour exécuter l'ajout de deux nombres 16 bits :
Description | Octet de poids fort | Octet de poids faible |
---|---|---|
Premier nombre | H1 | L1 |
Deuxième nombre | H1 | L2 |
Troisième nombre | H1 | L3 |
Opérande | Octet | Description |
LDA | L1 | Charger l'octet de poids faible, premier nombre |
CLC | Effacer le drapeau de retenue (retenue = 0) | |
ADC | L2 | Ajouter L1 à l'octet de poids faible, deuxième nombre |
STA | L3 | Entreposer le résultat en mémoire, le drapeau de retenue est toujours défini s'il est défini dans l'opération ADC |
LDA | H1 | Charger l'octet de poids fort, premier nombre |
ADC | H2 | Ajouter H1 et transporter la valeur de la première opération ADC à l'octet de poids fort, deuxième nombre |
STA | H3 | Entreposer le résultat en mémoire |
Dans cet exemple, il était nécessaire d'effacer le drapeau de retenue avant de démarrer l'instruction d'ajout. Ceci, bien sûr, signifie qu'il existe des commandes définissant et effaçant le drapeau de retenue permettant une addition sans valeurs générées à partir de l'opération précédente. On pourrait également, à la fin du programme, vérifier si le résultat dépassait 16 bits en testant le drapeau de retenue.
Arithmétique signée
Il est possible de regarder l'opération d'ajout et la façon dont les données sont représentées en mémoire d'une manière différente. Si, dans le problème 16 bits, on travaillait avec 15 bits de précision (en d'autres termes, 15 bits de données valides) plus 1 bit de signe (0 pour positif et 1 pour négatif), il serait possible d'effectuer une arithmétique binaire signée sans changer l'additionneur, mais en changeant simplement la façon dont les résultats sont interprétés. Afin de faciliter ce concept, le microprocesseur a la capacité de représenter des nombres positifs ou négatifs au moyen d'un drapeau de signe. Dans la famille MCS650X, le bit 7 est le bit de position de signe. Cela signifie que l'octet d'ordre le plus élevé d'une série d'octets doit avoir le signe en huitième position. Si, pour simplifier, on parle de nombres signés de 8 bits, cela signifierait que l'on n'a permis que 128 combinaisons de chaque signe car c'est le maximum pouvant être représenté en 7 bits, avec le huitième bit ou le bit le plus élevé réservé pour la position du signe.
Il convient de noter que des opérations se produisent sur un champ de nombres de 7 bits et que toute retenue générée à partir de ce champ résidera dans le huitième bit - pas dans le drapeau de retenue discuté pendant les opérations d'ajout. La génération d'une retenue du champ est la même que lors de l'ajout de deux nombres de 8 bits, à l'exception du fait que le drapeau de retenue normal ne représente pas correctement le fait que le champ a été dépassé, c'est parce que la vraie retenue de l'ajout des deux nombres à 7 bits réside dans la position du bit de signe. Par conséquent, le drapeau de retenue n'a aucune signification réelle. Au lieu de cela, il y a un drapeau séparé, le drapeau de débordement, utilisé pour indiquer quand une retenue de 7 bits s'est produit et permet à l'utilisateur d'écrire des programmes de correction.
Addition décimale
Il existe un moyen pour l'utilisateur d'organiser les données pour les opérations décimales. Les microprocesseurs MCS650X de MOS Technology, Inc. ont un additionneur modifié permettant à l'utilisateur de représenter ses nombres sous la forme de deux nombres décimaux codés binaires (BCD) de 4 bits regroupés dans un seul octet. Il s'agit d'une caractéristique unique de la famille MCS650X en ce sens que l'opération de l'exemple suivant peut être effectuée. L'additionneur à microprocesseur a la capacité unique d'effectuer une correction en temps réel du résultat binaire normal attendu sans aucune interférence directe de la part du programmeur. D'autres microprocesseurs populaires nécessitent une instruction séparée (Decimal Adjust) corrigeant le résultat binaire direct de l'unité arithmétique pour obtenir les mêmes résultats finaux que ceux disponibles sur ce microprocesseur directement. Afin de faire fonctionner la même unité arithmétique soit comme un additionneur binaire ou comme un additionneur décimal, l'utilisateur choisit le mode dans lequel il va fonctionner (décimal ou binaire) en définissant une autre bascule dans le microprocesseur appelée le drapeau de décimal. On initialise non seulement l'additionneur en effaçant le drapeau de retenue, mais on met également le processeur en mode décimal avec l'instruction SED. Même si cela nécessite également 1 instruction, il est possible de mettre la machine en mode décimal une fois et d'exécuter plusieurs longues chaînes de nombres décimaux sans autre intervention de l'utilisateur. La fonction «Decimal Adjust» sur les autres microprocesseurs nécessite une programmation après chaque opération binaire.
Résumé de l'ajout
En résumé, l'unité arithmétique de base est un additionneur binaire qui, sous le contrôle de la commande ADC, effectue une arithmétique binaire sur l'accumulateur et les données, en entreposant le résultat dans l'accumulateur. Selon la façon dont l'utilisateur regarde les données étant présentées à l'additionneur et les résultats en étant obtenus, l'utilisateur peut déterminer si le résultat dépasse ou non 255 binaires ou 99 décimaux; il peut effectuer de l'arithmétique de précision en utilisant le neuvième bit ou le drapeau de retenue; il peut contrôler si le microprocesseur est ou non un additionneur décimal en définissant le mode décimal; et il peut représenter ses nombres sous forme de nombres binaires signés en analysant d'autres drapeaux définis dans la machine.
SBC soustrait la mémoire de l'accumulateur avec retenue
Cette instruction soustrait la valeur de la mémoire et la retenue de la valeur de l'accumulateur, en utilisant l'arithmétique du complément à deux, et entrepose le résultat dans l'accumulateur. La retenue est défini comme le drapeau de retenue complété; par conséquent, un drapeau de retenue résultant indique que la retenue n'a pas eu lieu. La représentation symbolique de cette instruction est A - M - C → A. Cette instruction affecte l'accumulateur. Le drapeau de retenue est positionné si le résultat est supérieur ou égal à 0. Le drapeau de retenue est réinitialisé lorsque le résultat est inférieur à 0, indiquant une retenue. L'indicateur de dépassement est défini lorsque le résultat dépasse +127 ou -127, sinon il est réinitialisé. Le drapeau de négatif est mis à 1 si le résultat dans l'accumulateur a le bit 7 activé, sinon il est réinitialisé. Le drapeau de zéro (Z) est positionné si le résultat dans l'accumulateur est 0, sinon il est réinitialisé. Il s'agit d'une instruction "Groupe un". Il a des modes d'adressage immédiat; Absolu; Page zéro; Absolue X; Absolue Y; Page zéro, X; Indexé Indirect; et Indirect Indexé. Dans une machine binaire, la manière classique d'effectuer de l'arithmétique consiste à utiliser la notation du complément à deux. En utilisant la notation du complément à deux, toute opération de soustraction devient une séquence de complémentations et d'additions de bits. Cela réduit la complexité des circuits nécessaires pour effectuer une soustraction. Lorsque l'instruction SBC est utilisée dans une soustraction simple précision, il n'y aura normalement pas de retenue; par conséquent, le programmeur doit définir le drapeau de retenue, en utilisant l'instruction SEC (Set carry to 1), avant d'utiliser l'instruction SBC. Le microprocesseur ajoute le drapeau de retenue aux données de mémoire complémentées, ce qui donne une forme de complément à deux véritables de la valeur de mémoire avec son signe inversé.
Voir également
Langage de programmation - Turbo Pascal - Émulateur - Émulateur de microprocesseur 6502