Si scriva un programma in assembler MIPS che calcoli, attraverso chiamate mutuamente ricorsive delle funzioni f() e g(), il valore della funzione f(n). f(n) = 5, se x<=0 3*g(x-1)+1, altrimenti g(n)= 2, se x<3 2+f(x-1), altrimenti #f(x)=5 se x<=0 #f(x)=3*g(x-1)+1 altrimenti #g(x)=2 se x<3 #g(x)=2+f(x-1) altrimenti #versione con meno istruzioni ma maggiore occupazione di stack .data stringa_i: .asciiz "\n scrivi un intero (0 per uscire): " stringa_o: .asciiz "\n il valore di f è: " .text .globl main main: li $v0, 4 la $a0, stringa_i syscall #stampa richiesta di un intero li $v0, 5 syscall #intero richiesto in $v0 move $a0,$v0 beq $a0,0 fine jal F move $t0,$v0 #salvo momentaneamente il risultato in $t0 la $a0, stringa_o li $v0,4 syscall move $a0,$t0 li $v0,1 syscall j main fine: li $v0, 10 syscall F: blt $a0,$0,casobaseF sub $sp, $sp, 8 sw $ra, 0($sp) sw $a0, 4($sp) sub $a0, $a0,1 jal G mul $v0,$v0,3 add $v0,$v0,1 lw $ra,0($sp) lw $a0,4($sp) add $sp, $sp, 8 jr $ra casobaseF: li $v0, 5 jr $ra G: blt $a0, 3, casobaseG sub $sp, $sp,8 sw $a0, 4($sp) sw $ra, 0($sp) sub $a0, $a0, 1 jal F add $v0, $v0, 2 lw $ra, 0($sp) lw $a0, 4($sp) add $sp, $sp, 8 jr $ra casobaseG: li $v0,2 jr $ra