LES AS SANS PEUR

(ET SANS REPROCHES)

Nous sommes déçus car nous n’avons pas eu beaucoup d’échos à la suite de l’introduction à l’assembleur du mois dernier. Ne pouvez-vous pas écrire au journal pour le secouer un peu ? Et toi, tu ne peux pas te remuer quelque part pour trouver des questions à poser ? Allez, au boulot les aminches. Trimez et vous verrez que c’est en trimant que l’on devient trimeur (qui dit que cela ne veut rien dire ?).

80 : RAPPEL

Si cet intertitre est écrit ainsi, c’est parce qu’en ce moment je passe mon permis moto mais c’est un autre problème, Revenons donc au principal sujet d’intérêt de cette rubrique. Je tenais à rappeler, donc, qu’il ne fallait pas confondre langage machine et assembleur, qui sont deux choses tout à fait différentes. Le premier, le langage machine. est en fait constitué par une suite de valeurs comprises entre zéro et deux cent cinquante-cinq, que le microprocesseur comprend et exécute comme des ordres simples. 11 faudrait posséder la mémoire de plusieurs troupeaux d’éléphants pour se rappeler la signification et l’effet de chaque code effectivement compris par le calculateur. C’est pour cela qu’un beau jour un personnage, sûrement louche, a décidé que l’ordinateur ferait l’homme. Et que. par ce fait, l’humain n’aurait plus qu’à se souvenir de mots-clés (représentant les opérations primaires) et de lettres (pour dénommer les principaux registres).

Cette forme d’écriture ne s’appelle donc plus le langage machine mais l’assembleur. L’homme ne fait plus d’efforts de traduction pour venir au niveau de la machine et c’est l’ordinateur lui-même qui transforme les mnémoniques (mots facilement mémorisâmes) en codes machines (interprétables par le microprocesseur). Il est ainsi plus facile à l’homme de retenir, par exemple :

LD  A, 12
RET

Plutôt que :

62   12
201

Mais sur le CPC il n’y a pas d’assembleur intégré en ROM. tel que le Basic, et de ce fait, vous êtes contraint de passer par un programme appelé assembleur, qui est en fait pour me répéter, un traducteur de mnémoniques en codes machines. Il en existe de divers types, mais si vous choisissez d’acheter un tel outil, essayez, de préférence, de prendre un kit complet, muni d’un éditeur-assembleur et d’un moniteur. Le moniteur est un petit programme qui permet de lire le contenu de la mémoire de différentes manières (sous forme de valeurs, de mnémoniques, ou encore d’ ASCII ).

PASSONS AUX ACTES

Pour comprendre et utiliser ce qui va suivre, il faut absolument posséder un assembleur car, maintenant, nous sommes grands et capables de nous servir de notre outil (dont nous possédons la documentation puisque nous ne sommes pas de vilains pirates). Trêve de plaisanteries.

Nous allons étudier maintenant les différentes mnémoniques utilisées par l’assembleur du Z80. ( Il faut bien se dire que pour chaque microprocesseur différent existent des langages assembleurs différents itou, et il est de plus certain que ces langages sont les moins portables de tous). Nous allons étudier ensemble les plus simples mnémoniques de base de ce subtil charabia.

PAGE 1

ORGANISE

Annie aime les sucettes,
Les sucettes à l’anis.
Les sucettes à l’anis d »Annie
Donnent à ses baisers
Un goût anisé.

