Ошибка в: недопустимое значение счетчика программы: 0x00000000 подводит итоги ввода

Я пытаюсь написать программу, которая запрашивает у пользователя 6 чисел, а затем складывает все это как результат, но я все, что я ввожу, все свои входы, я получаю сообщение об ошибке:

Ошибка в: недопустимое значение счетчика программы: 0x00000000

Go: выполнение прервано с ошибками.

Я не знаю, как это исправить, и я не знаю, какую строку исправить. Спасибо!

.data
# user input number for addition
msg1: .asciiz "Enter first number : "   
num1: .word 1
msg2: .asciiz "Enter second number : "
num2: .word 1
msg3: .asciiz "Enter third number : "
num3: .word 1
msg4: .asciiz "Enter fourth number : "
num4: .word 1
msg5: .asciiz "Enter fifth number : "
num5: .word 1
msg6: .asciiz "Enter sixth number : "
num6: .word 1

.text
addi $sp,$sp,-20    # stack to save data

li $v0,4
la $a0,msg1     # enter first number
syscall
li $v0,5
la $a0,num1     # read number
syscall
sw $a0,0($sp)       # push to sp

li $v0,4
la $a0,msg2
syscall
li $v0,5
la $a0,num2
syscall
sw $a0,4($sp)

li $v0,4
la $a0,msg3
syscall
li $v0,5
la $a0,num3
syscall
sw $a0,8($sp)

li $v0,4
la $a0,msg4
syscall
li $v0,5
la $a0,num4
syscall
sw $a0,12($sp)

li $v0,4
la $a0,msg5
syscall
li $v0,5
la $a0,num5
syscall
sw $a0,16($sp)

li $v0,4
la $a0,msg6
syscall
li $v0,5
la $a0,num6
syscall



li $t0, 6        # initialize counter
adds:            # addition loop
beqz $t0, exit       # counter zero exit
lw $a1,0($sp)
add $a0,$a0,$a1      # add numbers
addi $sp,$sp,4       # increment sp
addi $t0,$t0,-1      # decrement count
j adds           # loop
li $v0,1
syscall
exit:jr $ra
li $v0,10
syscall

person Darren Cheng    schedule 27.12.2018    source источник
comment
То, как вы пытаетесь использовать системный вызов 5, неверно. Не требует аргументов.   -  person Michael    schedule 27.12.2018
comment
Используйте отладчик и пошагово выполняйте программу построчно. Это позволит быстро определить, на какой линии возникла проблема.   -  person Raymond Chen    schedule 27.12.2018
comment
Вы не определили функцию main, ваш код находится в верхней части раздела .text. Предположительно выполнение начинается с вашего кода без адреса возврата в $ra, и именно так вы получаете PC = 0. (из jr $ra в конце, что вы делаете перед, вы делаете последний v0 = 10 / syscall.)   -  person Peter Cordes    schedule 30.12.2018


Ответы (1)


Призывы к чтению целого числа:

li $v0,5
la $a0,num1     # read number

Неправильно - вам нужно только установить v0 на 5 и выполнить системный вызов - тогда число чтения будет в v0, с которым вам нужно что-то делать, а не a0, как вы сейчас используете.

Вы повторяете цикл 6 раз и добавляете 4 к sp, то есть: добавляете 24, но вы выделили 20 в пространстве в стеке, поэтому теперь, когда что-то еще используется в стеке, что они получают, это не то, что они думают

У вас нет основного ярлыка, поэтому он может даже не запускать ваш код.

И системный вызов 10 никогда не происходит, когда вы подходите к выходу, который возвращается к ja.

Если вы запустите код в отладчике и пошагово выполните его, вы увидите, что он делает.

person lostbard    schedule 03.01.2019