CODING ★ Dr.Watson - Autoformation à l'assembleur par Micro Application ★

Dr.Watson - Autoformation à l'assembleur par Micro Application - Annexe 6

ANNEXE 6

L'ASSEMBLEUR

Cette annexe explique toutes les fonctions de l'assembleur et de l'éditeur. Il vous est recommandé de la lire et de vous y référer quand ce sera nécessaire tout au long du livre.

Les instructions d'éditeur suivantes sont affichées par le menu.

1 Insérer texte 8 Sauvegarder fichier

2 Lister ; 9 Charger fichier

3 Remplacer ligne 10 Imprimer fichier

4 Effacer texte 11 Renuméroter

5 Assembler 12 Convertir base

6 Retour au Basic 13 opération arithmétique

7 Appeler programme

Ces instructions vont être détaillées dans les pages suivantes.

1. L'option insérer

Cette instruction est utilisée pour entrer un texte dans le fichier de textes. Il est possible de spécifier à la fois le numéro de la ligne de départ et l'incrément de ligne en réponse à la question "Entrez départ et incrément". Le premier nombre sera pris pour numéro de la ligne de départ, le second pour l'incrément de ligne. Ces deux nombres doivent être séparés par un tiret "-" qui se trouve en dessous du signe "=" sur le clavier. Par exemple la séquence d'instruction suivante fera donner par l'assembleur 10 comme numéro de ligne à la première ligne de texte entrée et fixera 20 comme deuxième numéro de ligne c'est-à-dire un incrément de ligne de 10. La demande de l'éditeur sera inscrite en gras.

> I

> Entrez départ et incrément? 10-10

Notez qu'en fait vous ne verrez pas le "I" apparaître sur l'écran, on le montre ici pour signifier qu'il a été enfoncé, notez aussi que sera utilisé dans cette annexe pour indiquer qu'on appuie sur la grosse touche bleue ENTER.

Si aucun incrément de ligne n'est spécifié on prendra alors 10. Pour sortir du mode insertion on tape le caractère en premier caractère de ligne. Cela fera revenir l'éditeur en mode commande indiqué par ">". Par exemple, si la dernière ligne de votre programme était RET à la ligne 120, alors " " serait entré comme premier caractère à la ligne 130.

L'écran afficherait:

120 RET

130 @

Taper M pour le menu

>

2. L'option lister

Cette instruction permet de lister sur l'écran tout ou partie d'un programme. Quand on la sélectionne la demande "Entrez le numéro de ligne de départ" apparaît. Pour lister tout le programme, appuyer seulement sur la touche ENTER. Une fois que le programme listé a complètement rempli l'écran, la -procédure de listage s'arrête tant qu'aucune autre touche n'est appuyée. 'Si vous avez besoin de commencer le listing à un numéro de ligne précis entrez ce numéro de ligne en réponse à la demande "Entrez le numéro de ligne". Vous pouvez arrêter le listing à n'importe quel moment en appuyant sur la barre espace; appuyer sur n'importe quelle touche permettra au listing de continuer. De même, pendant le listage, appuyer sur la touche "M" mettra fin au listing et imprimera le menu sur l'écran.

3. L'option remplacer

Cette option est utilisée pour remplacer une liane existante par une autre, Supposons que le programme suivant soit dans le fichier de texte:

10 LD A,65

20 IN C A

30 CALL &BB5A

40 RET

La ligne 20 doit être INC A, et sera changée par les instructions suivantes.

> R

> Entrez le numéro de ligne 20

> 20 INC A

Notez qu'il n'est pas possible de remplacer plus d'une ligne à la fois. Si vous avez besoin de remplacer une série de lignes utilisez l'option insérer pour insérer le nouveau texte.

4. L'option effacer

Cette instruction permet d'effacer une seule ligne ou un bloc entier de texte du fichier de texte. La syntaxe pour cette instruction est exactement la même que pour l'instruction insérer.

Par exemple:

> D

> Entrer numéro de ligne 20

Effacera la ligne 20 alors que:

> D

> Entrer numéro de ligne 20-200

