为什么这样做?在 MIPS 中以相反的顺序打印数组

Why did this work? Printing an array in reversed order in MIPS

我有一个 class 的项目,一切都很顺利。我们只需要将用户输入的 20 个整数存储在一个数组中,并以各种方式打印它们。我的代码以正确的顺序打印它,但是当我以相反的顺序打印时,输出非常奇怪。所以在不理解的情况下,我有点明白索引是问题所在,出于某种原因我解决了它?但我不明白它是否真的正确。

    # for reverse order that worked
    addi $t0, $zero, 76
    while:

        beq $t0, -4, exit

        lw $t1, inputArray($t0)

        li $v0, 1
        move $a0, $t1
        syscall

        li $v0, 4 
        la $a0, space
        syscall

        addi $t0, $t0, -4

        j while

这是我第一次做的:

     # reverse order that didn't work
     addi $t0, $zero, 76
     while:

        beq $t0, 0, exit

        lw $t1, inputArray($t0)

        li $v0, 1
        move $a0, $t1
        syscall

        li $v0, 4 
        la $a0, space
        syscall

        addi $t0, $t0, -4

        j while

它不起作用时的输出是:

1702129221 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2

即使你的工作代码也有问题。

确实使用 inputArray($t1) 不是访问数组的正确方法。如果 inputArray 的地址不能按 16 位编码,您的代码将 损坏 。它使您的代码更难阅读且更容易出错。

你应该做的是将循环计数器和数组索引计算分开。 这大致对应如下伪C代码

for(int i=20, array=&inputArray[20]; i!=0; i--, array--){
  print(*array," ");

汇编版本

    # init part :: int i=20, array=inputArray[20];
    addi $t0, $zero, 20   # $t0 is loop counter i
    li $t2, inputArray # load 32 bits address of inputArray $t2=@inputArray
    addi  $t2, 76         # $t2=array=@inputArray[20]
while:
    beq $t0, zero, exit   # loop condition :: i!=0;
    # loop body :: print  *Array, " "
    lw $t1, 0($t2)
    addi $v0,zero, 1
    move $a0, $t1
    syscall
    # print space
    addi $v0,zero, 4 
    li $a0, space
    syscall
    # loop increments :: i--, array--
    addi $t0, $t0, -1  #i--
    addi $t2, $t2, -4  #array--
    j while

分离循环和数组访问总是会产生更好的代码。如果每次迭代必须获取不同的数组元素,例如打印 array[i]*array[i-1] 或不同的数组类型 intArray[i]+=shortArray[i].

,那么 就简单得多

您的非工作代码问题是范围检查不正确。对于这种代码,如果你从一个工作的 C 代码开始,它是无法到达的。