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
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.
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).
- 1. diviser 64bit en deux registres 32 bits par 32bit
- 2. Xcode & 64 bits & 32 bits Question
- 3. Comment "concaténer" deux int de 32 bits pour obtenir une longueur de 64 bits en Python?
- 4. L'iPhone OS 64 bits ou 32 bits?
- 5. Lecteur Flash 32 bits dans Safari 64 bits: comment?
- 6. quel mysql 32/64 bits
- 7. Comment utiliser Watin 64 bits avec MSIE 32 bits
- 8. Chargement d'un processus 32 bits dans un environnement 64 bits
- 9. Détection d'un jre 64 bits dans un navigateur 32 bits?
- 10. Charger la bibliothèque DLL 32 bits dans l'application 64 bits
- 11. Comment utiliser deux entiers 32 bits en tant que 64 bits dans C?
- 12. Application java 64 bits à utiliser 32 bits dll
- 13. Solr - utilise Java 64 bits, pas Java 32 bits sous Windows 7 64 bits
- 14. Pilote OLE DB 32 bits sur Windows 64 bits 7
- 15. Détection du mode 32 bits sur IIS 64 bits
- 16. debunits nunit en 64 bits, l'application est en 32 bits
- 17. Impossible d'exécuter les applications 32 bits sur Linux 64 bits
- 18. directive C# pour indiquer 32 bits ou 64 bits construire
- 19. Enregistrer 32 bits COM DLL à 64 bits Windows 7
- 20. Déplacement d'une application de 32 bits à 64 bits
- 21. Serveur 32 bits Com sur système 64 bits
- 22. Macintosh Python: problèmes 64 bits vs 32 bits
- 23. Appels ioctl de l'application 32 bits au pilote 64 bits
- 24. Version .NET avec des assemblages 64 bits et 32 bits
- 25. Traiter le code 32 bits sur Snow Leopard 64 bits?
- 26. MapViewOfFile partagé entre les processus 32 bits et 64 bits
- 27. Appel code 32 bits à partir de 64 bits Processus
- 28. Passage du pointeur 32 bits au contrôle COM 64 bits
- 29. SHGetFolderPath() 32 bits par rapport à 64 bits
- 30. conversion implicite raccourcit 64 bits à 32 bits