Существует проблема даже с вашим рабочим кодом.
Действительно, использование inputArray($t1)
не является правильным способом доступа к вашему массиву.Ваш код будет сломан , если адрес inputArray не может быть закодирован в 16 битах.И это делает ваш код более трудным для чтения и более подверженным ошибкам.
Что вам нужно сделать, это разделить счетчик цикла и вычисление индекса массива.Это примерно соответствует следующему псевдокоду C
for(int i=20, array=&inputArray[20]; i!=0; i--, array--){
print(*array," ");
Asm version
# 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.