MIPS: multiplicação e divisão inteiros
neste momento, leio nos inteiros num laço como este:
li $v0, 5
syscall
e depois, eventualmente, chamar as minhas funções multi
e divi
dependendo da acção que o Utilizador quer fazer.
$a0
e $a1
, Qual seria uma maneira limpa de multiplicar $a0
por $a1
e/ou dividir $a0
por $a1
? Tenho andado a dar uma vista de olhos. on-line, mas eu não posso encontrar uma maneira limpa e fácil de fazer isso, porque eu tenho que enviar a resposta resultante de volta em $v0
1 answers
Para multiplicar, utilizar mult
para multiplicação assinada e multu
para multiplicação sem sinal. Note que o resultado da multiplicação de dois números de 32 bits produz um número de 64. Se você quer o resultado de volta em $v0
Isso significa que você assume que o resultado irá caber em 32 bits.
Os 32 bits mais significativos serão mantidos no registo especial HI
(acessível pela instrução mfhi
) e os 32 bits menos significativos serão mantidos no registo especial LO
(acessível pela mflo
Instruções:
Por exemplo:
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
Para dividir, use {[9] } para a divisão assinada e {[10] } para a divisão não assinada. Neste caso, o registo especial HI
deterá o restante e o registo especial LO
deterá o quociente da divisão.
Por exemplo:
div $a0, $a1
mfhi $a2 # remainder to $a2
mflo $v0 # quotient to $v0