MIPS调整位和循环?

MIPS调整位和循环?,mips,Mips,我是MIPS新手,对如何编写MIPS CAN感到困惑,因为有一个问题,我被要求将MIPS代码写入0xABCDABC0内存位置的脉冲位6,总共2*n+74次,假设n在$s1中 我不确定如何在给定地址访问特定位,我知道我必须使用或立即使用1专门打开位,然后使用1将位返回0。循环(没有乘法)我可以加$s2,$s1,$s1 然后再加上$s2,$s2,74,但如何循环呢 这里最简单的部分是编写循环,我可以帮你。我很生疏,但我会尽力让你开始的 循环可以通过临时值、添加立即值、分支指令和/或跳转指令来实现 您

我是MIPS新手,对如何编写MIPS CAN感到困惑,因为有一个问题,我被要求将MIPS代码写入0xABCDABC0内存位置的脉冲位6,总共2*n+74次,假设n在$s1中

我不确定如何在给定地址访问特定位,我知道我必须使用或立即使用1专门打开位,然后使用1将位返回0。循环(没有乘法)我可以加$s2,$s1,$s1
然后再加上$s2,$s2,74,但如何循环呢

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

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

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

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

       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中

    我在谷歌上搜索了一下,找到了一些合理的解释和这些说明的例子

    访问特定位需要使用一些位操作。特别是,我认为您会发现位移位和掩蔽非常有用。
    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;按位和

    --从我上面引用的来源

    我希望这足以回答你的问题,至少能让你继续这个问题。我不想把代码交给你,因为听起来像是家庭作业。如果有什么不清楚或需要澄清的地方,请说出来


    希望这些至少能对你有所帮助

    像翻转一样跳动?您可以在
    之间交替选择,在您感兴趣的位的位置使用0(…11011111-关闭)和
    在您感兴趣的位置使用1(…00100000-打开)。非常感谢Dylan S!我真的很感谢你帮助我对mips编码有了深刻的了解和更好的理解!我很高兴能帮上忙。