完整的32x32 => 64位乘法结果的两半是什么?

时间:2019-04-02 01:02:07

标签: assembly mips long-integer mars-simulator

我是汇编和MIPS的新手。我有一个算法,将两个32位数字相乘,得到一个64位数字。我将结果分成两个不同的寄存器,对于MIPS来说太大了。

您能帮我解释一下存储在上下寄存器中的两个不同数字吗?

Results

1 个答案:

答案 0 :(得分:1)

昨天,我们有a related question on this site

一个64位数字将存储在两个寄存器中,因为一个寄存器只有32位。

数学背景

您可能会想象一台不是以二进制而是以十进制计算的计算机(或BCD-就像1960年代的某些计算机那样),并且寄存器可以存储3个十进制数字。

在这种情况下,数字123456(十进制)将被存储为123(在一个寄存器中)和456(在另一个寄存器中)。

不幸的是,不同的基地表现不同:

Decimal  Hexadecimal
099      063
355      163
160      0A0
260      104

您可以看到,在数字99和355(十进制)之间,十六进制只有一位数字的差异,而十进制则是全部3位数字的差异。

对于数字160和260(十进制),恰恰相反。

这意味着:如果我们要将上面示例中的数字123456转换为十六进制,则不能先将数字123和456转换为十六进制,但是在转换之前,我们必须将数字123456作为完整数字:< / p>

Decimal    Hexadecimal
   123        7B
   456       1C8
123456     1E240 (does neither contain 7-B nor 1-C-8)

如果寄存器是3位宽的倍数,则该规则的例外例如是“ binary <->八进制”,如果寄存器是4位宽的倍数,则是“ binary <->十六进制”,或者是“八进制<-” >十六进制”,如果寄存器的宽度是12位(或4个八进制或3个十六进制数字)的倍数:

Octal      Hexadecimal
1234       29C
5670       BB8
12345670   29CBB8

这就是为什么十六进制在低级程序员中如此流行的原因!

立即返回您的程序

MIPS寄存器中存储的值是二进制而不是十进制。您有兴趣将整个64位数字打印为十进制。

因此,问题与我们对十六进制结果感兴趣的十进制计算机的示例相同:

  • 计算机对于两个寄存器中的一个寄存器存储的值太大
  • 我们希望在另一个基准中查看结果,因为计算机正在使用该基准
  • 首先分别转换两个寄存器将无济于事(请参见示例123456-> 1E240),但我们必须取整数并进行转换

但是,数字266201827和768509613是分别转换为十进制的两个寄存器!