2

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

所以我想我的主要问题是,“我如何将两个大于 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
4

2 回答 2

2

在阅读了 Ben Jackson 的答案后,我写了这篇文章并用 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
于 2012-11-27T15:49:38.063 回答
1

记住你在学校里是如何将纸上的数字相乘的。将您的输入分解为 16 位或 32 位组件,并将所有部分乘积相乘,然后将它们相加,注意进位链。

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

假设您在这里(从$a0$v0,v1)执行 32*64 位,您将得到 96 位结果。像这样的东西:

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

96 的高 32 位是第二个add加号mfhi之后的进位mult,但我假设你在循环中,这个上半部分将始终为 0。换句话说,连续的 32*64 被截断为 64 位。

于 2012-11-27T15:37:58.233 回答