mips32 - 如何仅使用 shift 或 ori 将机器指令复制到寄存器?
问题描述
我一直在尝试自己学习汇编语言 (MIPS32),并且我一直在学习这个免费的在线课程来教授它。
有一个练习要求我仅使用 or、ori 和 shift 将 ori $8, $6, 0x20 复制到 $9。不幸的是,没有提供答案,我不知道该怎么做。有人可以帮助我或指出我正确的方向吗?谢谢你。
解决方案
首先,您必须检查用于ori
指令的格式:
0011 01ss ssst tttt iiii iiii iiii iiii
资料来源:MIPS 指令参考
sssss
目标寄存器是$8 = 01000
ttttt
源寄存器是$6 = 00110
ii...
直接操作数是0x20 = ...10 0000
生成的指令如下所示:
0011 01ss ssst tttt iiii iiii iiii iiii
0011 0101 0000 0110 0000 0000 0010 0000
我们将其转换为十六进制以在我们的代码中使用:0x35060020
由于ori
指令接受 16 位作为立即操作数,我们可以将其与简单的左移相结合,先用另一条指令填充高 16 位0x3506
,然后再将低 16 位添加到另一ori
条指令中。
ori $9, $0, 0x3506 # insert upper 16 bits of instruction
# 0000 0000 0000 0000 0011 0101 0000 0110
sll $9, $9, 0x10 # shift 16 bits to higher part of register
# 0011 0101 0000 0110 0000 0000 0000 0000
ori $9, $9, 0x0020 # insert lower 16 bits of instruction
# 0011 0101 0000 0110 0000 0000 0010 0000
推荐阅读
- docker - GitLab CI docker 构建失败
- html - 在 Github Pages 我的网站不显示照片
- excel - 将空白单元格返回为空白而不是 0 的索引公式
- string - 我如何在 unity2d 中消除这个讨厌的错误?
- java - 如何在自定义 JComponent 中正确实现 MouseInputListener
- jenkins - groovy.lang.MissingPropertyException:没有这样的属性:类的道具:groovy.lang.Binding
- concurrency - 无法识别死锁
- python - 如何将数据帧从长转换为宽,索引中的值按年份分组?
- stripe-payments - 在 Stripe 之外开具发票时,使用什么 Stripe webhook 来捕获订阅续订?
- laravel - Yajra Laravel Datatable 列排序和搜索在服务器端模式下不起作用