【问题标题】:Binary 2's complement multiplication by hand?二进制2的补码乘法?
【发布时间】:2011-06-11 19:05:43
【问题描述】:

我必须手动解决 MIPS 乘法问题。

我有两个寄存器,$8 的二进制补码表示为 -1073741824(即 2^30),$9 的二进制补码为 +3,我需要找到这条 MIPS 指令的结果

mult $8, $9

我很迷茫。是否需要先将值转换为二进制补码,然后再使用二进制乘法?

【问题讨论】:

    标签: binary mips multiplication twos-complement


    【解决方案1】:

    mult 指令是两个 32 位寄存器的有符号乘法。它将结果存储在特殊的 (Hi,Lo) 寄存器中,该寄存器组合为您提供 64 位结果。这样做的原因是,当您将两个 32 位值相乘时,结果可能会太大而无法放入单个 32 位寄存器中。

    如果练习的目标是手动处理 1 和 0 并自己进行乘法运算,那么是的,您可以这样做。但是,您很可能会在某个地方弄乱这么多数字。

    让我们看看我们是否可以先用一点推论来了解结果应该是什么样子: 在二进制补码中,最重要的数字是符号:

    • 0 表示 +
    • 1 表示 -

    看一下你就知道结果的最高有效位将为 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
    

    【讨论】:

    • 这看起来是一个正确的答案。我想根据我的书(Patterson-Hennessy)补充一点,不只有一个实现。例如,由于价格下降和半导体尺寸减小,旧计算机使用单个加法器 (ALU),运行 32 次,而新计算机展开循环并使用 32 个加法器。只要它得到正确的结果,那么我认为它是 MIPS ISA 的正确实现。每个制造商和每个模型可能有不同的实现,但它们都履行了指令集的契约。
    【解决方案2】:

    如果您要相乘的数字是有符号的,则使用:

    mult $8, $9
    

    如果它们是无符号的,只需使用无符号乘法指令:

    multu $8, $9
    

    乘法的结果将是一个 64 位整数,您可以使用 mflo 和 mfhi 指令访问此结果,如下所示:

    MFLO $8
    MFHI $9
    

    【讨论】:

    • 感谢您的帮助,但实际上我必须用笔和纸手工完成...有什么帮助吗?
    【解决方案3】:

    这个问题的一些更一般的信息:

    乘法和除法单元产生两个额外的结果 寄存器,你好,你好。这些指令将值移入和移出这些 寄存器。乘法、除法和余数伪指令 使本机看起来对通用寄存器进行操作 计算完成后的结果。

    A-56:

    多 rs, rt

    寄存器 rs 和 rt 相乘。将乘积的低位字留在寄存器 lo 中,将高位字留在寄存器 hi 中。

    来源:计算机组织和设计:硬件/软件接口(D. Patterson,J. Hennessy)

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 2012-09-21
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多