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.
从伪代码开始是一种非常好的方法 - 它通常提供相当清晰的内容,如果没有算法就很难从头开始编写汇编代码。但是您应该尽量按照字面意思来遵循您的伪代码,而不是在将其转换为汇编代码时进行任意更改。
我正在尝试接受一些接受数组长度的用户输入,并且用户能够为该数组的每个索引分配数字,然后将其打印出来。 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.
从伪代码开始是一种非常好的方法 - 它通常提供相当清晰的内容,如果没有算法就很难从头开始编写汇编代码。但是您应该尽量按照字面意思来遵循您的伪代码,而不是在将其转换为汇编代码时进行任意更改。