【发布时间】:2011-06-11 19:05:43
【问题描述】:
我必须手动解决 MIPS 乘法问题。
我有两个寄存器,$8 的二进制补码表示为 -1073741824(即 2^30),$9 的二进制补码为 +3,我需要找到这条 MIPS 指令的结果
mult $8, $9
我很迷茫。是否需要先将值转换为二进制补码,然后再使用二进制乘法?
【问题讨论】:
标签: binary mips multiplication twos-complement
我必须手动解决 MIPS 乘法问题。
我有两个寄存器,$8 的二进制补码表示为 -1073741824(即 2^30),$9 的二进制补码为 +3,我需要找到这条 MIPS 指令的结果
mult $8, $9
我很迷茫。是否需要先将值转换为二进制补码,然后再使用二进制乘法?
【问题讨论】:
标签: binary mips multiplication twos-complement
mult 指令是两个 32 位寄存器的有符号乘法。它将结果存储在特殊的 (Hi,Lo) 寄存器中,该寄存器组合为您提供 64 位结果。这样做的原因是,当您将两个 32 位值相乘时,结果可能会太大而无法放入单个 32 位寄存器中。
如果练习的目标是手动处理 1 和 0 并自己进行乘法运算,那么是的,您可以这样做。但是,您很可能会在某个地方弄乱这么多数字。
让我们看看我们是否可以先用一点推论来了解结果应该是什么样子: 在二进制补码中,最重要的数字是符号:
看一下你就知道结果的最高有效位将为 1 的操作。这意味着 Hi 寄存器的最高位将为 1。
这就是说,现在让我们看看我们正在相乘的值(我现在省略了符号,我们会回到那个):
230 x 3 = 230 x (21 + 20)
= 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
【讨论】:
这个问题的一些更一般的信息:
乘法和除法单元产生两个额外的结果 寄存器,你好,你好。这些指令将值移入和移出这些 寄存器。乘法、除法和余数伪指令 使本机看起来对通用寄存器进行操作 计算完成后的结果。
A-56:
多 rs, rt
寄存器 rs 和 rt 相乘。将乘积的低位字留在寄存器 lo 中,将高位字留在寄存器 hi 中。
来源:计算机组织和设计:硬件/软件接口(D. Patterson,J. Hennessy)
另见:
【讨论】: