【问题标题】:How to multiply two numbers in MIPS which gives product that is larger than 32bits?如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?
【发布时间】:2019-03-31 13:00:16
【问题描述】:

实际上,我的任务是在 MIPS 中将两个 32 位数字相乘,然后生成 64 位的输出。据我了解,最不重要的 32 位将保存在“lo”寄存器中,其余的将保存在“hi”寄存器中。

当我将 100000 和 200000 相乘时,我在“lo”寄存器中得到 a817c800,在“hi”寄存器中得到 4

mult $t1, $t2 
    mflo $s0
    mfhi $s1 

【问题讨论】:

  • 你的问题是什么?

标签: assembly mips qtspim


【解决方案1】:

当我将 100000 和 200000 相乘时,我在“lo”寄存器中得到 a817c800,在“hi”寄存器中得到 4

正确。

因为结果是 64 位宽并且您使用的是 32 位 MIPS CPU,所以您需要两个寄存器来存储结果。

在您的代码中,高 32 位在 s1 中,低 32 位在 s0 中。所以s1s0这两个寄存器代表64位值4a817c800(十六进制),即20000000000(十进制)。这是正确的结果。

您的下一个问题可能是如何使用 qtspim 打印出 64 位数字。不幸的是,我没有使用 MIPS 模拟器的经验(仅使用真正的 MIPS CPU),所以我根本不知道这是否可能。

【讨论】:

  • SPIM 可以打印字符串,因此您始终可以编写自己的函数,但我认为只有内置支持打印有符号十进制整数(或浮点/双精度)。 MARS 有一些 SPIM 不支持的“扩展”系统调用 (courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html),包括用于打印十六进制。这将让您轻松打印 64 位整数的两半。 (对于未来的读者:16 是 2 的幂,因此低十六进制数字不依赖于数字的高位。但 10 不是,因此将两半分别打印为十进制是行不通的。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多