CODING ★ La multiplication et la division en Z80 ★

Assembleur ACPC n°46 - La multiplication et la division

L'ASSEMBLEUR ET LES MATHEMATIQUES

La meilleure manière de planter un programmeur débutant en assembleur Z80 est de lui demander de réaliser quelques calculs tels que la multiplication ou la division de registres. Mais avec un peu d'expérience, on s'aperçoit que cela n'est pas si compliqué. Commençons tout de suite.

Avant de programmer quoi que ce soit, il faut essayer de bien comprendre le principe à mettre en œuvre. Cela permet de posséder parfaitement le sujet et de ne pas être arrêté par quelques broutilles du type :

« Qu'est-ce que je voulais faire déjà ? ». Riez à gorge déployée, mais rappelez-vous ces quelques fois où vous avez passé des heures à tenter de retrouver une forme de manipulation qui semblait à la base si simple. Un programme est bien plus facile à écrire lorsqu'il est totalement pensé. Le fait de faire des collages et du rafistolage sur des routines ne fait que mettre en péril la stabilité du programme. Les seules choses engendrées seront dans ce cas ennuis et bugs capilotractés, pour reprendre ce fantastique terme de feu Pierre Desproges, que je vous conseille forte; ment de lire par ailleurs.

COMPTER SUR SOI

Pour bien comprendre le fonctionnement d'une opération, il faut avant tout l'assimiler. Travaillons en base dix, puisque c'est celle que nous connaissons le mieux. Voyons donc comment cela se passe lorsque nous faisons une mutiplication. Imaginons que nous multiplions 34 par 12. Analysons ce qui se passe. La valeur 34 est multipliée par deux, ce qui nous donne un résultat commun de 68. Puis, il faut passer à la seconde partie de l'opération qui consiste à multiplier par une puissance de notre base de calcul. Dans notre cas, 1~ cela revient donc à décaler 34 àgauche, ce qui nous donne 340, puis à le multiplier par l'opérande. Si nous avons dit décaler plutôt que multiplier, c'est pour mieux nous rapprocher du concept de langage machine. Quelle que soit la base numérique utilisée, le fait de décaler un nombre à gauche revient à le multiplier par la base active.

BE NEAR

En langage machine, ou en assembleur, nous travaillons fréquemment en base deux. Dans certains cas, c'est tout à fait transparent. En ce qui concerne la multiplication, tout devient clair lorsque nous utilisons cette propriété. Voici l'algorithme d'un petit programme de multiplication.

Nous disposons de trois valeurs le multiplicateur, l'opérande et le résultat.

  • Avant tout, nous forçons le résultat à zéro.
  • Le décalage à droite du multiplicateur permet de récupérer dans la retenue le poids du bit de droite.
  • Si ce bit vaut 1, alors nous additionnons l'opérande au résultat, sinon, nous ne le faisons pas.
  • Comme nous devons multiplier l'opérande par la base numérique active (base 2), nous décalons l'opérande à gauche.

Ces opérations faites huit fois ou tant que le multiplicateur est différent de zéro permettent de mener à bien notre multiplication. Notez que nous n'avons fait que suivre à la lettre la théorie de la multiplication.
A titre d'exemple, nous allons commenter ce texte à l'aide du petit listing que voici.

ORG $9000

EXEC $
LD DE,34
LD A,12
MULTI
LD HL,0
TSTACCU
;SRL A
JR NC,PASSADD
ADD HL,DE
PASSADD
;SLA E
RL D
OR A
JR NZ,TSTACCU
RET

HL contient le résultat, DE l'opérande et A le multiplicateur. En TSTACCU, nous pesons le bit de droite et influençons éventuellement le résultat. En PASADD, nous décalons l'opérande à gauche pour le faire monter d'une puissance et nous testons enfin le multiplicateur pour vérifier qu'il est bien différent de zéro.
Comme vous pouvez le constater, un petit programme bien pensé évite de se prendre le chou lorsqu'il faut passer à l'assembleur. Il suffit de traduire bêtement le principe sans se fouler. Notez que pour des raisons de simplicité, l'opérande et le multiplicateur sont traités sur huit bits et le résultat sur seize. Rien ne vous empêche de multiplier par deux ces capacités en gérant des registres seize bits pour les premières. valeurs et un pseudo trente deux bits pour le résultat.

