реализация этой рекурсивной функции в MIPS - PullRequest
0 голосов
/ 21 сентября 2018

Мне дали задание воссоздать из C в MIPS.

function1 (n) = (3*n)-5, если n <= 3 </p>

function1 (n) = (n-1)*function1(n-1) + function1(n-2) - n, если n> 3

Это рекурсивная функция, которая вызывает себя дважды, а именно:

int function1(int n)
{
    if (n <= 3)
     {
        int ans1 = (3*n)-5;
        return ans1;
     }
    else
     {
        int ans1 = (n-1)*function1(n-1) + function1(n-2) - n;
        return ans1;
     }
}

Основные вызовы function1 путем ввода целого числа, заданного пользователем.

  void main()
  {
    int ans, n;

    printf("Enter an integer:\n");

    // read an integer from user and store it in "n"
    scanf("%d", &n);

    ans = function1(n);

    // print out the solution computed by function 1
    printf("The solution is: %d\n", ans);

    return;
}

То, что я пока имею в MIPS:

.data
enterInt: .asciiz "Enter an integer:\n"
answer: .asciiz "The solution is: "

.text
.globl main

main:
li $v0, 4
la $a0, enterInt
syscall 
li $v0, 5
syscall
move $a0, $v0


jal function1

li $v0, 1   
syscall

jr $ra

function1:
addi $sp, $sp -4
sw $ra, 0($sp)
addi $sp, $sp, -4
sw $a0, 0($sp)


sle $t0, $a0, 3 #if n <= 3
beq $t0, $zero, else #if $t0 = 0, or when n > 3 exit to else

#basecase computation
addi $a0, $a0, -1


jal function1

else:   
#reversing the top
lw $a0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra

addi $a0 $a0, -2

jal function1


lw $ra, 0($sp)
lw $s0, 4($sp)
addi $sp, $sp, 8
jr $ra

Я знаю, что это несколько на правильном пути, но я, честно говоря, понятия не имею, куда идти дальше.Любое направление поможет.Спасибо!

...