2010-11-18 8 views
1

J'utilise le programme pcsim qui, selon moi, utilise MIPS. Je ne suis pas positif car je suis très nouveau dans le langage d'assemblage. J'ai besoin de multiplier deux nombres de 32 bits en utilisant seulement ajouter et déplacer et stocker le produit dans deux registres. Je l'ai obtenu où il va réussir à multiplier deux nombres si le résultat peut être stocké dans 32 bits. Le problème est que si le nombre est plus grand que cela, je ne peux pas comprendre comment combiner la moitié droite du produit avec la moitié gauche. Le registre de moitié gauche doit contenir des valeurs commençant à 2^32 tout le long. Si ce n'est pas clair, je peux essayer d'expliquer plus. Y a-t-il un moyen facile que je néglige pour accomplir ceci? Merci pour toute aide.Comment combiner deux registres 32 bits dans une réponse 64 bits?

Répondre

0

Il n'y a aucun moyen de "combiner" les deux moitiés dans un registre de 32 bits. Si vous souhaitez combiner les deux moitiés en une seule valeur de 64 bits en mémoire, vous devez stocker les deux moitiés les unes par rapport aux autres en fonction de l'endianess de votre machine. Si vous utilisez SPIM, il semble qu'il utilise le même principe que votre ordinateur hôte.

X86? Petit endian. Stockez la moitié inférieure en premier. PPC? Big endian. Stockez la moitié supérieure en premier.

1

Si j'ai bien compris, vous êtes au point où vous avez réellement besoin de faire de l'arithmétique 64 bits, n'est-ce pas? Si vous effectuez une multiplication longue binaire classique par décalage et ajout, vous pouvez créer des primitives de décalage et d'addition 64 bits à partir d'opérations 32 bits, puis utiliser la même méthode.

Voici quelques exemples en tant que fragments C (devrait être trivial à traduire en MIPS, si c'est ce que vous utilisez réellement). Je suppose que vous travaillez avec des nombres 32 bits non signés et que vous voulez des résultats 64 bits non signés.

décalage logique gauche 1 bit:

tmp = lo >> 31; /* top bit of lo to bottom bit of tmp, rest of tmp is 0 */ 
lo <<= 1; 
hi <<= 1; 
hi |= tmp; 

décalage logique à droite 1 bit:

tmp = hi << 31; /* bottom bit of hi to top bit of tmp, rest of tmp is 0 */ 
hi >>= 1; 
lo >>= 1; 
lo |= tmp; 

(en fait, vous pouvez remplacer les 1 et 31 avec n et (32 - n) de passer par un autre numéro de bits)

Ajout de 64 bits:

result_lo = a_lo + b_lo; 
result_hi = a_hi + b_hi; 
if (result_lo < a_lo) 
    result_hi++; 

(voir here pour plus de détails à ce sujet, avec une référence spécifique à MIPS). Une autre approche consiste à traiter chacune de vos entrées 32 bits comme une paire de «chiffres» de 16 bits; La multiplication de deux nombres de 16 bits donne au maximum un résultat de 32 bits. L'idée de base est comme ceci:

0x12345678 * 0x23456789 =  0x5678 * 0x6789 
          + ((0x1234 * 0x6789) << 16) 
          + ((0x5678 * 0x2345) << 16) 
          + ((0x1234 * 0x2345) << 32) 

(vous aurez toujours besoin de quelques ajouts 64 bits).

Questions connexes