Ошибка в: неверное значение счетчика программы: 0x00000000 суммирующие входы - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь написать программу, которая запрашивает у пользователя 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

1 Ответ

0 голосов
/ 03 января 2019

Вызовы для чтения целого числа:

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

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

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

У вас нет основной метки, поэтому он может даже не запускать ваш код.

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

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

...