我是MIPS的新手,我们在课堂上做了一个练习,如果寄存器s6 s0的第七个位置(从右边)的位是"1“(否则寄存器s6保持不变),那么我们必须编写一系列MIPS指令,将值"-1”写入到MIPS寄存器。假定s0的前16位都是零。
供参考(如有错误):
伪码:
if(s0[10]==1)
s6 <- -1:MIPS指令:
andi $t1, $s0, 0x0040
beq $t1, $0, END_IF
addi $s6, $0, -1我真的不明白为什么我们要考虑s0[9],以及我们是如何得到MIPS指令的。有人能详细解释一下它的工作原理吗?我被告知,我们必须做一个“面具”,以看看是否有一点在登记簿,但目前还不太清楚。
编辑:if(s0[9]==1) -> if(s0[10]==1)
发布于 2019-09-24 18:18:23
要理解为实现伪代码而产生MIPS指令的原因,您必须首先了解按位操作的基本知识。在本例中,您处理的是一个按位和操作。是一种很好的方式来检查是否设置了某些位。这样的检查通常涉及使用所谓的位掩码。位掩码利用布尔逻辑的恒等属性。换句话说,任何位和a 1都保留了它的值,而任何位和0的结果都是零。考虑以下几个例子:
01000
(AND) 11000
-----
01000
01010
(AND) 11111
-----
01010
01010
(AND) 00000
-----
00000注意位掩码11111如何保留第一个操作数的原始值,而位掩码00000总是导致00000。
现在把这个应用到你的问题上。如果您想要检查是否设置了一个特定的位,比如位于最右边的第11位,那么您可以创建一个位掩码,其中第11位设置为1,其余位设置为零。例如,从十六进制到二进制,我们有:
0x400 = 0000010000000000请注意,在十六进制值0x400中,最右边位置的第11位设置为1。记住,这只是当我们从1开始计数的时候。
把一切都放在一起。为了检查$s0[10] == 1 (第11位),我们知道我们可以使用十六进制值0x400和一个按位和。如果设置了第11位,则$s0 AND 0x400的结果将导致非零值。否则,结果为零。现在让我们理解MIPS代码。
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位意味着我们没有从零开始计数。,所以如果我们编辑位掩码,我们实际上可以使用与以前完全相同的算法。
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:发布于 2019-09-24 17:50:21
MIPS变成更多的人工指令:
$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
https://stackoverflow.com/questions/58085635
复制相似问题