★ 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
et même Avant de poursuivre, voici la liste de toutes les instructions d'additions exploitables. Additions huit bits
Additions seize bits
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. 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.
Jusque-là, pas de problème. Voyons la suite …
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. 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 voici une petite liste toute bête:
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
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.
Voilà qui clôt notre étude du mnémonique que ADD. Passons dès maintenant à sa petite sœur. ASSEZ 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 :
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.
|