mips - 将 $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
解决方案
当然MULT
可以用来乘以$a0
16,结果可以放入$v0
。这比使用复杂得多SLL
。如您所见,SLL
这只是完成整个任务的一项操作。使用MULT
,您还必须加载一个带有 16 的寄存器(显然不是 4 )并$LO
从中读取结果(您忘记了)。使用伪指令执行任何操作,例如LI
或MOVE
可能违反使用“本机 MIPS 指令”的要求。伪指令会使它看起来更短,MUL
因为您不必从 lo 移动或将 16 放入寄存器,但它是一个扩展为同一事物的宏,并且可能再次违反使用“本机 MIPS”的要求指示”。还MULT
本身通常不是单周期操作,这已经是一般避免它的理由(当然它有它的用途)。
SLL $v0, $a0, 4
是整体上最好的解决方案。这是一个单一的、快速的指令,无需额外的东西就可以实现任务。
但是,还有其他可能性MULT
,例如使用ADDU
实现 shift-left-by-1 然后使用它四次。
此外,设置此类问题的一个教学原因是让您思考实际任务是什么以及如何完成它,而不是尽可能将需求转译为代码。
推荐阅读
- javascript - 如何仅在第一个用户交互时延迟加载 js 文件?
- node.js - 输入命令清除 npm 缓存 ```sudo npm cache clean -f``` 后出错
- ios - Swift getting index out of range error in Tableview while searching and scrolling result
- javascript - 如何通过一次提交发送多个数据?
- okhttp - 如何通过 okhttp3 builder 上传输入流格式?安卓Q
- axios - 即使 axios 返回 201,hapi 也会返回 500 错误
- wordpress - Wordpress:从帖子中删除上一个/下一个链接
- python - 在括号之前或之后添加空格 - Python
- c++ - C++ 函数返回两个 char 数组的相同索引元素
- c++ - 更新 Windows 10 1903 后 C++ 组件性能下降