CODING ★ L'ADDITION, S'IL VOUS PLAIT ★

Assembleur ACPC n°39 - L'addition s'il vous plait

Après avoir passé en revue quelques instructions du Z80, microprocesseur Cœur de notre CPC, nous allons avancer encore un peu dans la jungle des mnémoniques et apprendre à construire des programmes se servant des vecteurs du système. Cela dit, voici quelques fonctions supplémentaires qu'il nous faut connaître avant de poursuivre.

Comme vous le savez, il n'est pas possible en Assembleur de disposer d'instructions puissantes de calcul. Tout n'est qu'additions, décalages, soustractions, masquages.., Bref, rien que de l'arrache-cheveux à tire-larigot. En clair, le langage Assembleur n'est que ruses, astuces, emberlificoteuses monstrueux d'avalanches d'opérations réunies pour arriver à des fins parfois impénétrables. Le plus dur est sûrement de percer le secret du programmeur pour s'apercevoir que la suite d'instructions utilisée est d'une évidence et d'une clarté sans pareil. Ne vous arrachez pas tout de suite les oreilles, il sera temps lorsque vous désirerez analyser le programme d'un autre. Passons donc à la suite de nos instructions.

AH. DEDE

ADD, comme ADDition, permet de récupérer la somme de deux opérandes. Pour tout simplifier, il y a une opérande obligatoire soit l'accumulateur si on travaille en huit bits, soit l'un des registres seize bits HL, IX ou IY. Ainsi les seules bêtes additions huit bits réalisables passent par le registre A. Par contre, l'avantage qui en résulte est que vous pouvez lui ajouter n'importe quoi

ADD A,B ; A=A+Ie contenu de B.
ADD A,C ; A=A+le contenu de C.
ADD A,12 ; A=A+12.
ADD A,(HL) ; A=A+le contenu de l'adresse pointée par HL.

et même

ADD A,A ; A=A+A

Avant de poursuivre, voici la liste de toutes les instructions d'additions exploitables.

Additions huit bits

ADD A,A ; a=a+a
ADD A,8 ; a=a+b
ADD A,C ; a=a+c
ADD A,D ; a=a+d
ADD A,E ; a=a+e
ADD AH ; a=a+h
ADD A,L ; a=a+l
ADD A,valeur_Immédiate ; a=a+valeur immédiate
ADD A,(HL) ; a=a+peek(hI)
ADD A,(IX+déplacement) ; a=a+peek(ix+déplacement)
ADD A,(IY+déplacement) ; a=a+peek(iy+déplacement)

Additions seize bits

ADD HL,BC ; hl=hl+bc
ADD HL,DE ; hl=hl+de
ADD HL,HL ; hl=hl+hl
ADD HL,SP ; hl=hl+sp
ADD IX,BC ; ix=ix+bc
ADD IX,DE ; ix=ix+de
ADD lX,lX ; ix=ix+ix
ADD IX,SP ; ix=ix+sp
ADD IY,BC ; iy=iy+bc
ADD IY,DE ; iy=iy+de
ADD IY,IY ; iy=iy+iy
ADD IY,SP ; iy=iy+sp

Comme nous l'avons vu dans les dernier cours, toute opération concernant un registre simple et des registres d'index (IX et IY) passe par l'emploi d'un déplacement variant de 127 à -128.
Valeur immédiate peut être un quelconque nombre variant entre O et 255.

AH. LALA

Voici maintenant comment fonctionnent réellement ces instructions. Comme nous vous le répétons sans cesse, un registre simple ne peut contenir que des valeurs comprises entre 0 et 255. Faisons donc quelques opérations pour analyser le fonctionnement de cette addition.

LD A,12 ;a=12
ADD A,15 ;a=12+15(a=27)

Jusque-là, pas de problème. Voyons la suite …

LD A,245 a=245
LD B,25 b=25
ADD A,B a=a+b (a='245+25 soit 270)

Mazette, par Krom, que vois-je ? Le résultat est supérieur à la valeur maximale qu'un registre peut contenir

Aurions-nous perdu le fruit de cette opération dans les méandres de notre microprocesseur ? Aïe et fines herbes. Que se passe-t-il donc? Rassurez-vous, cette addition n'a pas été effectuée en vain. Le Z80 dispose de ce qu'on nomme la retenue (Carry en anglais). Elle témoigne de tous les débordements éventuels des opérations sur les registres. Si nous reprenons l'exemple précédent, la retenue est mise à gauche de l'accumulateur. Ce registre reçoit donc un bit permettant de témoigner d'un quelconque décalage. Voici, pour vous éclairer, une situation similaire en base 10.

Si nous utilisons des variables décimales uniquement capables de stocker des valeurs de 0 à 99, toute opération du genre 99 + 99 engendrera un dépassement de capacité. Il nous faudra donc prévoir un petit container temporaire capable de stocker le 1 qui tombe. Le principe de la retenue est alors mis en œuvre.
C'est cette situation que nous retrouvons en Assembleur mis à part que les valeurs s'étendent de O à 255. Voici donc les résultats réellement obtenus lors d'une addition huit bits

Résultat=A+X

Si Résultat > 255 alors A=Résultat modulo 256, Carry=1 sinon A=Résultat, Carry=0.

Notez que X représentant un registre ou une valeur quelconque reste inchangé. Le modulo est, pour les novices, le reste d'une division entière de deux nombres (5 mod 2=1 soit 5-(5 2))
En ce qui nous concerne, pour l'exemple précédent, A vaudra 14, et la Carry 1. Il est possible d'intervenir sur la Carry (retenue que nous ne nommerons plus qu'ainsi) avec un jeu d'instructions suffisamment efficace. Ce sont les instructions de saut.

En voici une petite liste toute bête:

JR C,etiquette
JR NC,etiquette
JP C,etiquette
JP NC,etiquette

Que ce soit pour JP ou JR, le suffixe C signifie que le saut ne sera effectué que si la Carry est à 1, donc si un débordement, ou dépassement de capacité, a eu lieu.

L'utilisation du suffixe NC permet de ne sauter que si la Carry est vide donc que le dernier calcul s'est bien passé. Voici un exemple concret

LD A,250 ; A=250
ADD A,10 ; A=250+1O
JR NC,SUIT ; Si pas de Carry (NC) alors saut.
LD L,A ; Transfert de A dans
LD H,1 ; le double registre HL.
SUIT: ; ... Suite quelconque du programme.

Dans ce cas, le saut ne sera jamais effectué, car 250+10 provoque automatiquement un dépassement de capacité. Si, par opposition, vous utilisez des registres au lieu de valeurs fixes, il ne vous est a priori pas possible de savoir ce qui se passera. C'est en ce sens que le test de la retenue est utile. Il vous permettra d'exécuter des routines de détournement d'erreur ou des changements de contextes selon les résultats obtenus.

Notez encore que les instructions de saut telles que JP et JR seront vues plus tard.
En ce qui concerne la retenue, il en va de même pour les registres simples et pour les registres doubles. Toute addition entraînera la mise à 1 de la Carry si la capacité du registre est dépassée. Pour cela, sachez que la valeur stockage dans un registre double oscille entre O et 65535.

ADD HL,DE
JR C,ERREUR

Voilà qui clôt notre étude du mnémonique que ADD. Passons dès maintenant à sa petite sœur.

ASSEZ
D'ESSAIS

Apres l'addition conventionnelle, voici l'addition avec Carry. Elle permet, non seulement d'additionner deux opérandes, qui sont toujours HL et A, mais aussi d'ajouter au résultat le contenu de la retenue. Les mnémoniques sont les mêmes que pour ADD, mis à part pour les registres d'index IX et IY qui n'ont pas leur équivalent avec ADC. Cette instruction est dans le Z80 pour une simple compatibilité huit bits avec le jeu du 8080, ancêtre de notre microprocesseur. ADC, dans le cas de travaux sur seize bits alors que les registres doubles ne sont pas disponibles, peut rendre de grands services. Imaginons qu'on veuille additionner au registre double DE le mot contenu à l'adresse pointée par HL.

Voici le programme :

LD A,(HL) ; Chargement de l'octet de poids faible
INC HL ; et avance du pointeur.
ADD A,E ; Addition avec le poids faible de DE.
LD E,A ; Stockage du résultat intermédiaire.
LD A,(HL) ; Chargement du poids fort.
ADC A,D ; Addition avec le poids fort et prise
; en compte de la retenue du premier résultat.
LD D,A ; Sauvegarde du total.

Dans cet exemple, si une retenue a été générée lors de la première addition, elle sera prise en compte lors de la seconde.

Ça suffit pour le moment. Nous mettrons en pratique ces mnémoniques dans les prochains mois.
C'est ici que s'achève notre petit rendez-vous mensuel. Il va de soi que nous appliquerons tout ce que nous avons passé ici en revue. Il serait sympathique que vous nous écriviez pour nous dire ce que vous désirez effectivement faire avec l'Assembleur. Cela nous permettra de mieux orienter cette rubrique. Dans l'impatience de vous lire, nous vous adressons nos salutations les meilleures.

Sined, ACPC n°39 page 30-31

Page précédente : Bidouilles ACPC n°38 - Lecture sans AMSDOS

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

Lien(s):
» Coding » Bidouilles ACPC n°42 - La decompression
» Coding » Bidouilles ACPC n 04 - Le PSG (1/2)
» Coding » Assembleur ACPC n°14 - AS: ÇA C'EST COOL
» Coding » Assembleur ACPC n°23 - Il cours, il cours l'assembleur
» Coding » Assembleur ACPC n°45 - Le directeur rit ( Modification du catalogue AMSDOS )
» Coding » Bidouilles ACPC n°36 - Direct disk Access
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 254 millisecondes et consultée 2122 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.