MIPS乘法

dra*_*kie 2 mips

我必须手动解决MIPS乘法,我遇到了麻烦.

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

mult $8, $9
Run Code Online (Sandbox Code Playgroud)

我很丢失.我是否需要先将值转换为二进制补码然后再使用二进制乘法?

Rob*_*Rob 8

mult指令是两个32位寄存器的有符号乘法.它存储特殊(Hi,Lo)寄存器的结果,它结合了64位结果.对此的共振是,当您将两个32位值相乘时,结果可能太大而无法放入单个32位寄存器中.

如果练习的目标是手动处理1和0并自己进行乘法,那么是的,你可以做到.但是你很可能会在那个位数很多的地方弄乱.

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

  • 0表示+
  • 1表示 -

看看你知道的操作,你的结果的最高位将是1.这意味着Hi寄存器的最高位将是1.

这说现在让我们看看我们正在成倍增加的值(我现在省略了这个符号,我们将回到那个):

2 30 x 3 = 2 30 x(2 1 + 2 0)

     = 2^31 + 2^30
Run Code Online (Sandbox Code Playgroud)

我们现在把我们的乘法变成了一个更容易做到的加法.在这种情况下,该值的二进制表示在位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
Run Code Online (Sandbox Code Playgroud)

现在让我们将它应用于我们的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
Run Code Online (Sandbox Code Playgroud)

在该值中添加一个使得:

1111 1111 1111 1111 1111 1111 1111 1111 0100 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

所以操作后的寄存器将是:

Hi = 1111 1111 1111 1111 1111 1111 1111 1111 
Lo = 0100 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)