Проблема в том, как вы увеличиваете указатели массива. word
имеет ширину 4 байта, и для доступа к следующему элементу требуется добавить 4 к адресу. Это определенно объясняет, почему у вас есть неприровненный доступ.
Есть несколько других проблем.
main
- это специальная функция, и вы не должны возвращаться из main, а вызывать exit () (syscall 10
)
И количество слов в $t4
не было напечатано правильно.
Я также изменил ваш цикл, чтобы в нем была уникальная ветвь и чтобы подавить последний прыжок. Всегда лучше выполнить тест в конце цикла в режиме ожидания.
Вот исправленная версия:
.data
source: .word 3, 1, 4, 1, 5, 9, 0
dest: .word 0, 0, 0, 0, 0, 0, 0
countmsg: .asciiz " values copied. "
.text
main: ### main is a special function. Should not save $ra
#### $ra add $s0, $0, $ra # Save our return address
la $t0, source
la $t1, dest
loop: lw $t3, ($t0) # read next word from source
addi $t4, $t4,1 # increment count words copied
sw $t3, 0($t1) # write to destination
addi $t0, $t0,4 # advance pointer to next source
### increment must be sizeof(word), ie 4
addi $t1, $t1,4 # advance pointer to next dest
bne $t3,$zero, loopend # loopend while word is != 0
### no longer required j loop
loopend:
move $a0, $t4 # We want to print the count
# which is in $t4
li $v0, 1
syscall # Print it
la $a0, countmsg # We want to print the count msg
li $v0, 4
syscall # Print it
li $a0, 0x0A # We want to print '\n'
li $v0, 11
syscall # Print it
li $a0, 0 # EXIT_SUCCESS
li $v0, 10
syscall # exit
## jr $s0 # NO Return from main. use exit syscall