Итак, я начинаю с этого кода, который создает массив из 20 элементов - целых чисел от 1 до 20.

# initialise array
.text
main: la $t0,array
 li $s2,1
 li $s4,20
loop: bgt $s2, $s4, end
sw $s2,0($t0)
addi $s2, $s2, 1
addi $t0, $t0, 4
j loop
end:
 li $v0,10
 syscall
 .data
nl: .asciiz "\n"
 .word 255 # give a recognisable bit pattern
array: .space 80

Теперь я должен создать еще один массив размером 20 и сделать так, чтобы каждый элемент был суммой всех предшествующих элементов первого массива (тот, что в данном коде, называемый массивом). Вот что я до сих пор придумал:

# initialise array
    .text
main:   la $t0,array
    la $t1,sum
    li $s2,1
        li $s4,20
loop:   bgt $s2, $s4, end
    sw $zero,0($t0) 
    add $s3,$s2,$t0
    sw $s3,0($t1)
        sw $s2,0($t0)
    addi $s2, $s2, 1
    addi $t0, $t0, 4
    addi $t1, $t1, 4
        j loop
end:
    li  $v0, 1 
    lw $s3, 0($t1) 
    add $a0, $s3, $zero  # print final value in sum
    syscall
        li $v0,10
        syscall
       .data
nl:      .asciiz "\n"
    .word 255 # give a recognisable bit pattern
array:  .space 80
sum:    .space 80

Теперь, в конце, я хочу напечатать значение последнего элемента нового массива (суммы), и для массива из 20 элементов оно должно быть равно 210 (сумма всех предыдущих целых чисел), но в этот момент я получаю 0, и я действительно не больше не знаю, в чем проблема (сейчас я только начал что-либо делать с mips, и у меня очень мало знаний).

-1
Malcadicta 26 Фев 2018 в 02:09

1 ответ

Лучший ответ

Когда вы выходите из цикла, $t1 указывает на один за концом массива sum[]. Так что используйте lw $s3, -4($t1). (Кроме того, почему бы не загрузить прямо в $a0 вместо загрузки в $s3, а затем скопировать в $a0?)

Или, лучше, полностью опустите загрузку, потому что у вас все еще есть последний элемент, который вы сохранили, сидящий в $s3 из тела цикла. Так что оставьте add $a0, $s3, $zero # print final value in sum и опустите lw.


Как только вы это исправите, вы заметите еще одну ошибку: вы устанавливали s3 = i + &array[i] с помощью add $s3,$s2,$t0. Вы действительно хотите сделать s3 += s2 с add $s3, $s3, $s2.


Кроме того, вы используете регистры $s без их сохранения / восстановления. Это нормально, потому что вы выходите с системным вызовом вместо возврата из main, но любая возвращающая функция должна делать это со всеми регистрами $s0-7, имеющими свои исходные значения. регистры MIPS.

Самый простой способ сделать это - вообще не использовать эти регистры. Используйте $t0-9 и / или $a0-4 / $v0-1 в качестве временных.

1
Peter Cordes 26 Фев 2018 в 02:25