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
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