首页 > 解决方案 > 将 $a0(整数)乘以 16 的 MIPS

问题描述

我试图弄清楚下面的代码是如何工作的,并且很乐意接受我能得到的任何帮助。问题(带有解决方案)发布在下面,我不明白他们为什么使用sll而不是mult(我会)。我也发布了我的代码,但我认为它是错误的。

问题:

使用本机 MIPS 指令(移位、加法、减法等)实现(编码)将 $a0(整数)乘以 16 的操作(函数)。结果应存储在 $v0 中。您可以使用 $t0、$t1、$t2 作为报废寄存器。

他们的解决方案:sll $v0, $a0, 4 0

我的解决方案

li $a0, 4
li $vo, 0
mult $a0, $a1

标签: mipsmultiplication

解决方案


当然MULT可以用来乘以$a016,结果可以放入$v0。这比使用复杂得多SLL。如您所见,SLL这只是完成整个任务的一项操作。使用MULT,您还必须加载一个带有 16 的寄存器(显然不是 4 )并$LO从中读取结果(您忘记了)。使用伪指令执行任何操作,例如LIMOVE可能违反使用“本机 MIPS 指令”的要求。伪指令会使它看起来更短,MUL因为您不必从 lo 移动或将 16 放入寄存器,但它是一个扩展为同一事物的宏,并且可能再次违反使用“本机 MIPS”的要求指示”。还MULT本身通常不是单周期操作,这已经是一般避免它的理由(当然它有它的用途)。

SLL $v0, $a0, 4

是整体上最好的解决方案。这是一个单一的、快速的指令,无需额外的东西就可以实现任务。

但是,还有其他可能性MULT,例如使用ADDU实现 shift-left-by-1 然后使用它四次。

此外,设置此类问题的一个教学原因是让您思考实际任务是什么以及如何完成它,而不是尽可能将需求转译为代码。


推荐阅读