Prob simple en assembleur

Fermé
mimi - 7 mars 2001 à 17:44
Bouddha Messages postés 4 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 mars 2001 - 10 mars 2001 à 16:52
Soient 2 nbres entiers non-signés sur 16 bits. Pour effectuer leur multiplication, il n'est pas nécesaire d'utiliser l'instruction MUL, a condition de décomposer un des 2 facteurs en puissances de 2.
Ex : 147 * 73 = 128 * 73 + 16 * 73 + 2* 73 + 1 * 73

La question est : Comment faire un prog en assembleur qui effectue ce type de multiplication (sans utiliser MUL !), et qui donnera en résultat un entier en 32 bits

1 réponse

Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 209
7 mars 2001 à 18:40
La multiplication en binaire s'effectue comme en décimal, et d'autant plus simple que les chiffres possibles du multiplicateur sont "1" (on tient compte de la valeur) et "0" (on n'en tient pas compte, et on décale à gauche du nombre de "0" ; en décimal, on met des ".").
Application :
---------------- 1 0 0 1 0 0 1 1 = 147
---------------- 0 1 0 0 1 0 0 1 = 73
----------------------------------
---------------- 1 0 0 1 0 0 1 1 (a)
-------- + 1 0 0 1 0 0 1 1 - - - <== shift gauche 3 positions
----------------------------------
---------- 1 0 1 0 0 1 0 1 0 1 1 (b)
-+ 1 0 0 1 0 0 1 1 - - - - - - <== shift gauche 6 positions
----------------------------------
---- 1 0 1 0 0 1 1 1 1 0 1 0 1 1 (c) = 10731

Les résultats (a), (b), (c) sont les cumuls (accumulateur initialisé à 0) obtenus à chaque "1" du multiplicateur).
C'est de cette manière que fonctionne le circuit "hard" pour la multiplication d'entiers.
0
Bouddha Messages postés 4 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 mars 2001
7 mars 2001 à 19:03
Ah, ok, je comprends déjà mieux...
Mais on me demande une sortie en 32 bits...
Comment agencer ces instructions et quel en est le nbre pour que le prog soit optimisé ?
0
Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 209 > Bouddha Messages postés 4 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 mars 2001
8 mars 2001 à 11:35
Désolé, mes connaissances en assembleur(s) sont des plus réduites. Il est toutefois évident que le résultat de la multiplication de 2 nombres de 16 bits peut donner un nombre de 32 bits (2 registres consécutifs). L'algorithme est de la forme :
- faire A = 0
- boucle i de 0 à 15
si bit_multiplicateur[0] = 1 alors
décaler à gauche de "i" positions le multiplicande
cumuler dans A
fin_si
- fin_boucle
0
Bouddha Messages postés 4 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 mars 2001 > Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006
8 mars 2001 à 11:59
Un grand merci
0
Bouddha Messages postés 4 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 mars 2001 > Bouddha Messages postés 4 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 mars 2001
10 mars 2001 à 16:52
J'ai lu le tutoriel disponible sur ce site et il est très bien fait !
Maintenant, quand je regarde ton algorithme, je comprends mieux mais je ne sais pas quelles instructions utiliser en pratique.
C'est la boucle qui me dérange surtout...
C'est la mise en forme qui me pose des problèmes également
Si toi ou qqn d'autre ^pourrait m'en dire encore plus, ce serait vraiment sympa
0