2014-09-24 3 views
0

Я новичок в MIPS и пытаюсь написать рекурсивную программу. Программа рассчитает f(N), где N - целое число больше нуля. f(N)= 3*(N-1)+f(N-1)+1. Основной корпус: f(0)=2. Однако, когда я пытаюсь запустить свою программу, он работает бесконечно, поэтому я предполагаю, что рекурсивные вызовы никогда не заканчиваются. Кажется, я не могу найти, где проблема. Мой код выглядит следующим образом.Программа рекурсии MIPS

.data 
    prompt: .asciiz "Please enter a number" 

    .text 
    .globl main 

    main: 
     li $v0, 4 
     la $a0, prompt 
     syscall 
     li $v0, 5 
     syscall 
     move $a0, $v0 
     jal factfunc 
     move $a0, $v0 
     li $v0, 1 
     syscall 
     li $v0, 10 
     syscall 

    factfunc: 
     addiu $sp, $sp, -8 
     sw $ra, 4($sp) 
     sw $s0, 0($sp) 
     move $s0, $a0 
     blez $s0, endCondition 
     addi $a0, $a0, -1 
     jal factfunc 
     li $s1, 0 
     li $s2, 0 
     addi $s1, $s0, -1 
     move $s2, $s1 
     addu $s2, $s2, $s2 
     addu $s1, $s2, $s1 
     addu $v0, $v0, $s1 
     addi $v0, $v0, 1 

    cleanUp: 
     lw $s0, 0($sp) 
     lw $ra, 4($sp) 
     jr $ra 

    endCondition: 
     li $v0, 2 
     b cleanUp 

Я бы очень признателен за любую помощь. Благодаря!

+0

Где функция 'F (n)'? Разве это не вызов, потому что это рекурсивно? – jww

ответ

0

Вы забыли сжать стек в конце процедуры fastfunc.

Незадолго до jr $ra Я добавил addi $sp $sp 8, после чего он начал останавливаться, как ожидалось.

0

Обратный адрес $ra загружается 0x00400050 (from factfunc) вместо 0x00400020 (с основного). Это быстрое решение добавить к $sp$.

Смежные вопросы