在 MIPS 中使用嵌套 For 循环和数组
Using Nested For Loops and an Array in 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 之外,所有寄存器都按照它们在我的程序中应有的方式更改值 - 它永远不会更改。
更改:数组需要声明,"pointed to" 由寄存器和标签不能以我开始的方式用于偏移
编辑:这是完成的工作代码
回顾评论中的答案
您的 $a3 寄存器应该加载 .data
部分中定义的数组地址。
代码的一个大问题是如何构建循环。最好的方法是一步一步地翻译你的循环,一次一个循环。另外,请记住:
for( i = 0; i < a; i++ )
{
loop_content;
}
相当于:
i = 0;
while( i < a )
{
loop_content;
i++;
}
在汇编中更容易翻译。条件只需要被否定,你需要一个 "exit" 条件,而不是 "continue" 条件,就像在 while
循环中一样。您的代码将更加清晰易懂(并且不易出错)。
您的 "out of range" 错误来自此处: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。[=22] =]
这是一项家庭作业,我自己编写了整个程序,运行 在调试器中通过它,一切都按照我的意思进行,除了这一行:
sw $t1, counter($a3)
作业是将这段 C 代码转换为 MIPS
for(i = 0; i < a; i++) {
for(j = 0; j < b; j++) {
C[2 * i] = i – j; } }
除了 $a3 之外,所有寄存器都按照它们在我的程序中应有的方式更改值 - 它永远不会更改。
更改:数组需要声明,"pointed to" 由寄存器和标签不能以我开始的方式用于偏移
编辑:这是完成的工作代码
回顾评论中的答案
您的 $a3 寄存器应该加载 .data
部分中定义的数组地址。
代码的一个大问题是如何构建循环。最好的方法是一步一步地翻译你的循环,一次一个循环。另外,请记住:
for( i = 0; i < a; i++ )
{
loop_content;
}
相当于:
i = 0;
while( i < a )
{
loop_content;
i++;
}
在汇编中更容易翻译。条件只需要被否定,你需要一个 "exit" 条件,而不是 "continue" 条件,就像在 while
循环中一样。您的代码将更加清晰易懂(并且不易出错)。
您的 "out of range" 错误来自此处: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。[=22] =]