2013-04-17 111 views
7

因此,我正在用MIPS构建一个计算器程序,我正在尝试编写乘法和除法函数。MIPS:整数乘法和除法

目前我在整数的循环中读取,像这样:

li $v0, 5 
syscall 

并最终调用我的函数multidivi取决于其操作的用户想要做的。

因此,假如我有在整数和$a0$a1,这将成为$a1繁殖$a0和/或通过$a1划分$a0一个干净的方式?我一直在网上四处寻找,但我无法找到一个清洁,简单的方法来做到这一点,因为我所得到的答案发送回$v0

+1

是不是有什么毛病'MULT'指令? – paxdiablo

+0

为什么不仅仅是分支,而是它是一个多重还是一个分裂? – rmmh

回答

16

倍增,使用mult为符号的乘法和multu无符号乘法。请注意,两个32位数相乘的结果产生一个64位数。如果您希望将结果返回到$ v0中,这意味着您认为结果将适合32位。

32最显著位将在HI特殊寄存器被保持(由mfhi指令可访问的)和32个最低显著位将在LO特殊寄存器被保持(由mflo指令访问):

例如:

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 

要划分,请使用div作为签名的划分,使用divu作为未签名的划分。在这种情况下,HI专用注册将持有提醒和LO专用注册将持有该科的商。

例如为:

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

之后。你如何将两个(hi和lo)合并成一个结果?如果我知道结果将适合32位寄存器? –

+4

@JohnDemetriou:如果你已经知道结果适合32位,那么你可以使用'mflo'检索低有效位。 – gusbro

+1

谢谢你的帮助非常有帮助 –