Utilizzando QtSpim, scrivere un programma che legga due interi non negativi x e y e visualizzi su console il loro prodotto prod(x,y) = { 0 se y=0 oppure somma(x,prod(x,y-1)) }
somma(x,y)= { x se y=0 oppure [1+ somma(x,y-1)] }
#Es_2 (procedura prod sum)
.data
risultato: .asciiz "\n ecco il risultato : "
inserisci1: .asciiz "\n Inserire il primo numero numero x : "
inserisci2: .asciiz "\n Inserire il secondo numero numero y : "
.text
.globl main
prod:
sub $sp, $sp,12 #si crea l'area di memoria per la procedura
sw $a0, 4($sp) #essendo ricorsiva, memorizza l'intero passato come argomento
sw $a1, 8($sp) #essendo ricorsiva, memorizza l'intero passato come argomento
sw $ra, 0($sp)
beq $a1, $zero, zero
move $v0, $a0
sub $a1,$a1,1
bge $a1,1,prod
move $v1,$a0
jal sum
move $a0, $v0
move $a1,$v1
jal prod
lw $ra, 0($sp)
move $v0,$a0
addi $sp, $sp, 12 #ripristino dello stack
jr $ra
sum:
lw $ra, 0($sp)
move $a0,$v0
move $a1,$v1
beq $a1, $zero, x
addi $v0,$a0,1
sub $v1,$a1,1
jr $ra
x:
lw $ra, 0($sp) #prima di tutto recupero l'indirizzo di ritorno e lo carico in $ra
addi $sp, $sp, 16 #ripristino lo stack sommando il numero di byte che gli avevo sottratto all'inizio della procedura
move $v0, $a0 #ritorno il valore di x
jr $ra #torno al chiamante
zero: #oltre a ritornare il valore zero devo anche ripristinare lo stack
lw $ra, 0($sp) #prima di tutto recupero l'indirizzo di ritorno e lo carico in $ra
addi $sp, $sp, 16 #ripristino lo stack sommando il numero di byte che gli avevo sottratto all'inizio della procedura
li $v0, 0 #ritorno il valore zero
jr $ra #torno al chiamante
############################## procedura main
main:
li $v0, 4
la $a0, inserisci1
syscall
#si legge l'intero scelto dall'utente
li $v0, 5
syscall
move $t1, $v0 #l'intero scelto si passa come parametro alla procedura
li $v0, 4
la $a0, inserisci2
syscall
#si legge l'intero scelto dall'utente
li $v0, 5
syscall
move $a1, $v0 #l'intero scelto si passa come parametro alla procedura
move $a0,$t1
jal prod
move $t0, $v0 #si copia il valore in $t0 perchè $v0 deve essere usato per la syscall
li $v0, 4
la $a0, risultato
syscall
#si stampa il valore copiandolo da $t0 in $a0
li $v0, 1
move $a0, $t0
syscall
#uscita dal programma
li $v0, 10
syscall
non mi torna ! se metto x= 3 e y = 2 mi da 4 !! perchè ?
mi potete aiutare ?