我必须手动解决 MIPS 乘法问题,但我遇到了麻烦。
我有两个寄存器,$8
其中包含 -1073741824 的二进制补码表示(即 2^30)并且$9
二进制补码为 +3,我需要找到此 MIPS 指令的结果
mult $8, $9
我很迷茫。我是否需要先将值转换为二进制补码然后使用二进制乘法?
我必须手动解决 MIPS 乘法问题,但我遇到了麻烦。
我有两个寄存器,$8
其中包含 -1073741824 的二进制补码表示(即 2^30)并且$9
二进制补码为 +3,我需要找到此 MIPS 指令的结果
mult $8, $9
我很迷茫。我是否需要先将值转换为二进制补码然后使用二进制乘法?
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)的最大正数中减去正数,然后将结果加一:
较小规模的示例:
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
如果要乘以的数字已签名,请使用:
mult $8, $9
如果它们是无符号的,只需使用无符号乘法指令:
multu $8, $9
乘法的结果将是一个 64 位整数,您可以使用 mflo 和 mfhi 指令访问此结果,如下所示:
MFLO $8
MFHI $9
这个问题的一些更一般的信息:
乘除单元在两个附加寄存器 hi 和 lo 中产生结果。这些指令将值移入和移出这些寄存器。使该单元看起来对通用寄存器进行操作的乘法、除法和余数伪指令在计算完成后移动结果。
A-56:
多重 rs, rt
将寄存器 rs 和 rt 相乘。将乘积的低位字留在寄存器 lo 中,将高位字留在寄存器 hi 中。
资料来源:计算机组织和设计:硬件/软件接口 (D. Patterson, J. Hennessy)
也可以看看: