CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

9/2.2 - L'assembleurCoding Classeurs Weka
9/2.2 - L'assembleur

Qu'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é :

  • d'un programme de traitement de textes pour saisir le programme (un programme écrit en codes mnémoniques sera appelé programme source par la suite).
  • du compilateur lui-même qui fait la conversion : texte
  • code exécutable.

Nous allons étudier ici un Assembleur complet qui possède :

  • – un programme de saisie de texte en mode ligne,
  • – un compilateur mono-passe sans gestion d'étiquettes.

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 cha­pitre 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 perfor­mant, 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 Cha­pitre 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 pro­gramme de saisie ultra-simple qui comprend les fonctions élémentaires suivantes :

  • Saisie de texte, ligne par ligne,
  • Affichage sur écran d'une partie bu de la totalité du texte saisi,
  • Impression du texte entré sur une imprimante,
  • Suppression d'une ligne de texte,
  • Insertion d'une ligne de texte.

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 com­pilateur.
Chaque ligne est précédée d'un numéro de ligne et sera repérée grâce à ce numéro :

  • si elle doit être effacée,
  • si l'on doit insérer une ligne avant ou après,
  • pour sortir des listings sur imprimante, etc.

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 »
« Etes-vous sur (O/N) »

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.
Quand cette option est sélectionnée, le message suivant apparaît à l'écran :

de – entrez le premier numéro de ligne,
a – entrez le dernier 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épon­dant aux questions suivantes :

Impression a partir de – entrez le premier numéro de ligne
jusqu'à ; – entrez le dernier 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 don­nez 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,
Lignes 3190 à 3280 : Liste sur écran,
Lignes 3290 à 3450 : Suppression d'une ligne,
Lignes 3460 à 3640 : Insertion d'une ligne de programme,
Lignes 3650 à 3810 : Edition du programme sur l'écran,
Lignes 3820 à 3920 : Impression du programme entré sur une

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 :

  • le langage d'assemblage composé de codes-opératoires,
  • le compilateur qui transforme les codes opératoires en binaire.

Pour éviter toute confusion, nous emploierons les termes suivants :
Assembleur : Compilateur qui transforme les codes opératoires en langage exécutable par te microprocesseur.

Langage d'assemblage : Langage composé de codes opératoires. Ce lan­gage 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 microproces­seur 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 consis­tera à 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 lors­que 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.
Le problème est simple quand il s'agit d'un langage pauvre comme l'Assembleur. Mais il se complique très vite lorsque l'on désire créer un compilateur de langage évolué. Un tel compilateur sera étudié ultérieu­rement.

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,
2) Les sorties,
3) Le traitement à appliquer aux entrées pour les transformer en sorties désiré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.),
– une opérande (par exemple, IX, HL ou L ou encore (BC), A).

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émoi­res 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,
– l'opérande que nous appellerons « 2e 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
EX, il existe cinq 2er Op-code qui sont :

(SP),HL
(SP),IX
(SP),IY
AF,AF'
DE.HL

pour former les instructions complètes :

EX (SP),HL
EX (SP), IX
EX (SP),IY
EX AF,AF'
EX DE,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 mani­pulations. 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 cha­que 1" Op-code.

C'est (a démarche qui a été employée pour définir les entités manipu­lé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.
Lignes 8000 à 8030 : Nombre de 2e Op-code pour chaque 1er Op-code.
Lignes 9000 à 9390 : Seconds Op-codes.

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 plu­sieurs codes à générer. Ayant défini l'ensemble des 2B Op-code pour cha­que 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),
– les codes générés suivent cette première donnée.

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 com­pilation.

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 :

  • soit le code d'implantation en mémoire « ORG »,
  • soit un des 67 Op-codes du Z80.

Le code ORG (Origine) définit l'adresse à laquelle sera implanté le pro­gramme en mémoire RAM pour y être exécuté. Ce code est une direc­tive 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.
Si le premier Op-code n'est ni « ORG » ni un des Op-codes du Z80, une
erreur est générée :

« 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 incor­poré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 :

  • Le premier permet de sauvegarder un programme source (le listing en langage d'assemblage) ou un programme objet (le code généré qui pourra être exécuté par la suite). Ce sous-programme occupe les lignes 6000 à 6210.
  • Le second permet de charger en mémoire un programme source qui a été sauvegardé par le premier sous-programme. Il occupe les lignes 5000 à 5110.

Les diverses parties du listing sont les suivantes :










Lignes 10 à 30 : Programme principal
Lignes 1000 à 1220 : Lecture des données et mémorisation
Ligne 1050 : 1e Op-code
Ligne 1080 : Nombre de 2e Op-code
Ligne 1120 : 2e Op-code Ligne 1200 : Code généré
Lignes 2000 à 2140 : Menu général
Lignes 3000 à 3920 : Editeur de lignes
Lignes 3000 à 3180 : Menu
Lignes 3190 à 3280 : Liste sur écran
Lignes 3290 à 3450 : Suppression ligne
Lignes 3460 à 3640 : Insertion ligne
Lignes 3650 à 3810 : Edition à l'écran
Lignes 3820 à 3920 : Impression
Lignes 4000 à 4510 : Compilation du source
Lignes 4120 à 4230 : Messages d'erreur
Lignes 4310 à 4510 : Extraction des données numériques.
Lignes 5000 à 5110 : Chargement en mémoire d'un programme source
lignes 6000 à 6210 : Sauvegarde sur disquette d'un programme source ou objet
Lignes 7000 à 10320 : Données
Lignes 7000 à 7040 : 1er Op-code
Lignes 8000 à 8030 : Nombre de 2* Op-code
Lignes 9000 à 9390 : 2e Op-code
Ugnes 10000 à 10320 : Code généré

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.

Page précédente : 9/2.1 - Le désassembleur
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 764 millisecondes et consultée 2380 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.