0

我是 MIPS 的新手,并且对如何编写 mips 感到困惑,因为某个问题给出了我被要求在 0xABCDABC0 的内存位置编写 mips 代码以脉冲位 6 总共 2*n +74 次并假设 n 在 $s1 中。

我不确定如何处理访问给定地址的特定位,我知道我必须使用或立即使用 1 专门打开该位,然后使用它将该位转回 0 1. 循环(没有乘法) 我可以添加 $s2, $s1, $s1 然后添加 $s2, $s2,74 但是你如何循环呢?

4

1 回答 1

2

这里最简单的部分是编写循环,我可以帮你。我很生疏,但我会尽力让你开始。

循环可以通过临时值、添加立即值、分支指令和/或跳转指令来实现。

您正在寻找的基本流程听起来像:

  1. 创建一个计数变量(例如 for (int i=..; i < ...; i++) 中的 i 部分)
  2. 标记循环的开始指令(如下所示) label_name:循环指令
  3. 执行循环指令
  4. 从步骤 1 增加循环变量
  5. 用 2*n+74 填充 $s2 (这就是你现在拥有的部分)
  6. 如果您的计数器不等于所需的迭代计数,则跳转到循环的开头 注意:如果您有足够的循环指令,则可能必须使用更复杂的分支/跳转构造。

示例循环代码:

   andi $t1, $t1, 0 # set a counter variable to 0 (t1)
loop:
   # do some work - whatever you want to accomplish by looping
   addi $t1, $t1, 1 # increment the counter
   add  $s2, $s1, $s1  # this is the code you devised
   addi $s2, $s2, 74
   bne  $s2, $t1, loop #branch to the beginning of the loop if you need more iterations

您需要的下一部分是在内存地址获取一个值,有几种方法可以解决这个问题。您应该查看 MIPS 中可用的加载/存储指令。特别是,我认为您会想要使用 lw(加载字)指令。

lw r1, label -> 将存储在 'label' 中的地址处的内存中的字加载到寄存器 r1

我用谷歌搜索了一下,http://pages.cs.wisc.edu/~cs354-2/cs354/karen.notes/MAL.instructions.html有一些合理的解释和这些说明的例子。

访问特定位需要使用一些位操作。特别是,我认为您会发现位移和掩码很有帮助。
MIPS 提供了一些您可能喜欢的说明:

sll d, s1, s2 d = s1 逻辑左移 s2 位

sra d, s1, s2 d = s1 算术右移 s2 位

srl d, s1, s2 d = s1 逻辑右移 s2 位

和 d, s1, s2 d = s1 & s2; 按位与

- 来自我上面引用的来源

我希望这足以回答您的问题,并且至少可以让您继续解决问题。我不想只是把代码交给你,因为这听起来像是家庭作业。如果有任何不清楚或需要澄清的地方,请直说。

希望至少其中的一些对您有所帮助!

于 2013-10-12T06:22:55.717 回答