CODING ★ Il cours, il cours l'assembleur ★

Assembleur ACPC n°23 - Il cours, il cours l'assembleur
Des cours assembleur, il y en a eu beaucoup et un peu partout. Il sont probablement écrits par des super pro, mais qui n'ont rien compris à la facilité d'apprentissage. Car rien n'est plus barbant et incompréhensible qu'un cours assembleur fait pour débutants. Je ne vais donc pas vous prendre la tête avec tout le bla-bla que vous trouverez dans tous les bouquins et revues qui parlent de bits et d'octets, qui sont, au premier abord, plutôt déroutants et ne donnent absolument pas envie de continuer l'apprentissage de ce langage. Nous travaillons sur des CPC ; nos cours d'assembleur seront spécifiques à cette machine.

Mais, pensez-vous sûrement, qu'est-ce qu'il va nous refiler de neuf, celui-là, hummmm? Eh bien, je ne vous parlerai pas de bits ni d'octets, encore moins du binaire, car pour cela, un bon nombre de cours sur internet et d'ouvrages sont à votre disposition.

PASSONS AUX CHOSES SERIEUSES

Nous verrons ensemble des petites routines qui seront grandement commentées pour, d'une part, vous apprendre sur le tas comment on programme en assembleur et, d'autre part, pour vous familiariser avec les instructions pas évidentes à comprendre (du moins dans leur utilité) au premier abord. Par exemple, si je vous disais que l'instruction SLA décale tous les bits d'un registre à gauche, vous ne pouvez pas vous douter que cette opération multiplie par deux la valeur de ce même registre. Eh bien, maintenant vous le savez. Donc, pas de bla-bla en ce qui concerne la machine...

Il ne faut tout de même pas exagérer, un minimum de connaissances sur l'organisation de la machine est nécessaire (je dis bien un minimum).

Pour cela, il suffit de savoir que nos CPC ont une mémoire de 64 kilo-octets. Sachant que chaque kilo-octet représente 1024 octets, on en déduit que nous avons à notre disposition 65536 octets, c'est-à-dire des cases mémoire qui seront personnalisées par leur position les unes par rapport aux autres. La première case est l'octet 0 et la dernière, le 65536.

Les premiers octets en bas de mémoire (allant de 0 à 170) sont réservés au système (pas touche pour l'instant). Le reste est disponible jusqu'en &A700, où l'on trouve les variables système vecteurs dise et autres, qui peuvent être écrasés par vos programmes (un bon paquet de routines déjà écrites, comme toute bonne chose, prennent de la place).

Vient ensuite la mémoire écran, qui va de 49152 (&C000 en hexa) jusqu'en fin de mémoire. Je ne vais pas m'étaler sur cette zone réservée à l'écran parce qu'une intention est en cours de réalisation.

La mémoire étant le champ de bataille de tout programmeur en assembleur, les registres restent leurs armes. C'est vrai qu'en assembleur, nous n'avons pas de facilité du genre PRINT “BONJOUR” ; par contre, nous avons des registres qui servent à manipuler les valeurs stockées dans les octets en mémoire et, aussi bizarre que cela puisse paraître, avec les opérations qui sont à notre disposition, nous pourrons faire encore plus fort que le Basic, sans oublier le Turbo que nous collerons aux fesses de la machine.

Le registre le plus important de notre machine est l'accumulateur ; la plupart des opérations le concerne. Il est de nature 8 bits, donc il est hors de question de lui donner une valeur plus grande que 255. Viennent ensuite les doubles registres (16 bits) HL, DE et BC, et pour finir, les registres indexés IX et IY Si l'on considère la mémoire de notre ordinateur comme une grande bibliothèque avec plein de cases, les registres sont des brouettes qui peuvent prendre ces valeurs et les transporter d'une case à l'autre, avec possibilité d'y apporter des modifications.

LD A,(49152)
LD (49153),A
INC A
LD (49152),A

Voici ce que j'appelle un exemple qui ne sert strictement à rien mais qui vous montre comment on peut travailler en assembleur. L'instruction LD (à prononcer Load) sert à charger quelque chose quelque part, en l'occurrence la valeur de l'octet 49152 qui est le premier octet de la mémoire écran (l'équivalent Basic serait A=PEEK (49152)) dans l'accu.

Imaginons que cette valeur soit 123. La deuxième instruction charge cette valeur dans l'octet 49153, ensuite INC A incrémente la valeur de l'accu. pour enfin la stocker dans la case 49152 d'où elle était sortie. Vous voyez comment on peut transférer une valeur d'un octet à l'autre il va de soit que l'on pouvait décrémenter cette valeur DEC A ou lui faire subir toutes sortes d'opérations logiques, j'en passe et des meilleurs

“BONJOUR” !

A propos de PRINT “BONJOUR”, si l'on s'amusait à afficher un texte à l'écran ? Je vois que vous êtes tous d'accord avec moi, alors suivez-moi bien. Je vous disais qu'il existait des vecteurs qui ne sont que de bêtes points d'entrée pour des routines écrites par les programmeurs de nos machines. Le plus connu de tous est le &BB5A. Je veux dire que vous pouvez appeler ce vecteur par un CALL &BB5A. Le résultat ? Eh bien, le caractère ASCII correspondant au contenu de l'accumulateur est affiché. Le problème qui vient tout de suite à vos petites cervelles est qu'afficher un caractère, c'est bien, mais afficher une phrase, c'est mieux. Pour cela il suffit de répéter l'opération jusqu'à la fin de la chaîne de caractères. Nous aurons ainsi deux possibilités ou on compte le nombre de caractères à afficher, ou on place un caractère un peu spécial qui nous indique la fin de la chaîne.

AFFICHE LD HL.TEXT
BOUCLE LD A,(HL)
CP 0
RET Z
CALL &BB5A
INC HL
JR BOUCLE
TEXT DM “BONJOUR”
DB 0

Voyons en détail, ligne par ligne, le petit programme que voilà.

Il n'existe pas de numéro de ligne en assembleur, et pour faire un saut (l'équivalent de GOTO en Basic), on utilise des labels ou étiquettes, ce sont les AFFICHE, BOUCLE et TEXT.

Pour commencer, on pointe le registre HL sur la zone de texte qui contient les valeurs des caractères ASCII de “BONJOUR”. donc 66,79,78,74, etc. Le contenu du registre HL est, au départ, égal à 66. qui est le code ASCII de la lettre B. On le charge dans l'accu. On teste si cette valeur est égale à 0, ce qui nous indique la fin de la chaîne (il va de soi qu'une autre valeur aurait pu être choisie). Si cette condition est remplie, on sort du sous-programme AFFICHE, sinon, on affiche le caractère, on incrémente HL pour qu'il pointe sur la valeur suivante, et on recommence le tout à partir du label BOUCLE.

