如何在MIPS中将一个大于32位的两个整数相乘?

时间:2012-11-27 15:32:51

标签: assembly mips

我有以下子程序,用于查找$ a0到$ a1的幂。它适用于小整数,但我希望它适用于1000 ^ 6之类的东西。我想如果我在$ v1中存储乘法的hi寄存器。

所以我想我的主要问题是,“如何将一个大于32位的两个整数相乘?”

pow:
  li    $v0, 1
pow_loop:
  ble   $a1, $zero, pow_conclude
  mult  $v0, $a0
  mflo  $v0
  addi  $a1, $a1, -1
  j     pow_loop
pow_conclude:
  jr    $ra

2 个答案:

答案 0 :(得分:2)

在阅读了本杰克逊的回答之后,我写了这个并用MARS检查了它。

pow:
  li    $v0, 1
  li    $v1, 0
pow_loop:
  ble   $a1, $zero, pow_conclude
  mult  $v1, $a0
  mflo  $v1
  mult  $v0, $a0
  mflo  $v0
  mfhi  $t0
  add   $v1, $v1, $t0
  addi  $a1, $a1, -1
  j     pow_loop
pow_conclude:
  jr    $ra

答案 1 :(得分:1)

记住你在学校如何将数字相乘。将您的输入分解为16位或32位组件,并将所有部分产品相乘并将它们加在一起,从而注意进位链。

不知道MIPS,但基于@ russjohnson09的自我回答:

假设您在此处执行32 * 64位(来自$a0$v0,v1),您将获得96位结果。像这样:

  mult  $v0, $a0
  mflo  $v0
  mfhi  $v2
  mult  $v1, $a0
  mflo  $v1
  add   $v1,$v1,$v2

96的高32位是第add之后的mfhimult的进位,但我假设你处于循环中,这个上半部分将是永远为0.换句话说,连续32 * 64截断为64位。