Effacera les lignes 20 à 200 incluse.

Pour effacer un programme entier choisissez des numéros de ligne à l'extérieur de l'intervalle utilisé. Par exemple, supposons qu'un programme utilise l'intervalle de numéros de ligne 10 à 320. La séquence d'instructions suivante efface entièrement le programme de la mémoire.

> D

> Entrer numéros de ligne 1-400

5. L'option assembler

Après avoir entré un programme dans le fichier de texte il est nécessaire d'assembler ce code source en code machine. On l'accomplit avec l'option assembler.

Quand l'option assembler a été sélectionnée, (en tapant A en mode commande), un menu apparaîtra comme ci-dessous:

1. Pas de listing

2. Listing sur écran.

3. Listing sur imprimante.

4. A la fois sur écran et imprimante

1. Pas de listing

Cette option ne fera générer aucun listing et conduira donc à l'assemblage le Plus rapide. De toutes façons toutes les erreurs seront signalées.

2. Listing sur écran.

Cette option fera sortir le listing d'assemblage de l'écran.

3. Listing sur imprimante.

C'est exactement la même que l'option 2 à la différence que la sortie est dirigée sur l'imprimante.

4. A la fois sur écran et sur imprimante.

La sortie de l'assemblage est dirigée à la fois sur l'écran et sur l'imprimante.

Si pendant l'assemblage l'assembleur rencontre une erreur quelle Qu'elle soit il sautera à l'éditeur après vous avoir signalé l'erreur.

6. L'option Retour au Basic

Cette instruction sort du programme d'assembleur et retourne au BASIC après avoir effacé l'écran avec une instruction MODE 1. L'Assembleur et l'Editeur sont écrits dans un mélange de BASIC et de code machine. Le petit programme de commande, en BASIC, utilise les numéros de ligne 64000 et au dessus. Dès lors, du moment que les numéros de lignes sont maintenus en dessous de 64000 il est possible d'avoir un petit programme BASIC résident en mémoire, en même temps que l'assembleur. C'est très utile pour tester les algorithmes avant de les essayer en code machine. La taille maximum du programme BASIC additionnel est d'à peu près 4K. Pour entrer à nouveau l'assembleur, en sauvegardant n'importe quel programme figurant dans le fichier, appuyez sur la touche point décimal sur le bloc de touches numériques ou tapez à partir du BASIC "GOTO 64026". Si vous n'avez pas besoin de garder le contenu du fichier de texte, c'est a dire si vous voulez effacer n'importe quel programme de langage assembleur en mémoire, tapez à partir du BASIC "GOTO 64018".

7. L'option appeler programme

Cette option Permet aux programmes en code machine de fonctionner ou d'être appelés à partir de l'assembleur. Pour faire fonctionner un programme en code machine, on appelle la case mémoire contenant la première instruction dans le programme. Remarque: cette option fonctionnera seulement si le programme utilise la directive d'assembleur ENT pour première ligne; n'essayez pas de l'utiliser si votre programme utilise la directive d'assembleur ORG, l'ordinateur pourrait se comporter bizarrement c'est à dire: se "planter".

Dès lors, si ENT a été utilisée, appuyer sur C en mode commande effacera l'écran et sautera ensuite au programme en code machine.

Pour exécuter un programme qui utilise la directive ORG il est nécessaire d'appeler le début du programme à partir du BASIC. Donc supposons que l'instruction ORG dans le programme se présente comme suit:

10 ORG 30000

Cela amènera l'assembleur a stocker le premier octet du code machine en case mémoire 30000. Maintenant tapez ce oui suit:

CALL 30000

Cela lancera le programme en langage machine commençant en case mémoire 30000. Assurez vous cependant qu'il n'y a pas d'erreur dans le programme en code machine cela pourrait "planter" l'ordinateur.

Comme on l'a vu précédemment il est possible de sauvegarder une copie du code machine généré par l'assembleur (un fichier code obi et), ce type de fichier doit être chargé dans l'ordinateur à partir du BASIC. L'instruction de chargement est exactement la même que celle utilisée pour charger un programme BASIC a la différence qu'on doit dire à l'ordinateur où il doit localiser le fichier en code machine. Cette information, l'adresse de chargement, est donnée après le nom du fichier, séparée d'une virgule.

