CODINGAMSTAR ★ INITIATION A L'ASSEMBLEUR - PARTIE 3 ★

Alors, pas trop découragés ? C'est vrai que pour l'instant on ne fait pas grand-chose d'intéressant, mais rassurez-vous ça va changer. Aujourd'hui, on va apprendre à en taper le moins possible et à gagner en rapidité.

Reprenons le programme d'écriture d'un mot. L'organigramme donnait à peu près ceci :

A chaque fois, il fallait charger la lettre, puis l'afficher, puis charger la lettre suivante, l'afficher, etc., travail fastidieux et facilement décourageant lorsqu'on veut taper un texte de 150 lettres...

Rassurez-vous, il y a mieux. Ce qu'on va faire, c'est Implanter notre texte en mémoire (d'une façon très simple), puis lire le contenu de la mémoire où se trouve le texte en utilisant un pointeur. Pour mieux comprendre, voici l'organigramme :

Simple, non ? Il y a une autre manière, a peu près semblable. mais économisant un registre (B en l'occurence). Nous la verrons plus loin.

Bon, maintenant, voyons le listing. Le début, vous le connaissez tous maintenant :

ORG  8000H
LOAD 8000H

Je rappelle que nous tapons les valeurs comme si nous étions sous ZEN. Suivant l'assembleur que vous utilisez, la syntaxe peut être différente, attention !

La suite n'est pas difficile non plus, elle est de la forme : LD HL, adresse. Vous allez bien sûr remplacer «adresse» par l'adresse où votre texte est Implanté, et mol Je dis non. Non. A quoi donc serviraient les étiquettes, vous dirais-Je ?

Donc on va taper LD HL, TEXTE, par exemple. Puis si notre texte fait 10 caractères de long, la suite sera LD B,10.

Donc pour l'Instant, nous avons la partie Initialisation :

ORG  8000H
LOAD 8000H
LD HL,TEXTE
LD B,10

Pour mieux comprendre. Je vous conseille de suivre sur l'organigramme, histoire qu'il serve, hein, Olivier !

Rien de nouveau Jusqu'ici.

Maintenant, on va charger dans A le contenu de la mémoire pointée par HL. Ceci se fait par :
LD A,(HL). N'oubliez pas les parenthèses.
Donc A contient maintenant le premier caractère à afficher. Attendez, ne tapez rien. Il y aura tout à I ' heure une modification à apporter.

Ensuite, l'affichage, classique : CALL0BB5AM

Maintenant, nouvelle Instruction, qui va nous servir à DECrémenter le registre B : DEC B, sans commentaires.

Nous voilà maintenant au point le plus complexe du programme : le test du registre B, qui va nous permettre, s'il contient la valeur 0, d'arrêter le programme, ou au contraire, de continuer l'affichage du texte.

Ce qui nous amène à parler des sauts conditionnels et plus précisément des conditions.
D'abord, que va-t-il se passer dans le programme ?

On veut - si B = 0 terminer le programme, ou, si B * 0, Incrémenter HL puis reSAUTER au début du programme (chargement de A avec (HL) LD A,(HL).

Qu'est-ce qu'un saut conditionnel ? C'est tout simplement un saut qui a lieu si une condition précise est vérifiée. En syntaxe, cela donne : JP condition, adresse ; ce qui veut dire : si condition = 1 alors sauter à «adresse».

LES CONDITIONS

Il existe un registre du Z-80, F, appelle registre flag. Flag, en anglais, signifie drapeau, mais signal est plus compréhensible. On l'appelle aussi registre d'état. C'est un registre 8 bit, où chacun des bits correspond à une condition (Ah, oui, au fait, on l'associe à A pour former un registre 16 bit, AF, que Je vous demanderais de ne pas utiliser pour le moment).

Voici un tableau résumant la ou les fonctions de chaque bit :

Voici maintenant la liste des conditions (syntaxe) :

NZ : non zéro (Inverse de zéro) -» bit n°6
Z  : zéro-> bit n° 6
NC : pas de retenue -> bit n° 0
C  : retenue -> bit n° 0
M  : résultat négatif -> bit n° 7
P  : résultat positif -> bit n° 7
PO : parité paire -» bit n° 2
PE : parité Impaire -> bit n° 2Revenons à notre programme. Nous aurons donc :

JP Z, adresse -> saute à «adresse» si «DEC B »a donné B = 0.

adresse étant l'adresse de fin de programme, on peut mettre l'étiquette FIN.

Ensuite on Incrémente HL : INC HL (Vous l'aviez sûrement deviné). Puis on resaute à l'Instruction LD A. (HL) : JP BOUCLE : on effectue donc la modification suivante :

BOUCLE :LD A, (HL)

Finalement le programme donne :

          ORG  8000H
          LOAD 8000H
          LD HL, TEXTE
          LD B,10
BOUCLE:   LD A,(HL)
          CALL BB5AH
          DEC B
          JP Z,FIN
          INC HL
          JP BOUCLE
FIN:      RET
TEXTE:    DEFM "AMSTAR & CPC"
          END

L'Instruction DEFM : elle sert à DE-Finlr une zone Mémoire de 255 caractères max. Son avantage est qu'elle évite de taper des codes ASCII plutôt que des caractères. Ça fait plus clair, non ?
Vous pouvez donc changer AMSTAR & CPC par ce qui vous chante, en n'oubliant pas de changer la valeur Initiale de B !

Bon maintenant, nous allons faire une modification qui va nous économiser une ligne.

Cela se passe au niveau du test de B.

Au lieu de :

- décrémenter B
- aller en FIN si B = 0
- autrement, Incrémenter HL
- sauter en BOUCLE,

nous allons :

- Incrémenter HL
- décrémenter B
- sauter en boucle si B * 0,

ainsi si B = 0 , le programme continuera son cours pour arriver au RET final, ce qui nous donne :

         ORG 8000H
         LOAD 8000H
         LD HL, TEXTE
         LD B, 10
BOUCLE:  LD A, (HL)
         CALL 0BB5AH
         INC HL                ;
         DEC B                 ; partie
         JP NZ, BOUCLE         ; modifiée
         RET                   ;
TEXTE:   DEFM "AMSTAR & CPC"
         ENDJe ne reviens pas sur INC et DEC, vous avez tous compris, ce que c'était. En revanche, le LD AXHL) vous inquiète un peu plus :

HL étant un registre 16 bits (2 octets donc 2 fols 8 bits), Il peut contenir une adresse mémoire sur 16 bits, cela va de sol, Et cette adresse, elle, contient une valeur sur 8 bits.

Exemple, en Basic, lorsque vous faites POKE &50FE, 251 (exemple au hasard bien sûr), 8i50FE est une adresse sur 16 bits, et 251 est une valeur 8 bits.

Donc HL peut contenir par exemple, &50FE.

En simplifiant, (HL) veut dire, en assembleur : contenu de la case mémoire pointée par HL. Ici on aura (HL) = 251.
Dans notre exemple, le contenu de la case mémoire pointée par HL, c'est 65 (code ASCII) de «A»). Puis lorsqu'on Incrémente HL, on Incrémente en fait la case mémoire dont le contenu, cette fols, est 77 (code ASCII de «M») et ainsi de suite...

D'où lorsqu'on a LD A,(HL). on charge A avec le code ASCII contenu dans la mémoire définie par l'étiquette TEXTE. Ça suit ?

LES PSEUDOINSTRUCTIONS

Bon. maintenant, nous allons parler des pseudo-instructions. N'ayez pas peur, vous en connaissez déjà une, DEFM.

Une pseudo-Instruction est une instruction qui est destinée à l'assembleur (le programme) pour lui faire comprendre ce qu'il doit faire et ne pas faire, en quelques sortes. Correction : vous en connaissez cinq. Les trois premières, vous les avez apprises au premier cours. Il s'agit de ORG, LOAD et END, sur lesquelles je ne reviens pas. Le mois dernier, vous avez fait connaissance avec EQU. Nous allons voir les dernières :

DEFM : comme nous l'avons vue. cette instruction sert à placer en mémoire une chaîne, allant de 1 à 255 caractères derrière une étiquette.

Exemple : TEXTE: DEFM "OLIVIER"

DEFB : cela signifie DEFINE BYTE, en français cela donne « définition d'octet(s) ». Ainsi, on peut placer un ou plusieurs octets à partir d'une adresse ou étiquette. De plus, on peut aussi bien entrer les codes en valeurs décimales ou hexadécimales, qu'en caractères ASCII, entre guillemets.

Exemple : TEXTE : DEFB "O", 76, "I", 86, "I", "E", 82

Jeu : devinez le nom de la personnalité qui rédige ce Journal, en décodant le mot de l'exemple.
Réponse : Il y en a un qui s'est encore planté, c'est Olivier. Il m'a répondu : «c'est Moi I». Bien sûr. vous, ô. Intelligents lecteurs, vous aviez rectifié. C'est évidemment OLIVIER qu'il fallait répondre, et non MOI. Lamentable, Olivier...

Bon. on continue avec :

DEFW : DEFINE WORD, soit «définition d'un mot». Un mot, c'est une valeur 16 bits. Donc DEFW permet de placer des valeurs 16 bits à partir d'une étiquette ou d'une adresse. Généralement on ne peut mettre qu'une adresse par Instruction.
Cela donne : ADR: DEFW 0F8FFH

DEFS : DEFINE STORAGE, soit «définition d'une zone mémoire». Cette instruction permet d ' Inltlallser à zéro une zone mémoire de N octets.

Exemple :VAR:DEFS 2

On définit Ici une zone mémoire de 2 octets inltlallsés à 0. que l'on appellera par VAR.
Cette Instruction permet de sauvegarder des valeurs.

Si par exemple, le registre BC contient une valeur Importante pour la suite du programme, et que l'on a besoin à nouveau de ce registre dans l'immédiat, on peut procéder comme suit:

LD (VAR), BC

Ainsi on sauve la valeur de BC dans VAR.
Ces pseudos-lnstructlons nous serviront dans les articles ultérieurs. Pour l'instant nous allons voir une dernière Instruction :

CP : abréviation de ComPare. Cette instruction compare le registre A au registre ou à la valeur qu'on lui a associée.
Syntaxe :  CP valeur CP registre Exemple : CP 27 = compare A à 27
La soustraction entre A et l'opérande spécifié a Heu et le registre d'état est modifié en conséquence.

SI A > opérande, alors on a les conditions NZ et NC
SI A = opérande, alors on a la condition Z
SI A < opérande, alors on a la condition C

Et pour terminer, un petit exercice qui sera corrigé le mois prochain. C'est la fameuse 2ème solution dont au sujet de laquelle je vous avals parlé en début d'article. Voici l'organigramme.

Et en fin de programme vous entrerez votre texte à partir de l'étiquette TEXTE, puis vous aurez un petit supplément a mettre... Vous verrez c'est très simple, en tout cas, tout est dans cet article. Bon j'arrête, parce qu'Olivier est tout rouge, exorbité (enfin, ses yeux). Il a perdu la moitié de ses cheveux, sa mâchoire est tombée sur son bureau à force de pendre (d'exaltation. Je crois), et il vient de se mettre à danser la lambada avec sa chaise, sur son bureau ; c'est rigolo à voir, surtout qu'en plus il chante... Je ne vous décris pas le tableau du mois prochain, car c'est Jean Le François qui prendra le relais (à mon avis, lui. Il prendra des coups, c'est sûr, m'enfin on verra...), Bye !

Emmanuel GUILLARD , AMSTAR & CPC n°39 -  http://cpcrulez.fr

» Download ZEN - assembler package
» Download Amsoft Devpac

 

★ ANNÉE: ???
★ AUTEUR: Emmanuel GUILLARD

Page précédente : Initiation à L'Assembleur Amstar&CPC 38

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 246 millisecondes et consultée 1680 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.