2016-11-08 5 views
0

J'ai une question concernant l'instruction MULU. Une chose que j'ai remarquée est que supposons que j'ai la valeur 000FFFFF dans un registre de données. Et puis supposons que je veux mettre dans un autre F pour qu'il contienne 00FFFFFF. Ce que je fais habituellement est de multiplier le registre de données par 16 comme ceci:68000 Assemblage: Multiplier donne un résultat bizarre

MULU #16, D4 

Et puis j'ajouter une autre F en faisant instruction ADD (si je reçois 00FFFFFF). Mais quand je me suis à nouveau multiplié sur 000FFFFF, tous les bits dans le registre de données finissent par aller à zéro (00000000). Après cette multiplication, j'aurai 000FFFF0, et le reste suivra. Je ne comprends toujours pas la raison de ceci. J'ai regardé this example et je pense que ça devrait marcher. J'ai également remarqué que les bits Extend, Carry et Zero vont tous à true si j'ajoute simplement 1 à 000FFFFF

+2

Qu'est-ce que _ « Mais quand je multipliai à nouveau sur 000FFFFF » _ signifier? Montrez-nous la séquence exacte des instructions. Aussi, pourquoi ne pas simplement déplacer à gauche par 4 au lieu de multiplier par 16? – Michael

+0

Vous avez raison. Je n'aurais pas dû utiliser la multiplication. Au lieu de changer de gauche à 4 est une bonne solution. Problème résolu. –

Répondre

1

Ne pas utiliser la multiplication. Au lieu de cela, utilisez LSL.L # 4, (registre) et cela donnera le résultat nécessaire d'une bien meilleure façon.

0

Je crois que la raison de ce résultat est due à la limitation du multiplicateur dans le 68000. IlRC ne peut traiter que des valeurs de 16 bits, et donc lorsque vous commencez à traiter des valeurs au-delà, vous obtenez ce type de résultat. Ce que d'autres ont déclaré est de loin le moyen le plus efficace de multiplier par une valeur avec une puissance de 2 (décalage vers la gauche). La même chose est vraie pour la division, en ce sens qu'un changement de droite divisera effectivement la valeur.

En outre, si vous travaillez avec des valeurs signées, assurez-vous d'utiliser Arithmétique Quarts de travail plutôt que des logiques de préserver le signe (en particulier pour la division :))

+0

C'est vrai. Faire ce genre de multiplication donne un résultat de 32 bits. –