MIPS中三个整数的乘法

时间:2014-07-09 09:49:45

标签: assembly mips multiplication

我想在MIPS中乘以三个整数。我的第一个想法是将第一个和第二个相乘,然后将结果与第三个相加(就像我用add一样)。但结果在HILOW中以64位给出。那么如何将它与第三个因子相乘呢?

并且: 32位整数* 32位整数= 64位整数。 (在理论上)会给出什么:

  

32位int * 32位int * 32位int = ??

96位? 128?

感谢您的提示。

1 个答案:

答案 0 :(得分:1)

将n位数与m位数相乘会产生(n + m)位数。 因此,将三个32位数相乘可生成96位乘积

假设三个数字是a,b和c,我们得到以下结果

  a*b  =   ABH*2³² + ABL
c(a*b) = c(ABH*2³² + ABL)
       = c*ABH*2³² + c*ABL
       = (CABH_H*2³² + CABH_L)*2³² + (CABL_H*2³² + CABL_L)
       = CABH_H*2⁶⁴ + (CABH_L + CABL_H)*2³² + CABL_L

其中H和L是结果的高低部分,分别存储在HI寄存器和LO寄存器中。这里乘以2 32 和2 64 的乘法将分别由左移32和64来代替。

所以在MIPS32中,如果a,b和c存储在$ s0,$ s1和$ s2中,我们可以进行如下算法

multu   $s0, $s1        # (HI, LO) = a*b
mfhi    $t0             # t0 = ABH
mflo    $t1             # t1 = ABL

multu   $s2, $t1        # (HI, LO) = c*ABL
mfhi    $t4             # t4 = CABL_H
mflo    $s7             # s7 = CABL_L

multu   $s2, $t0        # (HI, LO) = c*ABH
mfhi    $s5             # s5 = CABH_H
mflo    $t3             # t3 = CABH_L

addu    $s6, $t3, $t4   # s6 = CABH_L + CABL_H
sltu    $t5, $s6, $t3   # carry if s6 overflows
addu    $s5, $s5, $t5   # add carry to s5
# result = (s5 << 64) | (s6 << 32) | s7

结果存储在元组($ s5,$ s6,$ s7)

MIPS64中的事情会简单得多:

mul(unsigned int, unsigned int, unsigned int):
        multu   $4,$5
        dext    $6,$6,0,32
        mfhi    $3
        mflo    $2
        dins    $2,$3,32,32
        dmultu  $6,$2
        mflo    $3
        j       $31
        mfhi    $2

这是GCC on Godbolt

的一些示例装配输出

您可能需要对签名操作稍作修改