我必须手动解决MIPS乘法,我遇到了麻烦。
我有两个寄存器$8
,其中包含-1073741824的二进制补码表示(即2 ^ 30)和$9
的二进制补码+3,我需要找到这个的结果MIPS指令
mult $8, $9
我很丢失。我是否需要先将值转换为二进制补码,然后再使用二进制乘法?
答案 0 :(得分:8)
mult指令是两个32位寄存器的有符号乘法。它存储特殊(Hi,Lo)寄存器的结果,它结合了64位结果。对此的共鸣是,当您将两个32位值相乘时,结果可能太大而无法放入单个32位寄存器中。
如果练习的目标是手动处理1和0并自己进行乘法,那么是的,你可以这样做。但是你很可能会在那个位数很多的地方弄乱。
让我们看看我们是否可以使用一点扣除来了解结果首先应该是什么样的: 在二进制补码中,最重要的数字是符号:
看看你知道的操作,你的结果的最高位将是1.这意味着Hi寄存器的最高位将是1。
这说现在让我们看看我们正在成倍增加的值(我现在省略了这个符号,我们将回到那个):
2 30 x 3 = 2 30 x(2 1 + 2 0 )
= 2^31 + 2^30
我们现在将我们的乘法变成了一个更容易做到的加法。在这种情况下,该值的二进制表示在位32和31处为1或:
1100 0000 0000 0000 0000 0000 0000 0000
现在我们需要取这个值并将其转回负数表示但现在通过64位寄存器:所以64位正值看起来像:
0000 0000 0000 0000 0000 0000 0000 0000 1100 0000 0000 0000 0000 0000 0000 0000
二进制补码通过从具有相同位数(全1)的最大正数中减去正数然后在结果中加1来实现:
小规模的例子:
3 = 0011
-3 = 1111 - 0011 + 0001
making -3 = 1101
现在让我们将它应用于我们的64位值首先让我们从最大64位int值中扣除正结果:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
-0000 0000 0000 0000 0000 0000 0000 0000 1100 0000 0000 0000 0000 0000 0000 0000
=1111 1111 1111 1111 1111 1111 1111 1111 0011 1111 1111 1111 1111 1111 1111 1111
为该值添加一个:
1111 1111 1111 1111 1111 1111 1111 1111 0100 0000 0000 0000 0000 0000 0000 0000
所以操作后的寄存器将是:
Hi = 1111 1111 1111 1111 1111 1111 1111 1111
Lo = 0100 0000 0000 0000 0000 0000 0000 0000
答案 1 :(得分:1)
如果您想要成倍增加的数字,请使用:
mult $8, $9
如果它们是无符号的,只需使用无符号乘法指令:
multu $8, $9
乘法的结果将是64位整数,您可以使用mflo和mfhi指令访问此结果,如下所示:
MFLO $8
MFHI $9
答案 2 :(得分:0)
此问题的一些更一般的信息:
乘法和除法单元产生两个额外的结果 寄存器,你好。这些指令将值移入和移出这些值 寄存器。乘法,除法和余数伪指令 使该单元看起来在通用寄存器上运行 计算完成后的结果。
A-56:
mult rs,rt
Multiply寄存器rs和rt。将产品的低位字保留在寄存器lo中,将高位字保留在寄存器中。
资料来源:计算机组织与设计:硬件/软件界面(D. Patterson,J。Hennessy)
另见: