将$ a0(整数)乘以16的MIPS

时间:2018-07-31 11:05:35

标签: mips multiplication

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

问题:

  

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

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

我的解决方案

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

1 个答案:

答案 0 :(得分:2)

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

SLL $v0, $a0, 4

是整体上最好的解决方案。这是一条快速的指令,无需额外的内容即可实现任务。

虽然没有MULT,但还有其他可能性,例如使用ADDU实现左移1倍移位,然后使用四次。

设置这样的问题的一个教学原因是,让您考虑实际的任务是什么以及如何完成任务,而不是将要求尽可能地转换为代码。