Я пишу это на ассемблере MIPS. Я получаю это как ответ на мой код.
Enter a positive integer: 12345
268500992Enter a positive integer: + 2 + 2 + 2 + 2 = 12347
-- program is finished running --
Мой код должен дать мне это как вывод. Я думаю, что, возможно, сделал ошибку, используя указатель стека. Кажется, он повторяет рекурсивную функцию нужное количество раз. Вот мой код
.data
msg1: .asciiz "Enter a positive integer: "
addition: .asciiz " + "
equal: .asciiz " = "
.text
.globl main
main:
#prints message
la $a0, msg1
li $v0, 4
syscall
#prompts user for input
li $v0, 5
syscall
move $a1, $v0
#jumps to recursive loop
jal digitSum
#outputs equal sign
la $a0, equal
li $v0, 4
syscall
#outputs final sum
move $a0, $a1
li $v0, 1
syscall
#exits program
li $v0, 10
syscall
#digitSum procedure
digitSum:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a1, 0($sp)
#if $a1 is less than 10 it continues, otherwise it jumps to L1
slti $t0, $a1, 10
beq $t0, 0, L1
#prints $a0
li $v0, 1
syscall
#returns argument n and adjusts stack pointer
lw $a1, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
#outputs value of n and jumps to return address
li $v0, 4
syscall
jr $ra
L1:
addi $s0, $zero, 10
div $a1, $s0
mflo $a1
jal digitSum
#pops values off of stack
lw $a1, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
#outputs addition sign
li $v0, 4
la $a0, addition
syscall
#outputs remainder of n/10
li $v0, 1
mfhi $a0
syscall
add $a1, $a0, $a1
jr $ra