在MIPS中使用嵌套for循环和数组

时间:2015-02-12 07:21:21

标签: c arrays assembly mips

这是一个家庭作业,我自己编写了整个程序,在调试器中运行它,并且除了这条线之外,所有内容都是我的意思:

sw $t1, counter($a3)

分配是将这段C代码转换为MIPS

    for(i = 0; i < a; i++) {
       for(j = 0; j < b; j++) {
          C[2 * i] = i – j; } }

除了$ a3之外,所有寄存器都会以我们程序中的方式更改值 - 它永远不会改变。

更改:需要声明一个数组并且&#34;指向&#34;通过寄存器和标签不能以我用

开头的方式用于偏移

编辑:这是完成的工作代码

Finished

1 个答案:

答案 0 :(得分:2)

回顾评论中的回答

您的$ a3寄存器应该加载.data部分中定义的数组的地址。

代码的一个大问题是如何构建循环。最好的方法是逐步翻译循环,一次循环一次。另外,请记住:

for( i = 0; i < a; i++ )
{
    loop_content;
}

相当于:

i = 0;
while( i < a )
{
    loop_content;
    i++;
}

在汇编中更容易翻译。这个条件必须被否定,你需要一个“退出”条件,而不是while循环中的“继续”条件。您的代码将更清晰,更易于理解(并且更不容易出错)。

您的“超出范围”错误来自此处:sw $t1, counter($a3)。这里counter是一个标签,因此是一个地址。因此counter($a3)正在做“$ a3(= 0x10010008)+计数器地址(= 0x100100f8)”,给出0x20020100,这显然不是你想要的(和无意义的)。

哦,在sw $r, offset($a) MIPS指令中,offset必须是16位常数。在这里,您使用的是32位地址,但只是汇编程序将sw $t1, counter($a3)转换为$x = $a3 + counter; sw $t1, 0($x),这就是为什么您可能会看到sw为0的偏移量。