我是 MIPS 的新手,并且对如何编写 mips 感到困惑,因为某个问题给出了我被要求在 0xABCDABC0 的内存位置编写 mips 代码以脉冲位 6 总共 2*n +74 次并假设 n 在 $s1 中。
我不确定如何处理访问给定地址的特定位,我知道我必须使用或立即使用 1 专门打开该位,然后使用它将该位转回 0 1. 循环(没有乘法) 我可以添加 $s2, $s1, $s1 然后添加 $s2, $s2,74 但是你如何循环呢?
我是 MIPS 的新手,并且对如何编写 mips 感到困惑,因为某个问题给出了我被要求在 0xABCDABC0 的内存位置编写 mips 代码以脉冲位 6 总共 2*n +74 次并假设 n 在 $s1 中。
我不确定如何处理访问给定地址的特定位,我知道我必须使用或立即使用 1 专门打开该位,然后使用它将该位转回 0 1. 循环(没有乘法) 我可以添加 $s2, $s1, $s1 然后添加 $s2, $s2,74 但是你如何循环呢?
这里最简单的部分是编写循环,我可以帮你。我很生疏,但我会尽力让你开始。
循环可以通过临时值、添加立即值、分支指令和/或跳转指令来实现。
您正在寻找的基本流程听起来像:
示例循环代码:
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; 按位与
- 来自我上面引用的来源
我希望这足以回答您的问题,并且至少可以让您继续解决问题。我不想只是把代码交给你,因为这听起来像是家庭作业。如果有任何不清楚或需要澄清的地方,请直说。
希望至少其中的一些对您有所帮助!