2013-04-17 20 views
7

Tak więc buduję program kalkulacyjny w MIPS i staram się pisać funkcje mnożenia i dzielenia.MIPS: Integer Mnożenie i dzielenie

Obecnie czytam w całkowitych w pętli tak:

li $v0, 5 
syscall 

a następnie ostatecznie nazwać moje funkcje multi i divi zależności od działania, gdy użytkownik chce zrobić.

Więc zakładając Mam całkowite w $a0 i $a1, jaki byłby czysty sposób pomnożyć $a0 przez $a1 i/lub podzielić $a0 przez $a1? Szukałem wokół online, ale nie mogę znaleźć czyste i łatwy sposób to zrobić, bo muszę wysłać otrzymaną odpowiedź z powrotem w $v0

+1

Czy jest coś złego w 'instrukcją MULT'? – paxdiablo

+0

Dlaczego nie rozgałęziać, czy jest to pomnożenie, czy dzielenie? – rmmh

Odpowiedz

16

mnożyć, użyj mult dla podpisana mnożenia i multu dla unsigned mnożenia . Zwróć uwagę, że wynik pomnożenia dwóch liczb 32-bitowych daje liczbę 64. Jeśli chcesz, aby wynik powrócił w $ v0, oznacza to, że zakładasz, że wynik będzie pasował do 32 bitów.

32 najbardziej znaczących bitów odbędzie się w HI specjalnym rejestrze (dostępny przez mfhi instrukcji), a 32 najmniej znaczących bitów odbędzie się w LO specjalnym rejestrze (dostępny przez mflo instrukcji):

np

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 

Aby podzielić, należy użyć div dla podziału podpisu i divu dla podziału bez znaku. W takim przypadku specjalny rejestr będzie przechowywał przypomnienie, a specjalny rejestr będzie zawierał iloraz podziału.

Np .:

div $a0, $a1 
    mfhi $a2 # reminder to $a2 
    mflo $v0 # quotient to $v0 
+0

Po mult. Jak połączyć dwa (hi i lo) w jeden wynik? W przypadku, gdy wiem, wynik będzie pasował do rejestru 32-bitowego? –

+4

@JohnDemetriou: Jeśli wiesz już, że wynik mieści się w 32 bitach, możesz po prostu odzyskać mało znaczące bity, używając 'mflo' – gusbro

+1

Dzięki, że jesteś bardzo pomocny –