如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?
Posted
技术标签:
【中文标题】如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?【英文标题】:How to multiply two numbers in MIPS which gives product that is larger than 32bits? 【发布时间】: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
【问题讨论】:
你的问题是什么? 【参考方案1】:当我将 100000 和 200000 相乘时,我在“lo”寄存器中得到 a817c800,在“hi”寄存器中得到 4
正确。
因为结果是 64 位宽并且您使用的是 32 位 MIPS CPU,所以您需要两个寄存器来存储结果。
在您的代码中,高 32 位在 s1
中,低 32 位在 s0
中。所以s1
和s0
这两个寄存器代表64位值4a817c800(十六进制),即20000000000(十进制)。这是正确的结果。
您的下一个问题可能是如何使用 qtspim 打印出 64 位数字。不幸的是,我没有使用 MIPS 模拟器的经验(仅使用真正的 MIPS CPU),所以我根本不知道这是否可能。
【讨论】:
SPIM 可以打印字符串,因此您始终可以编写自己的函数,但我认为只有内置支持打印有符号十进制整数(或浮点/双精度)。 MARS 有一些 SPIM 不支持的“扩展”系统调用 (courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html),包括用于打印十六进制。这将让您轻松打印 64 位整数的两半。 (对于未来的读者:16 是 2 的幂,因此低十六进制数字不依赖于数字的高位。但 10 不是,因此将两半分别打印为十进制是行不通的。)以上是关于如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?的主要内容,如果未能解决你的问题,请参考以下文章