【问题标题】:Exercise in MIPS instructions在 MIPS 指令中练习
【发布时间】:2019-09-24 17:40:39
【问题描述】:

我是 MIPS 的新手,我们在课堂上做了一个练习,我们必须编写一系列 MIPS 指令,如果位在第七位(从寄存器 s0 的右边)为“1”(否则寄存器 s6 保持不变)。假设 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)

【问题讨论】:

  • 第一条指令不是andi吗?
  • 是的,这是一个错字。谢谢,已编辑。
  • 0x00400 不是第 9 位的适当位掩码检查。 0x00400 = 0000010000000000,这里很明显0x400 设置第 10 位(如果从 0 开始计数)。此代码是您提供的还是您想出的,因为根据您的要求,MIPS 指令不正确,如图所示。如果你能澄清这一点,我可以澄清这一切是如何运作的。
  • 旁注,0x00200 = 0000001000000000 将是对第 9 位的适当检查(同样,如果您从 0 开始计数,这很常见)。
  • @CaitLANJenner,你是对的,伪代码应该是s0[10]

标签: assembly mips


【解决方案1】:

要了解为什么要生成 MIPS 指令来实现您的伪代码,您必须首先了解按位运算的基础知识。在这种情况下,您正在处理Bitwise AND 操作。按位与是检查某些位是否已设置的好方法。这种检查通常涉及使用所谓的位掩码。位掩码利用布尔逻辑的标识属性。换句话说,任何与 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”(否则寄存器 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:

【讨论】:

  • 非常感谢!这是一个非常详细和详尽的答案!
【解决方案2】:

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

【讨论】:

  • 0x00400 不会是第 9 位。最初提供的 MIPS 说明有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多