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

C 在MIPS中使用嵌套For循环和数组,c,arrays,assembly,mips,C,Arrays,Assembly,Mips,这是一个家庭作业,我自己编写了整个程序,在调试器中运行,所有内容都按照我的意思进行,除了这一行: sw$t1,计数器($a3) 任务是将这段C代码转换为MIPS for(i = 0; i < a; i++) { for(j = 0; j < b; j++) { C[2 * i] = i – j; } } (i=0;i

这是一个家庭作业,我自己编写了整个程序,在调试器中运行,所有内容都按照我的意思进行,除了这一行:

sw$t1,计数器($a3)

任务是将这段C代码转换为MIPS

    for(i = 0; i < a; i++) {
       for(j = 0; j < b; j++) {
          C[2 * i] = i – j; } }
(i=0;i{ 对于(j=0;j 除了$a3之外,所有寄存器都会以我的程序中应有的方式更改值-它从不更改

更改:需要由寄存器和标签声明和“指向”的数组不能像我开始时那样用于偏移量

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


从评论中重述答案

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

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

for( i = 0; i < a; i++ )
{
    loop_content;
}
(i=0;i { 循环内容; } 相当于:

i = 0;
while( i < a )
{
    loop_content;
    i++;
}
i=0;
而(i
这在汇编中更容易翻译。条件必须被否定,你需要一个“退出”条件,而不是像
while
循环那样的“继续”条件。您的代码将更加清晰和易于理解(并且不容易出错)

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


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

为什么您希望$a3发生变化?它应该是数组的地址,因此不应更改。实际上我不明白你的问题是什么。@ElderBug我正试图在$a3的每个索引中存储I-j的结果,所以我不应该看到$a3寄存器值空间中出现一些值吗?我不知道如何更好地解释我自己,我的火星编译器的截图会有帮助吗?我可以告诉你我在看什么如果你有一行
sw$t1,x($a3)
x=8,t1的值将存储在$a3[2](数组的第三个整数,用$a3表示)。如果不是这样,那么该行永远不会执行。我不确定MIPS语法,但声明它应该类似于
myarray:.space 40
,共10个单词。如果我没弄错的话,那么你必须将地址加载到$a3中,使用
la$a3,myarray
。实际上,你在这一点上是对的,我忘了你以后会使用
I-1
。无论如何,你的循环仍然是错误的。试着在翻译
的同时翻译
,这非常简单。只需翻译
所做的,同时
一步一步地做。唯一不直接的一点是,当您需要“退出”条件时,条件是“继续”条件(但恰恰相反)。一次翻译一个循环,即使你有重复的标签也没关系。你是男人,这很有道理,我对发生的事情有更好的理解。稍后将发布经过修改、完善的代码以供参考,请告诉我是否可以做些什么来提高效率或“更干净”。再次感谢