Par exemple pour charger en mémoire le code objet créé par le programme TEST et sauvegardé sous le nom de fichier TEST-b, à partir de la case mémoire 30000, l'instruction suivante sera entrée a partir du BASIC

LOAD "TEST",30000

Ensuite pour exécuter le programme

CALL 30000

sera utilisé.

Les instructions cassette (S et F)

En utilisant ces instructions, des fichiers de texte peuvent être sauvegardés sur une cassette ou chargés à partir d'une cassette sous une forme convenant à l'assembleur. Il est aussi possible de sauvegarder le code machine (code objet). produit quand un fichier est assemblé. C'est très utile car cela permet de développer et d'exécuter un programme en code machine indépendamment de l'assembleur.

8. L'option sauvegarder

Cette option est utilisée soit pour sauvegarder une copie du fichier de texte sur cassette soit pour sauvegarder une copie du code objet.

Sauvegarder le fichier de texte

Comme pour les programmes BASIC, un nom est attribué aux fichiers oui peut consister en n'Importent Quels caractères alphanumériques. Quand l'option sauvegarder est sélectionnée on vous demande d'entrer le nom de fichier que vous désirez utiliser en réponse à la Question "Entrez le nom de fichier". Donc pour sauvegarder le contenu du fichier de texte sous le nom de fichier TEST on utilisera les instructions suivantes

> S

> Entrer le nom de fichier? TEST

Le message familier: "Appuyer sur REC et PLAY et ensuite sur n'importe quelle touche:" apparaîtra. A ce moment là vous devrez procéder comme en BASIC: introduire une cassette vierge, appuyer sur PLAY et REC et ensuite sur n'importe Quelle touche. Quand le fichier a été sauvegardé le message de mode commande ">" apparaîtra à nouveau.

Sauvegarder le code objet

