★ CODING ★ CLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★ |
9/2.2 - L'assembleur | Coding Classeurs Weka |
9/2.2 - L'assembleurQu'est-ca qu'un assembleur ? C'est un programme qui transforme des codes mnémoniques en codes hexadécimaux exécutables par l'ordinateur. Un Assembleur classique est composé :
Nous allons étudier ici un Assembleur complet qui possède :
Cette étude précède une autre, beaucoup plus vaste, qui sera faite par la suite et qui consistera à créer un compilateur de langage évolué du genre BASIC ou PASCAL. I. Progamme de saisie de texte Vous qui utilisez l'Assembleur couramment (sinon, reportez-vous au chapitre 2 de la partie 4) n'êtes pas sans savoir que ce langage peut rendre de grands services. Le BASIC qui fonctionne sur les CPC est très performant, et, combiné avec quelques routines écrites en Assembleur (quand il y a un problème de vitesse d'exécution), vous arriverez sans mal à traiter la plupart des problèmes qui pourront se présenter. Pour ne pas avoir à manipuler des codes en hexadécimal, un langage de plus haut niveau a été créé. Il s'agit du langage d'assemblage. Ce langage est formé de mots-clés longs de deux à quatre lettres, qui sont à rapprocher des mots équivalents en Anglais. Reportez-vous en au Chapitre 2.3 Partie 4 pour avoir la liste de ces mots-clés. Pour qu'un programme tapé dans ce langage soit exécutable, il faudra le convertir en codes machines. C'est le rôle du compilateur Assembleur. Mais il faudra aussi le saisir. Pour cela, nous allons développer un programme de saisie ultra-simple qui comprend les fonctions élémentaires suivantes :
1°) Saisie de texte Nous allons stocker les lignes entrées dans le tableau A$. Il est dimen-sionné à 200 lignes (Ligne 1030 dans le programme). Si cela ne vous convient pas, vous pouvez augmenter cette dimension dans les limites de la place mémoire RAM disponible. H vous faudra également modifier de la même manière le tableau GC$ qui est dimensionné sur la même ligne. Le tableau GC$ contient le code hexadécimal généré par le compilateur.
Cet éditeur de ligne vous offre la possibilité d'utiliser la touche DEL pour corriger une éventuelle erreur de saisie sur la ligne courante. Si la ligne sur laquelle vous voulez écrire n'est pas vierge, le message « Ligne occupée » apparaîtra à l'écran. Si vous répondez 0, la ligne qui portait le même numéro que la ligne courante sera remplacée par la ligne courante. 2°) Affichage sur l'écran du texte saisi Vous pourrez lister sur l'écran une ou plusieurs lignes, en donnant les numéros de première et dernière ligne à lister. de – entrez le premier numéro de ligne, 3°) Impression du texte entré sur une imprimante Cette option est comparable à la précédente, à ceci près que le texte sera imprimé et non pas affiché sur l'écran. Il vous faut donner les premier et dernier numéro de ligne à lister en répondant aux questions suivantes : Impression a partir de – entrez le premier numéro de ligne 4°) Suppression d'une ligne de texte La ligne à supprimer est repérée par son numéro de ligne. Vous devez indiquer ce numéro après le message : Ligne a supprimer – entrez le numéro de ligne à supprimer La ligne concernée est alors affichée à l'écran, précédée de son numéro de ligne. La question « Etes-vous sur (O/N) » vous permet d'éviter de supprimer une ligne par erreur : Si vous avez sélectionné une mauvaise ligne, répondez N, et la ligne ne sera pas effacée. 5°) Insertion d'une ligne de texte Une ligne peut être insérée n'importe où entre le premier numéro de ligne et le dernier numéro de ligne. Sélectionnez l'option correspondante dans le menu (option 3), puis donnez te numéro de la ligne après laquelle il faudra insérer la ligne que vous allez saisir. Pour cela, répondez à la question suivante : Insertion après la ligne – en donnant le numéro de la ligne après lequel doit se faire l'insertion Le programme de saisie de texte est inséré dans un programme complet d'édition/compilation/sauvegarde, Il est accessible à partir d'un menu général (souvent appelé SHELL dans la littérature informatique), et occupe les lignes 3000 à 3920 dans le listing général : Lignes 3000 à 3180 : Menu de l'éditeur de lignes, imprimante. II. Compilateur A. DEFINITION Un abus de langage est souvent fait par les informaticiens pressés. Pour eux, le terme « Assembleur » désigne aussi bien :
Pour éviter toute confusion, nous emploierons les termes suivants : Langage d'assemblage : Langage composé de codes opératoires. Ce langage a été créé pour faciliter la programmation (il est, en effet, plus facile de manipuler des mots-clés que des nombres, même s'ils sont exprimés en hexadécimal !). Avant de détailler le fonctionnement de l'Assembleur que nous allons développer, il convient de rappeler quelques notions fondamentales à propos des compilateurs. B. RAPPELS Comme nous l'ayons vu au Chapitre 2.1, un compilateur est un programme qui permet de transformer les mots-clés d'un langage en codes exécutables par le microprocesseur, donc en binaire. Le microprocesseur utilisé dans les CPC est un Z80 qui manipule des données de 8 bits. Pour plus de commodité, nous dirons que le travail du compilateur consistera à traduire des mots-clés en données hexadécimales codées sur 8 bits. Nous venons de soulever un des problèmes majeurs qui apparaît lorsque l'on s'attaque à l'écriture d'un compilateur, à savoir l'analyse des phrases entrées. Cette recherche de mots-clés dans les phrases entrées est souvent appelée analyse syntaxique. ANALYSE DES FONCTIONS D'UN COMPILATEUR DE LANGAGE D'ASSEMBLAGE Cette analyse va être faite de ta manière suivante. Nous allons considérer que le compilateur est une boîte noire dans laquelle arrivent des informations (entrées), de laquelle sortent des informations (sorties). Nous allons étudier successivement : 1 ) Les entrées, 1 - ENTREES Si nous analysons le langage d'assemblage, nous voyons qu'un mot-clé se décompose en deux parties : – une instruction (par exemple, ADD, LD, XOR, etc.), L'instruction permet de définir le type d'opération qui va être faite. Alors que l'opérande définit te ou les registres, l'adresse de la ou des mémoires qui vont participer à cette opération. L'analyse syntaxique portera donc sur deux entités : – l'instruction que nous appellerons « 1er Op-code » par la suite, A chaque 1er Op-code peut correspondre 1 ou plusieurs 2e Op-code. Par exemple, pour le 1er Op-code (SP),HL pour former les instructions complètes : EX (SP),HL Par contre, le 1er Op-code CPD ne possède qu'un deuxième Op-code de longueur nulle : En effet, l'instruction CPD se suffit à elle-même, et il n'est pas nécessaire d'indiquer sur quel(s) registre(s) ont porté les manipulations. Dans ce cas, on parle d'adressage implicite (Voir Chapitre 2.2 Partie 4, Les modes d'adressage). Il apparaît donc le besoin de donner le nombre de 2e Op-code pour chaque 1" Op-code. C'est (a démarche qui a été employée pour définir les entités manipulées par le compilateur. Sur le listing BASIC, vous pourrez remarquer le codage de ces trois types de données : Lignes 7000 à 7040 : Premier Op-code. Les données manipulées par le compilateur sont maintenant définies. Reste à décrire l'ensemble des codes qui pourront être générés par le compilateur. 2 - SORTIES A chaque couple (1er Op-code, 2" Op-code) correspond (ent) un ou plusieurs codes à générer. Ayant défini l'ensemble des 2B Op-code pour chaque 19r Op-code, il suffit d'associer le(s) code(s) à générer à chaque 2* Op-code pour passer en revue tous les codes possibles. Les codes générés occupent les lignes 10000 à 10320 du listing général. Ils sont définis de la manière suivante : – un premier nombre donne le nombre de code(s) généré(s), Remarque : Un « XX » dans un code généré indique que ce code sera contenu de manière implicite dans la phrase à compiler, et sera remplacé à la compilation. 3 - TRAITEMENTS Les entrées ( 1er Op-code, 2e Op-code) et les sorties (Codes générés) sont maintenant définis. Il reste à décrire le traitement à appliquer aux entrées pour les transformer en les sorties désirées. * 1er opération Il est nécessaire d'identifier le 1W Op-code dans chaque phrase. Ce 1Br Op-code pourra être :
Le code ORG (Origine) définit l'adresse à laquelle sera implanté le programme en mémoire RAM pour y être exécuté. Ce code est une directive d'assemblage : il ne génère aucun code exécutable, mais sert simplement au compilateur à implanter le code généré à la bonne place en mémoire. La détection du code « ORG » est faite ligne 4080. La détection d'un des Op-code du 280 est faite entre les lignes 4090 et 4140. « Erreur ligne XXXX : Op-code inconnu » * 2e opération Le premier Op-code identifié, il faut voir si l'association 1er Op-code/2e Op-code est correcte. Pour cela, nous calculons le déplacement à effectuer dans la liste des 2e Op-codes pour se situer sur le premier couple (1er Op-code/2e Op-code) validé. Ce calcul est fait entre les lignes 4160 et 4180. Certains 2e Op-codes contiennent une valeur numérique qui sera incorporée dans le code généré. Ces codes sont identifiés dans un sous-programme qui est appelé en ligne 4190. Le sous-programme d'identification consiste à extraire la ou les donnée(s) numéhque(s) présent(es) dans le 2e Op-code et à la (les) stocker dans une (des) variable(s). * 3e opération Enfin, le code est généré entre les lignes 4200 et 4260. Il est affiché sur l'écran ou envoyé vers l'imprimante en ligne 4260. Pour repasser au menu général, appuyez sur une touche (ligne 4280). III. Entrées / Sorties sur disquette Pour clore ce programme de compilation, deux sous-programmes ont été développés :
Les diverses parties du listing sont les suivantes :
Lignes 10 à 30 : Programme principal Par la suite, nous verrons comment exécuter un programme en Assembleur issu du compilateur que nous venons d'étudier. Ce programme pourra être implanté en mémoire ou dans un programme BASIC. Nous verrons également comment créer un "DEBUGGER". Ce programme facilitera ta mise au point de vos programmes écrits en Assembleur.
|