CODING ★ INITIATION A L'ASSEMBLEUR ★

Assembleur ACPC n°09 - Initiation : Les ADD / ADC / SUB / SBC
Encore un petit cours assembleur maison offert cent pour cent de bon cœur. C'est avec plaisir que nous vous retrouvons ce mois-ci pour vous faire partager notre amour de ce qui est beau et de ce qui va vite : en un mot, l'assembleur. Nous allons poursuivre notre étude du Z80 et de ses instructions.

Nous ayons déjà fait le tour des quelques instructions primaires et allons continuer à le faire avec des opérations un peu plus intéressantes, car elles permettent de calculer et de modifier des données de façon conséquente. Charger et sauver des données ne sont pas les seules opérations possibles entre le Z80 et la mémoire, et voici quelques instructions qui en témoignent

ADD, SUB, ADC, SBC, KESAKO, MAQUE ???

Mon dieu, par Krom, que de mots f "imbitables" en apparence ! il faut que je vous explique un peu le terme imbitable avant que ce paragraphe ne devienne pornographique. Imbitable est un mot inventé par le programmeur pour dire d'une chose qu'elle n'est pas transformable en bits. On aurait pu dire inoctable, diront certains, mais au moment où ce terme est apparu, les gens ne programmaient qu'en binaire, par l'intermédiaire d'interrupteurs ; alors les octets, ils s'en moquaient un peu. Revenons à nos mnémoniques. ADD et SUB sont de la même famille. ADD veul dire addition, et SUB. substraction. C'est de l'anglais, et cela se traduit plus ou moins par addition et soustraction. Ah Dédé, ah des dés. ADD, c'est la mnémonique utilisée pour faire des additions entre registres, ou entre un registre et de la mémoire, voire encore entre un registre et une valeur immédiate. Voici les opérations permises par le Z80 :

ADD A,(HL)
ADD A,(IX+d) (0 <= d <= 255)
ADD A,(IY+d) (0 < = d < = 255)
ADD A,n (0 < = n < = 255)
ADD A,r (r:A,B,C. D.E,H,L)
ADD HL,rr (rr : BC, DE, HL. SP)
ADD IX,rr (rr : BC, DE, IX, SP)
ADD IY,rt (rr : BC, DE, IY, SP)

Dans la liste ci-dessus, d est un déplacement signé sur un octet, n une valeur entre zéro et deux cent cinquante-cinq, r un registre simple, et rr un registre double. Pour ces opérations concernant l'accumulateur, tous les drapeaux indicateurs d'état du registre F sont influencés. Par contre, en ce qui concerne les opérations sur les registres seize bits, seul l'indicateur de débordement (C la retenue) témoigne d'une éventuelle erreur. Voilà, tout est dit pour ADD, passons donc à SUB.

Cette instruction est au niveau en dessous d'ADD car elle ne permet de faire des opérations que sur I accumulateur. Il est donc possible de soustraire de A un registre huit bits, une valeur immédiate, le contenu de l'adresse pointée par HL. par K+d ou encore par fY+d. Tous les drapeaux sont positionnes en fonction du résultat, ce qui permet de faire les travaux nécessaires à la suite du programme sans galipettes périlleuses. Comme vous l'avez vu, ces opérations ne prennent aucun drapeau en compte, et les opérations se ton! bêtement. La syntaxe à utiliser avec cette instruction n'est pas la même que celle utilisée pour ADD. Etant donné que l'opérande de destination est toujours l'accumulateur, il n'est pas nécessaire de le préciser. Les assembleurs comprennent donc la simple commande suivante :

SUB opérande

Les mêmes instructions existent aussi, mais tiennent compte de la retenue, ce qui permet de faire des calculs plus performants. ADC (addition witb carry) et SBC (substraction with carry) permettent de faire des opérations sans négliger la retenue, ce qui est très utile lors de calculs entre des valeurs codées sur huit et seize bits. Voici une petite routine qui appuie mes dires : 8 ; Addition de HL avec A et stockage dans HL

ADD A,L ; Addition des deux poids faibles.
LD L,A ; Stockage dans L.
LD A,H ; Chargement du poids fort.
ADC A,0 ; Mise à jour du poids fort
LD H,A ; Restoration du poids fort.

Ou encore:

ADD A.L ; Addition des deux poids faibles.
LD L,A ; Stockage dans L.
JR NC,PAS ; Saute l'instruction suivante.
INC H ;Incrémente H si Carry
PAS ...

Cela permet donc d'additionner une valeur huit bits à une valeur seize bits, sans modifier un second registre double. Cela parait insignifiant, au premier abord, mais il faut bien se dire que ce n'est pas parce que l'assembleur est rapide qu'il ne faut pas faire d'efforts. Toute optération faite avec la mémoire prend beaucoup plus de temps qu'une même opération exécutée dans le microprocesseur. De ce fait, il faut utiliser la mémoire le moins possible, et donc éviter tout PUSH, CALL, etc. Cela ne doit pas être fait au détriment de la structure du programme, quoique le gain de vitesse soit assez conséquent, lors de la programmation en ligne. Les types d'adressages possibles avec cette instruction sont

