MIPS: multiplicação e divisão inteiros

Então, estou a construir um programa de calculadoras em MIPS e estou a tentar escrever as funções multiplicar e dividir.

neste momento, leio nos inteiros num laço como este:

li $v0, 5
syscall

e depois, eventualmente, chamar as minhas funções multi e dividependendo da acção que o Utilizador quer fazer.

Então, assumindo que eu tenho os inteiros em $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

 14
Author: Connor Black, 2013-04-17

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
 26
Author: gusbro, 2020-12-04 20:04:02