MIPS调整位和循环?

时间:2013-10-12 05:47:03

标签: mips

我是MIPS的新手,我很困惑如何编写mips可能会出现一个特定的问题,这个问题是我被要求在0xABCDABC0的内存位置写入mips代码到脉冲位6的总共2 * n + 74次,假设n是$ s1。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

       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

    我用Google搜索了一点,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;按位AND

    - 从上面引用的来源

    我希望这足以回答你的问题,至少让你解决问题。我不想只是把代码递给你,因为它听起来像是家庭作业。如果有任何不清楚或需要澄清的话,请说出来。

    希望至少有一部分可以帮助你!