Il faut savoir que l'instruction RET est l'équivalent de RETURN en Basic et correspond au retour du point d'appel d'un sous-programme. Donc, on comprend facilement que le sous-programme que voici doit être appelé par un CALL AFFICHE, sinon vous aurez un superbe plantage.

Cette instruction peut être conditionnelle, je veux dire par là qu'elle sera exécutée si une condition est remplie ou pas. Dans notre exemple, il faut que la valeur de l'accu. qui est comparée à O soit vérifiée, autrement le programme tournera jusqu'à la fin des nuits du temps. On peut, bien sûr, utiliser dans d'autres circonstances RET NZ qui est le RETour si Non Zéro, ou d'autres conditions que l'on verra plus tard ensemble. Pour votre gouverne, c'est un registre un peu spécial nommé FLAG qui s'occupe de tout ça, mais vous pouvez, dans un premier temps, l'ignorer complètement.

Le texte ainsi affiché peut être placé dans n'importe quelle zone de l'écran, car il existe un autre vecteur système qui joue le rôle de l'instruction Basic LOCATE, et qui est sa majesté le &BB75. Pour l'utiliser, il suffit de mettre dans le registre H le numéro de la colonne et, dans le registre L, le numéro de ligne (sachant que, contrairement au Basic, la position en haut à gauche de l'écran est 0,0).

LD H,2
LD L,2
CALL &BB75

Ou, pour être plus compact et plus propre:

LD HL,2*256+2
CALL &BB75

Et voilà, il ne vous reste plus qu'à faire mumuse et à afficher des textes dans tous les sens et, pourquoi pas, en plusieurs couleurs. Pour cela, sachez que le vecteur du docteur &BB90 est là pour ça, et que le numéro du PEN doit être chargé au préalable dans l'accu. A plus!

Zède A100% n°23, corrigé et modifier par hErmoL

Page précédente : Assembleur ACPC n°22 - Le CLS le plus rapide sur CPC - Part II

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Assembleur ACPC n°14 - AS: ÇA C'EST COOL
» Coding » Assembleur ACPC n°34
» Coding » Bidouilles ACPC n°40 - Gestion d'erreurs des routines disques
» Coding » Assembleur ACPC n°46 - La multiplication et la division
» Coding » Assembleur ACPC n°19 - Création d'RSX
» Coding » Assembleur ACPC n 04 - Initiation : Débuter avec sont assembleur
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 018 millisecondes et consultée 1850 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.