Ne connaissez-vous pas cette petite chansonnette de France Gall ? Faut dire qu’elle n’est pas jeune (la chanson) mais tout de même, elle vaut la peine d’être connue (la chanson). Tout ceci n’es! en fait là que pour introduire le mot-clé ORG qui est, bien entendu, la forme abrégée du mot organisation. Ce code, suivi d’une adresse, signifie que tout ce qui le suit doit être logé à l’adresse précisée en paramètre- Simple, non ? Ah. pardon, j’allais oublier de préciser que pour dire hexadécimal en assembleur, ce n’est pas le « et » commercial (&) qui est utilisé mais le dièze (#). Patron, exemple S.V.P. :

ORG       #9000        ;  adresse de départ
DEBUT LD A,7       ;  7 dans l’accumulateur 
              JP #BB5A  ; Vas   écrire

Voilà un programme qui sera implanté à l’adresse &9000. L’intérêt de cette routine est nul car elle ne fait que l’équivalent d’un PRINT CHR$(7) Basic. 11 faut aussi savoir que ORG est totalement transparent en mémoire et qu’il n’engendrera donc aucun code machine après assemblage. En bref. ORG précise simplement à l’assembleur où mettre les codes machines exécutables. J’en profite pour glisser dans le monologue qu’un programme écrit en tangage machine ne sera relogeable que si vous vous y efforcez (c’est parfois assez compliqué). C’est pour cela que l’on ordonne à l’assembleur d’écrire le programme exactement à l’endroit où l’on veut qu’il soit en mémoire.

Tiens, vous avez aussi remarqué ? J’en vois, au fond de la classe, qui commencent à se poser des questions. Ce que je veux dire, c’est simplement que ce genre de langage ne se dispose pas en lignes mais en colonnes, comme dans l’exemple ci-dessus. La première de ces colonnes doit contenir, si elle n’est pas vide, une étiquette, la deuxième colonne sera occupée par une mnémonique, la troisième contiendra les registres et/ou les opérandes nécessaires au bon fonctionnement de l’instruction traitée : la dernière colonne sera utilisée pour les remarques. La plupart des assembleurs, Z80 et autres, utilisent ce genre de format : s’il n’est pas respecté, vous pouvez vous attendre à des messages d’erreur.

TOUT EST RELATIF, COMME DISAIT FRANCK

Nous avons parié, dans le paragraphe précédent, de la notion d’étiquette. Une étiquette est en fait une adresse représentée par une chaîne de caractères. Ainsi, vous pourrez utiliser, pour des branchements dans vos propres programmes, des noms qui seront le reflet d’une adresse vers laquelle le processeur devra se diriger. Ceci est encore une astuce permettant de ne pas avoir à se triturer les méninges. Exemple :

              ORG #9000
—————             ; Plein  d’instructions
DEBUT LD A,10      ; Peu importe où c’est
—————             ; Plein  d’instructions
              JP DEBUT  ; Il sait où  il  va

Il, dans l’exemple ci-dessus, est en fait le microprocesseur. L’assembleur fera le travail de recherche et de calcul de l’adresse symbolisée par DEBUT. Mais ceci n’est pas seulement valable pour les adresses internes au programme. En effet, l’utilisation de l’instruction EQU permet d’affecter une adresse â un mot. Ainsi, un vecteur souvent utilisé pourra être remplacé par un nom plus convivial qu’un chiffre (de plus, cela évite les plantages bêtes dus à des erreurs d’inattention). Exemple :

                ORG     #9000
PRINT     EQU     #BB5A
BIP          EQU     7
DEBUT   LD        A,BIP
                JP         PRINT

Comme vous avez pu vous en rendre compte, cette instruction sert à affecter une valeur à un nom. Contrairement à une étiquette, il est possible d’assigner, au symbole situé dans la première colonne, une valeur quelconque, qui prendra la place du symbole lors de l’assemblage. Dorénavant, lorsque nous emploierons « étiquette », il faudra entendre ‘ adresse », et lorsque nous citerons « symbole », vous saurez qu’un nom a été affecté à une valeur donnée. Voilà qui met encore pas mal de choses au point.

ILS SONT GIVRES MAIS CA VA CHAUFFER

Après avoir parlé des constantes figées et dépendantes  du  processus d’assemblage, nous allons aborder la notion de variables mémoires. Il existe pas mal de différentes syntaxes pour définir un octet, un mot. une chaîne de caractères ou un espace réservé. Nous utiliserons ici la plus courante des notations et ses divers écarts ou abréviations. 

PAGE 2

L’assembleur n’est pas considéré comme un langage évolué car il est avant tout incapable de gérer directement différents types de variables tels que les réels ou les chaînes de caractères. En l’occurrence, le Z80 ne sait travailler qu’avec des mots de seize bits et des octets (de huit bits). Toutes les opérations effectuées sur des objets plus complexes que ces données simples ne sont qu’une suite de milliers de traitements logiques réalisés sur des mots ou des octets. Nous verrons ces opérations plus ou moins complexes plus ou moins plus tard et, en attendant, nous allons passer en revue les simples mots-clefs permettant à l’assembleur   de   gérer   l’espace   mémoire.

Cette opération n’est en fait nécessaire que pour l’homme car. encore une fois le microprocesseur ne fait aucune différence entre un nombre et un caractère. Il faut voir cela de la même manière que les variables Basic sauf qu’ici il n’y a pas de syntax error : ce qui fait véritablement la puissance de ce langage, c’est que n’importe quelle donnée peut être traitée de n importe quelle manière. Mais voici l’énoncé rapide des différentes possibilités de gestion de la mémoire par l’intermédiaire de l’assembleur.

 

DES FINITIONS

Il existe donc différentes manières de coder les données en mémoire. Nous allons les citer en fonction du type de données stockées. Le plus simple est de commencer par l’instruction qui permet de stocker l’élément de base, c’est-à-dire l’octet.

ADROCT  DEFB 00

Ou

ADROCT  DB   00

Ces instructions permettent de forcer la case mémoire Adroct à zéro. Elles sont identiques et dépendent simplement par leur syntaxe, du type d’assembleur Utilisé. Il est possible de mettre plusieurs octets à la suite du mot-clef pour ne pas utiliser autant de lignes que de données, de la manière suivante par exemple :

DB 12,11,10,9,8

De plus, certains assembleurs acceptent un caractère entre guillemets, ce qui évite de rechercher le code Ascii de la donnée à stocker :

DB « A » ; Ascii

Mais les possibilités d’un assembleur ne s’arrêtent pas ici car il faut aussi pouvoir jongler avec les différentes bases mathématiques. Ainsi, l’instruction précédente équivaut à :

DB 65 ; Décimal

DB #41 ; Hexadécimal

DB  %01000001 ; Binaire

(La dernière ligne, qui concerne le binaire, est en fait rarement disponible car très peu d’assembleurs travaillent dans cette base. Cela peut être décevant car il est parfois utile, pour des masquages par exemple, de pouvoir disposer de cette option.) Etant donné que nous avons parlé de caractères, il est de bon  aloi d’introduire des chaînes du même genre. Des ordres permettent de ranger des chaînes de caractères de la manière suivante :

ADRCHAI   DEFM Salut amis lecteurs   ; Format DAMS

ADRCHAI   DB « Salut amis lecteurs »   ; Format Devpac & Pyradev

Ces deux façons d’implanter une chaîne de caractères en mémoire sont encore dépendantes du type d’assembleur utilisé. Une troisième option est parfois offerte à l’utilisateur. Elle permet de remplir une zone définie de mémoire avec une valeur précisée. Sa syntaxe est la suivante :

DEFS   100,0

100 représente le nombre d’octets à remplir, et 0 est la valeur de remplissage. Cela sert à initialiser une zone fixe pour des stockages éventuels. 

Le dernier type de gestion de mémoire est un peu spécial car il obéit à une règle fixée par le Z80 lui-même. Cette instruction, DEFW. permet de stocker un mot (2 octets) en mémoire mais ceci à la façon du Z80. Ce microprocesseur, comme beaucoup de faux 16 bits, stocke un mot dans le désordre (pour l’homme). Un exemple sera ici plus parlant que mille mots. Si vous tapez :

ORG  #A000
DEFW #1234

Il apparaîtra à l’adresse &A000, non pas &12 mais &34. L’adresse &A001 sera, elle, occupée par la valeur &12. Nous verrons plus tard pourquoi il faut stocker des variables de cette manière. Voilà, ce cours va se terminer ici et il ne tient qu’à vous de poursuivre seul l’étude des différentes commandes de votre assembleur.

 

CALL MOIS-PROCHAIN

Le mois prochain, nous continuerons l’étude des assembleurs et surtout celle du langage utilisé par ses fantastiques traducteurs. Pour le moment, il serait bien que vous nous écriviez pour nous faire part de quelques suggestions qui nous permettraient de mieux cibler cette initiation. Alors au mois prochain. Et tripotez bien votre CPC de ma part

Lusse !


Sibar le Nénerie

PAGE 3