DIVISER POUR MIEUX REGNER

Le fait de programmer la multiplication nous a permis d'entrevoir un principe fondamental du langage machine. Lorsque nous programmons en base 2, toute opération arithmétique n utilisera que des additions à un niveau puisqu'un bit ne peut représenter que zéro ou une seule fois une valeur quelconque Disons que nous allons diviser 132 par 12. Normalement, nous positionnons le 12 sous le 13 et nous pensons : « Il a combien de fois 12 dans 13 ? » . Une fois , bien sûr et il reste 1 ( même que c'est 10 puisque nous avons décalé 12 à gauche). Nous additionnons cette retenue au 2 qui reste et il y va encore une fois Le résultat total est donc 11.

DU LANGAGE AUX MACHINES

Dans le cas précis de I'application de cette théorie à un microprocesseur, il n'y aura qu'une simple différence de manipulation des nombres. Au lieu de décaler le diviseur vers la gauche, c'est e dividende que nous décalerons à droite. Cela est simplement dû au fait que nous ne saurons pas où placer le diviseur alors que son compère se positionnera de lui-même. Voici donc le principe exprimé sous forme d'algorithme.

Le dividende de travail est annulé pour être ensuite décalé.

Nous décalons le dividende de travail à gauche en y faisant glisser un bit du dividende réel.

Nous soustrayons le diviseur au dividende de travail. Si la retenue est positionnée, cela signifie que le diviseur est plus grand que le dividende et il y va donc zéro fois. Dans le cas contraire, il y va une fois. Nous décalons donc l'inverse de la retenue dans le résultat. S'il y allait zéro fois, alors nous restituerions le dividende de travail. Lorsque nous effectuons ces opérations seize fois (il y a seize bits dans un mot machine), nous arrivons à réaliser une division binaire. Le reste de la division, soit son modulo, est dans le dividende de travail.

EXTRAPOLATIONS PROGRAMMEES

L'algorithme exposé ci-dessus, si vous le programmez, n'est pas bien compliqué à comprendre. Il fonctionne parfaitement sur le papier. Seulement voilà, il utilise un grand nombre de registres seize bits. Il nous faudra donc nous servir de zones temporaires que nous nommerons variables mémoires.

Prenons notre exemple, qui peut être grandement amélioré dans la programmation, mais peu dans le principe. Les registres théoriques de travail sont organisés comme suit HL est le dividende de travail, DE est le diviseur et AC est le dividende réel. B nous sert simplement de compteur permettant de réaliser seize fois la boucle. Il est certain que nous aurions pu utiliser les doubles registres IX et IY, mais nous vous laissons le choix de parfaire cette routine comme bon vous semble. Au regard des explications exposées ci-dessus, la compréhension du listing accompagné de ses remarques n'est pas bien compliquée. DECALE force le décalage du dividende réel dans celui de travail et suit ensuite la modification du résultat selon le principe de l'inverse de la retenue. Tracez la routine et vous comprendrez mieux qui se passe. Notez que vous devrez regarder les nombres en binaire et non en hexadécimal, sans quoi toutes vos réflexions seront vouées à l'échec.

LE BIT VOUS ACCOMPAGNE

Sacrée programmation binaire. Il va sans dire que ce type de réflexion prend un peu le chou mais le résultat est là tout se fait tout seul. Décalages, retenues et j'en passe, sont les mamelles de la programmation en assembleur.

Alors tétons en cœur...

Sined multiviseur, ACPC n°46 jan93 , page 26-27

Page précédente : Bidouilles ACPC n°45 - Les vecteurs system

★ 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°33 - Formatage de bronze
» Coding » Bidouilles ACPC n°20 - Déviation du Ctrl Shift Esc.....
» Coding » Assembleur ACPC n°29 - On assemble ensemble
» Coding » Bidouilles ACPC n°37 - Gestion de la matrice de caractere
» Coding » Assembleur ACPC n°16: Organisation des pixels à l'écran
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 308 millisecondes et consultée 2315 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.