首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bits操作MiPS组件

Bits操作MiPS组件
EN

Stack Overflow用户
提问于 2017-03-13 10:22:42
回答 1查看 3.9K关注 0票数 1

该程序获取用户输入密钥,从该密钥中提取最右边的5位,然后替换位2到6之间的那些位。

这就是我尝试过的。

代码语言:javascript
运行
复制
lw $s1, 0($s0)               # extracts the first word in the array
beq $s1, $zero, done         # at the end of the array is a zero => 0


move $t1, $s2                 #s2 has the input key
move $t0, $s1                 # put the word in a temporary register
andi $t2, $t1, 0x0000001f     # use the input mask to return the rightmost 5 bits

sll $t3, $t2, 2               # move the bits over to align with bits 2-6

andi $t0, $t3, 0xffffff83

因此,我的想法是采用输入键,使用andi $t2,$t1,0x0000001f提取5位,然后将逻辑左移2位,将提取的5位与位2到6对齐。

这就是我被卡住的地方。如何替换从用户输入密钥中取出的位,并将它们放在位位置2到6中?第二个andi的输入掩码我相信是正确的,但我不认为我使用了正确的寄存器。

编辑:感谢您的回复。我通过提供的建议找到了解决方案。对于任何有类似问题的人:

我去掉了底部的andi。并且为了避免提供完整的答案,数据字中需要被替换的位将必须用输入掩码来修改。这可以使用不同的andi指令来完成。还有几个步骤,但这至少应该为未来的任何人指明正确的方向。

EN

回答 1

Stack Overflow用户

发布于 2017-03-13 10:55:17

“替换”位是通过将两个值组合成一个值来完成的。对于可以使用的and/or/xor,共享的原则是以这样的方式准备源/目标值,即最终的合成将产生所需的结果。

从源s向目标d复制b1-b3位的4位值示例

or/xor/add变体(保留最后一位,清除其他位):

代码语言:javascript
运行
复制
s = 0101 => and 0xE => 0100 => `or/xor/add` to `d`
d = 1100 => and 0x1 => 0000     => 0100

and变体(保留最后一位,设置其他位):

代码语言:javascript
运行
复制
s = 0101 => or 0x1 => 0101 => `and` to `d`
d = 1100 => or 0xE => 1110     => 0100

请注意0xE = ~0x1 (因此,在寄存器中清除的位将保留在另一个寄存器中,反之亦然)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42755704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档