Рекурсивная функция в сборке MIPS - PullRequest
0 голосов
/ 12 марта 2020

Я пишу это на ассемблере 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
...