web-dev-qa-db-fra.com

MIPS: multiplication et division entières

Je construis donc un programme de calculatrice dans MIPS et j'essaie d'écrire les fonctions de multiplication et de division.

Actuellement, je lis les nombres entiers dans une boucle comme ceci:

li $v0, 5
syscall

et ensuite appeler mes fonctions multi et divi en fonction de l'action que l'utilisateur veut faire.

Donc, en supposant que j'ai les entiers dans $a0 et $a1, quelle serait une manière propre de multiplier $a0 par $a1 et/ou diviser $a0 par $a1? J'ai cherché en ligne mais je ne trouve pas de moyen propre et facile de le faire, car je dois renvoyer la réponse résultante dans $v0

11
Connor Black

Pour multiplier, utilisez mult pour la multiplication signée et multu pour la multiplication non signée. Notez que le résultat de la multiplication de deux nombres 32 bits donne un nombre 64. Si vous voulez que le résultat revienne dans $ v0, cela signifie que vous supposez que le résultat tiendra sur 32 bits.

Les 32 bits les plus significatifs seront conservés dans le registre spécial HI (accessible par l'instruction mfhi) et les 32 bits les moins significatifs seront conservés dans le registre spécial LO (accessible par mflo instruction):

Par exemple.:

  li $a0, 5
  li $a1, 3
  mult $a0, $a1
  mfhi $a2 # 32 most significant bits of multiplication to $a2
  mflo $v0 # 32 least significant bits of multiplication to $v0

Pour diviser, utilisez div pour la division signée et divu pour la division non signée. Dans ce cas, HI registre spécial contiendra le rappel et LO registre spécial contiendra le quotient de la division.

Par exemple.:

  div $a0, $a1
  mfhi $a2 # reminder to $a2
  mflo $v0 # quotient to $v0
20
gusbro