【问题标题】:How do I multiply two integers where one is larger than 32 bits in MIPS?如何将两个整数相乘,其中一个大于 MIPS 中的 32 位?
【发布时间】:2014-04-02 19:34:49
【问题描述】:

我有以下子程序,用于查找 $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

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    在阅读了本·杰克逊的回答后,我写了这个并用 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
    

    【讨论】:

    • 从你的回答中抄袭一些 MIPS 知识我更新了我的。
    【解决方案2】:

    记住你在学校里是如何在纸上乘以数字的。将您的输入分解为 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 加上第二个 mfhi 在第二个 mult 之后的进位,但我假设你在循环中并且这个上半部分将始终为 0。在其他字,连续的 32*64 被截断成 64 位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多