Il est aussi possible de sauvegarder une copie du code objet généré par le dernier assemblage d'un fichier de texte. Le code objet est le code machine produit par l'assembleur. Dès lors un programme en langage assembleur peut être développé en utilisant l'assembleur et ensuite le code machine résultant peut être sauvegardé sur cassette pour l'utiliser plus tard. (Remarque: vous trouverez plus de détails sur comment exécuter ce fichier code objet dans la section détaillant l'option "Appeler programme")

Pour sauvegarder un code objet il est nécessaire d'ajouter une marque de type de fichier au nom du fichier. Cette marque est un "b" séparé du fichier par un tiret. Avant que le code objet puisse être sauvegardé, on doit assembler le programme constitué par le fichier de texte. Dès lors pour sauvegarder le code objet créé par le fichier imaginaire TEST on utilisera le nom de fichier suivant:

> s

> Entrer le nom du fichier? TEST-b

9. L'option charger

Cette option est utilisée pour charger un fichier de texte a partir de la cassette. Remarque: il ne peut être utilisé pour recharger une copie du code objet créée par l'assembleur et sauvegardée avec l'identifieur "-b". Voir l'option "Appeler programme" pour cela. Vous êtes guidé par le message "Entrer nom de fichier". Si vous ne pouvez pas vous souvenir sous quel nom de fichier le programme a été sauvegardé appuyez seulement sur ENTER en réponse au message et le premier fichier compatible trouvé sur la cassette sera chargé. Par exemple on utilisera ce oui suit pour charger le fichier test

> F

> Entrer le nom du fichier? TEST

Appuyer sur PLAY puis n'importe Quelle touche:

10. L'option imprimer

Cette option permet au programme figurant dans le fichier de texte d'être sorti sur l'imprimante. La syntaxe pour cette instruction est exactement la même que pour l'instruction lister, a la différence qu'on entre P a la place de L.

11. L'option renuméroter

Cette instruction renumérote toutes les lignes stockées dans le fichier de texte. Quand elle est sélectionnée, le message "Entrer le nouvel incrément de ligne" apparaît; le numéro entré a ce moment là sera utilisé comme numéro de ligne de départ et comme incrément de ligne. Donc pour renuméroter un fichier de texte avec un incrément de ligne de 10 en commençant par le numéro de ligne 10, on utilisera la séquence d'instruction suivante:

> N

> Entrer le nouvel incrément de ligne 10

12. L'option convertir base

Quand on écrit des programmes en langage assembleur il est parfois utile de pouvoir convertir un nombre d'une base à une autre. L'Option Convertir Base permet cela, elle acceptera n'importe quel nombre dans l'intervalle 0-65535. Le nombre à convertir peut être représenté dans l'une des trois bases suivantes:

1. Décimale.

2. Hexadécimale.

3. Binaire.

Pour les distinguer, on utilise les préfixes BASIC standards:

Base ;Préfixe

Décimale ;Pas de préfixe

Hexadécimale &

Binaire &X

Le nombre entré est converti dans toutes ces bases. Donc pour exprimer 275 en décimal, hexa et binaire, on utilisera la séquence d'instruction suivante:

> B

Entrer nombre à convertir? 275

L'écran affichera alors le nombre 275 dans les trois bases. Pour effacer l'écran, appuyez encore sur B. Notez que la partie inférieure de l'écran ne sera pas affectée par toutes les instructions, en dehors de B et 0 qui l'effaceront.

13. l'option opération arithmétique

Cette option permet à deux nombres, dans n'importe laquelle des trois bases, d'être soit ajoutés ou soustraits l'un à l'autre. Par exemple ajoutez 200 à &FF.

> 0

Premier nombre? 200

Deuxième nombre? &FF

A. Add S. Soustr.? A

La partie inférieure de l'écran s'efface maintenant et affiche ce oui suit:

Binaire = &X11100011

Décimal = 445

Hexadécimal = &1C7

Comme pour l'option Convertir Base, cet affichage restera Jusqu'à ce qu'on appuie à nouveau sur 0 ou B.

Directives d'Assembleur

En plus de toutes les instructions du Z80, l'assembleur acceptera certaines directives d'assembleur. Une directive d'assembleur est une instruction à l'assembleur au lieu d'être une instruction au Z80 (pour cette raison on les appelle quelques fois pseudo-instructions).

Les directives d'assembleur augmentent considérablement la lisibilité et la facilité d'écriture des programmes.

La première directive devrait être familière:

ENT Place le code objet immédiatement après le code source, dans une

;forme permettant l'exécution du programme par l'option Appeler

;Programme de l'assembleur.

Quand on écrit des programmes qui nécessitent un stockage de données supérieur à ce qui est possible à partir des registres ou facilement à partir du stack, il est nécessaire d'utiliser des cases mémoire pour stocker ces données. Comme on ne connaît pas la longueur exacte du programme il n'est pas facile de calculer l'adresse de la case mémoire située a la fin du programme. La solution du problème est d'utiliser la directive d'assembleur suivante:

DEFS n Réserve n octets de mémoire en commençant par la valeur actuelle du

compteur d'adresse.

Pour permettre une référence facile à cette zone de mémoire on affecte un label (= étiquette) a cette directive. Par exemple pour envoyer un buffer de quatre octets référencé par le label STORE: on utilisera la ligne suivante

STORE: DEFS 4

Quand l'assembleur rencontrera cette instruction il réservera quatre octets de mémoire et affectera au label "STORE:" l'adresse du premier octet de ce buffer.

Par exemple:

Supposons qu'un programme de multiplication de 8 bits par 8 produise un résultat de 16 bits en HL; si on a besoin de ce résultat plus loin dans le programme il devra être conservé.

En utilisant le programme suivant on peut obtenir ce résultat en définissant le label STORE:

ENT

STORE: DEFS 2

.

.

.

Programme de multiplication

.

.

LD (STORE),HL

.

.

Dès lors le contenu de la case mémoire adressée par STORE contient le résultat de la multiplication. En plus de la création de buffer, les directives d'assembleur peuvent être utilisées pour beaucoup d'autres fonctions. La première à être considérée est l'attribution de valeurs numériques aux labels ou étiquettes.

EQU nn Affecte la valeur nn au label précédent.

Cette forme de directive est principalement utilisée pour définir des constantes.

Par exemple:

LOOP: EQU 20

LD A,LOOP:

Une fois assemblé et exécuté, ceci chargera 20 dans A.

Jusqu'ici la plupart des programmes ont utilisé la directive ENT. C'est parfait pour développer et tester des fonctions mais quand un programme en code machine doit être appelé à partir du BASIC il doit être stocké là où le BASIC ne peut pas le recouvrir. La quantité de mémoire disponible pour le BASIC est fixée par l'instruction BASIC MEMORY. En mettant MEMORY sur 39999 aucune case mémoire au dessus de 39999 ne peut être utilisée pour le stockage d'un programme BASIC: en effet, la mémoire a été réservée pour les programmes en code machine.

Au lieu de laisser l'assembleur décider où loger le programme, il faut qu'on le lui dise. On utilise la directive suivante pour accomplir ceci:

ORG nn Met le compteur d'adresse sur nn

Cette propriété de l'assembleur permet aux programmes d'être assemblés pour résider n'importe où en case mémoire. Remarque: la valeur nn doit "être supérieure à la dernière case mémoire utilisée par l'éditeur. Si vous tapez une case erronée l'assembleur vous le signalera.

Beaucoup de programmes ont besoin de cases mémoires spécifiques pour y stocker des données. Il y a trois directives pour accomplir ceci; les deux premières chargent des données numériques et se présentent comme suit:

DEFB n Stocke n à la valeur actuelle du compteur d'adresse.

DEFW nn Stocke l'octet faible du mot de deux octets nn à la valeur actuelle du compteur d'adresse et l'octet fort à la valeur actuelle du compteur d'adresse + 1.

La dernière directive stocke la représentation ASCII d'une chaîne en mémoire. C'est très utile pour imprimer des messages sur l'écran.

DFFM "s" Définit le contenu de la mémoire, en commençant par la valeur actuelle du compteur d'adresse/ comme la représentation en ASCII de la chaîne "s".

Essayez le programme suivant;

ENT

MESS: DEF "A MESSAGE !"

LD B,11

LD HLMESS:

LOOP: LD A,(HL)

CALL &BB5A

INC HL

DJNZ LOOP:

RET

Utile non?!

Addition d'opérandes 8 chargement direct de caractères ASCII

Si jusqu'à maintenant vous avez travaillé sur le livre et si vous avez lu le chapitre 10, vous avez peut être été frappé que dans le chapitre 10 880 était, ajouté à un caractère ASCII entre guillemets dans une instruction DEFB. L'effet de cette ligne est de charger en mémoire, à la valeur actuelle du compteur d'adresse, la valeur ASCII du caractère entre guillemets une fois qu'on lui a ajouté 880. L'effet d'ajouter 880 à un nombre binaire est de mettre le bit 7.

Dès lors pour charger une représentation ASCII de A dans l'accumulateur il est possible d'utiliser la ligne suivante:

LD A,"A"

qui chargera 65 dans A. De même, pour charger "B" dans A vous pouvez utiliser:

LD A,"A"+1

Ces fonctions sont parfois très utiles, surtout pour définir des tableaux de données.

Commentaires

L'assembleur permettra d'inclure des lignes de commentaires dans le fichier de texte si le premier caractère de cette ligne est un point-virgule. Un programme d'exemple contenant des commentaires apparaîtra donc comme ci-dessous:

10 ENT

20 ; Charger 65 dans A

30 LD A,65

40 ; Imprimer A sur l'écran

50 CALL &BB5A

60 RET

Notez que les commentaires doivent être sur des lignes séparées des instructions; on ne peut pas combiner les deux sur une ligne.

★ ANNÉES: 1985
★ AUTEUR: T. Hebertson
★ CONVERTION: CRACKERS VELUS

Page précédente : Dr.Watson - Autoformation à l'assembleur par Micro Application - Annexe 5
 
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 255 millisecondes et consultée 1326 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.