MIPS:访问数组的所有索引并将其打印出来

MIPS: Accessing all indexes of an array and printing it out

我正在尝试接受一些接受数组长度的用户输入,并且用户能够为该数组的每个索引分配数字,然后将其打印出来。 Java 我基本上想要做的代码是:

Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int[] array = new int[N];
    for (int i=0; i<N; i++) {
      array[i] = sc.nextInt();
    }

  

需要对索引进行缩放,做一个字节偏移量,然后与数组基地址一起使用。为什么?因为每个整数占用 4 个字节,而在内存中,这 4 个字节中的每一个都有自己的地址。数组中的下一个整数(例如 i+1)的起始地址比最后一个整数(例如 i)高 4。因此,我们按数组元素的大小缩放索引,以生成字节偏移量以访问数组的索引元素。

没有必要将 $v0 复制到 $s1,它将从 $v0.

存储到内存中

您已将循环从 Java 中的 for 循环更改为汇编中的 do-while,这意味着如果用户输入计数 0,它将在 Java 版本,但在汇编版本中中断,因为它仍然会要求至少一个输入。 Java 版本将遵循以下模式:

int i = 0;
while ( i < N ) {
    <for-loop-body>
    i++;
}

所以,循环测试,循环体,增量,循环测试,循环体,增量...

根据系统调用,看起来您正在使用 MARS 或 QtSpim,默认情况下它们都不使用分支延迟槽。我猜你正在为此选择选项?

将增量放在分支延迟槽中的方法也会比您预期的多循环一次:在Java版本中,增量将发生在之前[=32] =]循环退出测试,但是在汇编版本中,after.

从伪代码开始是一种非常好的方法 - 它通常提供相当清晰的内容,如果没有算法就很难从头开始编写汇编代码。但是您应该尽量按照字面意思来遵循您的伪代码,而不是在将其转换为汇编代码时进行任意更改。