首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS指令练习

MIPS指令练习
EN

Stack Overflow用户
提问于 2019-09-24 17:40:39
回答 2查看 327关注 0票数 1

我是MIPS的新手,我们在课堂上做了一个练习,如果寄存器s6 s0的第七个位置(从右边)的位是"1“(否则寄存器s6保持不变),那么我们必须编写一系列MIPS指令,将值"-1”写入到MIPS寄存器。假定s0的前16位都是零。

供参考(如有错误):

伪码:

代码语言:javascript
复制
if(s0[10]==1)
  s6 <- -1:

MIPS指令:

代码语言:javascript
复制
andi $t1, $s0, 0x0040
beq $t1, $0, END_IF
addi $s6, $0, -1

我真的不明白为什么我们要考虑s0[9],以及我们是如何得到MIPS指令的。有人能详细解释一下它的工作原理吗?我被告知,我们必须做一个“面具”,以看看是否有一点在登记簿,但目前还不太清楚。

编辑:if(s0[9]==1) -> if(s0[10]==1)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-24 18:18:23

要理解为实现伪代码而产生MIPS指令的原因,您必须首先了解按位操作的基本知识。在本例中,您处理的是一个按位和操作。是一种很好的方式来检查是否设置了某些位。这样的检查通常涉及使用所谓的位掩码。位掩码利用布尔逻辑的恒等属性。换句话说,任何位和a 1都保留了它的值,而任何位和0的结果都是零。考虑以下几个例子:

代码语言:javascript
复制
      01000
(AND) 11000
      -----
      01000


      01010
(AND) 11111
      -----
      01010


      01010
(AND) 00000
      -----
      00000

注意位掩码11111如何保留第一个操作数的原始值,而位掩码00000总是导致00000

现在把这个应用到你的问题上。如果您想要检查是否设置了一个特定的位,比如位于最右边的第11位,那么您可以创建一个位掩码,其中第11位设置为1,其余位设置为零。例如,从十六进制到二进制,我们有:

代码语言:javascript
复制
0x400 = 0000010000000000

请注意,在十六进制值0x400中,最右边位置的第11位设置为1。记住,这只是当我们从1开始计数的时候。

把一切都放在一起。为了检查$s0[10] == 1 (第11位),我们知道我们可以使用十六进制值0x400和一个按位和。如果设置了第11位,则$s0 AND 0x400的结果将导致非零值。否则,结果为零。现在让我们理解MIPS代码。

代码语言:javascript
复制
andi $t1, $s0, 0x00400  ; perform the AND and store the result in $t1
beq $t1, $0, END_IF     ; if $t1 is zero, then the 11th bit must not have been set. BRANCH past the following instruction!
addi $s6, $0, -1        ; Ah! We didn't take the branch so the 11th bit was set, so assign -1 to $s6
END_IF:

希望这能澄清你所看到的。

备注--这是您最初的请求:“如果寄存器s0的第七个位置(从右边)的位为"1”,则“编写一系列写入值的MIPS指令"-1”(否则寄存器s6将保持不变)。

我们可以使用与上面相同的逻辑,但我们需要一个不同的位掩码。从右边检查第7位的位掩码看起来像0x40 = 01000000在这里,我们必须小心根据措辞。右边的第7位意味着我们没有从零开始计数。,所以如果我们编辑位掩码,我们实际上可以使用与以前完全相同的算法。

代码语言:javascript
复制
andi $t1, $s0, 0x40     ; perform the AND and store the result in $t1
beq $t1, $0, END_IF     ; if $t1 is zero, then the 7th bit must not have been set. BRANCH past the following instruction!
addi $s6, $0, -1        ; Ah! We didn't take the branch so the 7th bit was set, so assign -1 to $s6
END_IF:
票数 1
EN

Stack Overflow用户

发布于 2019-09-24 17:50:21

MIPS变成更多的人工指令:

代码语言:javascript
复制
$t1 = $s0 bitand 0x00400   # note that 0x00400 is the 10th bit set, so anding s0 against that will give a number that is either 0, or 0x00400 if the 10th bit was set)
if $t1 == 0 -> goto endif
else  $s6 = -1

因此,如果没有设置第10位,转到endif,否则设置s6

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

https://stackoverflow.com/questions/58085635

复制
相关文章

相似问题

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