ADC A,(HL)
ADC A,(IX+d) (0<=d<=255)
ADC A,(IY+d) (0 < = d < = 255)
ADC A,n (0<=n<=255)
ADC A,r (r : A, B, C, D, E, H, L)
ADC HL,rr (rr : BC, DE, HL, SP)

Toutes ces opérations positionnent parfaitement tous les drapeaux, ce qui n'est pour déplaire à personne. Pour en finir avec ces quelques instructions, nous allons parler de SBC ( Zousblash !!! Ce fut le bruit provoqué par la baffe mise au chef par Sined, à la suite d'un jeu de mot idiot que nous ne citerons pas. Et puis si : non, c'est levé). SBC, comme ADC, fait appel à la retenue. SBC signifie substraction with carry. c'est-à-dire soustraction avec retenue. Cette instruction opère une soustraction du premier registre désigné avec l'opérande donnée et la retenue. Le résultat obtenu est stocké dans le premier registre donné et les drapeaux indicateurs sont positionnés en conséquence. Voici donc les instructions reconnues avec cette mnémonique.

SBC A,(HL)
SBC A,(IX+d) (0<=d<=255)
SBC A,(IY+d) (0<=d<=255)
SBC A,n (0<=n<=255)
SBC A,r (r : A, B, C, D, E, H, L)
SBC HL,rr (rr : BC, DE, HL, SP)

Comme vous le voyez, cette instruction ressemble beaucoup à ADC et le même genre d'ennui arrive de la même manière. En effet, il arrive parfois qu'un dépassement de capacité fausse les résultats. Il faut donc faire attention, lors de vos calculs, à vérifier les drapeaux pour ne pas avoir de surprises. Comme nous avons beaucoup parlé de la retenue, il faut aussi savoir que certaines instructions servent à la forcer ou n la modifier.

LA RETENUE

Ah, la retenue ! Je me rappelle avoir passé de nombreuses heures de colle en retenue. Mes professeurs ne m'aimaient pas beaucoup, et. à l'école, le temps que je ne passais pas au coin, je le passais en heures de retenue. Par Krom. ce que j'ai pu maudire cette retenue. Maintenant, jai grandi, et je vénère ce que j'ai dû combattre autrefois. Cette retenue est en effet un des outils les plus importants du microprocesseur, et sans elle, nous serions considérablement coincés. Pour l'influencer, nous avons deux instructions, et même trois. Les deux premières sont simples et influencent directement la retenue. D'abord, nous avons SCF. c'est-à-dire set carry Flag, qui force la retenue à un, ce qui peut parfois servir. La seconde opération influençant directement la carry est CCF, qui complémente la retenue, comme son nom l'indique. Il faut bien faire attention et ne pas comprendre nettoyage de la retenue. Lors de l'utilisation de cette instruction, la carry devient simplement son opposé. Si elle valait un, elle devient zéro, et inversement vice versa le contraire. La troisième opération dont je vous ai parlé force la retenue à zéro, sans pour autant la concerner directement En effet OR A ne prend qu'un octet le minimum de place et de temps machine, et nettoie la retenue, sans modifier aucun registre. Voilà, je vous ai donné tous mes petits secrets a ce sujet

OH MOI, VOUS SAVEZ

Eh oui, vous le savez, au mois prochain, comme d'habitude. Mais avant de vous quitter, je vous donne une dernière opération que j'avais oubliée. NEG est une petite instruction qui fait simplement une soustraction à 0 de l'accumulateur et stocke le résultat dans A. En fait cela inverse simplement le signe de l'accumulateur tant chéri. Voilà qui finit ce cours assembleur. Le mois prochain. nous parlerons des rotations et, ensuite, à nous la belle programmation ; nous ferons des tas de petites routines sympa. Allez, plus qu'un mois à patienter et ta délivrance arrivera. Sur ce, à plus.

Sined le barbare et les quarante voleurs , A100% n°9 p88-89

Page précédente : Bidouilles ACPC n°08 - RSX editeur de secteurs

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

Lien(s):
» Coding » Assembleur ACPC n°36 - Dis moi, c'est quoi l'assembleur
» Coding » Bidouilles ACPC n°36 - Direct disk Access
» Coding » Assembleur ACPC n°48 : Compresse des Compress
» Coding » Assembleur ACPC n°33
» Coding » Assembleur ACPC n°20 - Convertion numerique
» Coding » Bidouilles ACPC n°33 - Formatage de bronze
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 384 millisecondes et consultée 2779 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.