Dus ik ben een rekenprogramma aan het bouwen in MIPS en ik probeer de functies voor vermenigvuldigen en delen te schrijven.
Momenteel lees ik de gehele getallen in een lus als volgt:
li $v0, 5
syscall
en dan uiteindelijk mijn functies multi
en divi
aanroepen, afhankelijk van welke actie de gebruiker wil doen.
Dus aangenomen dat ik de gehele getallen in $a0
en $a1
heb, wat zou dan een schone manier zijn om $a0
te vermenigvuldigen met $a1
en/of $a0
delen door $a1
? Ik heb online rondgekeken, maar ik kan geen schone en gemakkelijke manier vinden om dit te doen, omdat ik het resulterende antwoord terug moet sturen in $v0
Antwoord 1, autoriteit 100%
Gebruik om te vermenigvuldigen mult
voor vermenigvuldiging met teken en multu
voor vermenigvuldiging zonder teken. Merk op dat het resultaat van de vermenigvuldiging van twee 32-bits getallen een 64-getal oplevert. Als je het resultaat terug wilt in $v0
, dan betekent dat dat je ervan uitgaat dat het resultaat in 32 bits past.
De 32 meest significante bits worden vastgehouden in het speciale register HI
(toegankelijk via de instructie mfhi
) en de 32 minst significante bits worden vastgehouden in de LO
speciaal register (toegankelijk via de mflo
instructie):
Bijvoorbeeld:
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
Gebruik div
voor getekende splitsingen en divu
voor ongetekende splitsingen om te splitsen. In dit geval zal het speciale register HI
de rest bevatten en het speciale register LO
het quotiënt van de deling.
Bijvoorbeeld:
div $a0, $a1
mfhi $a2 # remainder to $a2
mflo $v0 # quotient to $v0