我试图弄清楚下面的代码是如何工作的,并且很乐意接受我所能获得的任何帮助。问题(带有解决方案)发布在下面,我不明白为什么他们使用sll
而不使用mult
(我会这样做)。我也发布了代码,但我认为这是错误的。
问题:
使用本机MIPS指令(移位,加法,减号等)执行(代码)将$ a0(整数)乘以16的操作(函数)。结果应存储在$ v0中。您可以使用$ t0,$ t1,$ t2作为报废寄存器。
他们的解决方案:sll $v0, $a0, 4 0
我的解决方案:
li $a0, 4
li $vo, 0
mult $a0, $a1
答案 0 :(得分:2)
当然,MULT
可用于将$a0
乘以16,结果可放入$v0
中。但是,这比使用SLL
要复杂得多。如您所见,使用SLL
可以完成整个任务。使用MULT
,您还必须加载一个16的寄存器(显然不是4),然后从$LO
中读取结果(您忘记了)。使用诸如LI
或MOVE
之类的伪指令执行任何上述操作可能会违反使用“本机MIPS指令”的要求。 MUL
伪指令会使外观看起来更短,因为您不必从LO中移出或将16放入寄存器中,但这是一个宏,它可以扩展为同一事物,并且可能再次违反要求使用“本机MIPS指令”。同样,MULT
本身通常也不是单周期操作,这已经是通常避免使用它的原因(当然它有其用途)。
SLL $v0, $a0, 4
是整体上最好的解决方案。这是一条快速的指令,无需额外的内容即可实现任务。
虽然没有MULT
,但还有其他可能性,例如使用ADDU
实现左移1倍移位,然后使用四次。
设置这样的问题的一个教学原因是,让您考虑实际的任务是什么以及如何完成任务,而不是将要求尽可能地转换为代码。