【问题标题】:MIPS instructions to extract a field from a register从寄存器中提取字段的 MIPS 指令
【发布时间】:2016-09-08 09:59:50
【问题描述】:

对于这个位域提取问题,解决方案手册中的答案似乎是错误的。我的问题发布在下面。


设置如下:

提出的问题是:

找出最短的 MIPS 指令序列来提取一个 来自 $t0 的字段,用于常量值 i = 22 和 j = 5,并将该字段放入 $t1 格式如数据表所示。

解决方案手册给出了这个答案:

lui $t1, 0x003f
ori $t1, $t0, 0xffe0
and $t1, $t0, $t1
srl $t1, $t1, 5

我有两个问题:

  1. 右边的零。这个建议的答案如何确保寄存器 $t1 中“字段”右侧的所有位都为零?
  2. 逻辑右移。最后一条指令不应该是sll $t1, $t1, 10吗?

【问题讨论】:

  • 2.是的,我认为它需要以左移结束才能将字段放在寄存器的顶部。一种简单的方法是将字段右移到底部,然后左移到顶部。除非移位指令在 MIPS 上真的很慢,否则两个移位应该比 4 个指令好。
  • 谢谢,这正是我在检查解决方案之前的回答。也感谢您的编辑。

标签: assembly bit-manipulation mips cpu-registers mips32


【解决方案1】:

很明显,解决方案手册中的答案并不理想。

  1. 右边的零。这个提议的答案如何确保所有 寄存器 $t1 中“字段”右侧的位全为零?

通过andi 和sll 的正确组合,我们可以将需要归零的所有位归零。

  1. 逻辑右移。最后一条指令不应该是 sll 改为 $t1, $t1, 10?

很明显,这应该是sll 操作而不是srl 操作。

【讨论】:

  • 我觉得回答自己的问题很有趣,所以如果我违反了任何礼仪,请告诉我。
  • 如果您在其他人之前找到解决方案,我们鼓励 OP 回答您自己的问题。此外,您可能使用不同的方法针对问题的不同部分获得了多个答案。因此,如果 5 位响应者各提供 20%,请给他们投票,然后发布您自己的综合答案 [归因很好]。如果一个答案是 90% 赞成并接受它。支持其他好的答案。这里 90% 下的评论就足够了,可能会详细说明您添加的内容。大多数问题没有得到自我回答,主要是因为他们从别人那里得到了很好的答案。这主要是为了避免冗余。
  • 对于简单(r)的东西,您可以编辑您的问题,并将更改的代码追加到底部。 从不编辑原始代码——它会改变问题的性质并使响应无效(即它们不再有意义)。如果你愿意,你可以这样做。再次,判断电话
  • 谢谢,这真的很有帮助!下次我必须这样做时,我会记住这些。
  • 编写格式精美的答案来解释解决方案是使其对未来读者有用的好方法。即使 cmets 帮助您弄清楚答案是什么,也完全可以。很高兴您接受了我的评论并将其变成了一个写得很好的答案,因为我不打算花时间这样做。编写和格式化答案是一项需要时间的有用工作,因此您当然会为此受到赞誉。如果您只是复制/粘贴评论而不增加任何价值,您可以回答“社区 wiki”以避免获得荣誉,但这里不是这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多