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

标签 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; } }

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

更改:需要由寄存器声明和“指向”的数组,并且标签不能以我开始的方式用于偏移

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

Finished

最佳答案

回顾评论中的答案

您的 $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。

关于c - 在 MIPS 中使用嵌套 For 循环和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471555/

相关文章:

c - c中的不同输出

c - MPI 数据类型对齐

php - 基于共同的列值将两个数组组合成一个数组

arrays - 使用 $addToSet Mongo 运算符添加多个值

c - 在 C 中计算数组中字符串元素数量的正确方法

c - K&R 似乎更喜欢预增量

javascript - 如何快速缩放javascript中的二维数组?

linux - 等待按键 组装 NASM,Linux

assembly - “PUSH”指令的操作可以用其他指令执行吗?

c - 对操作系统内核链接的 undefined reference