Salve ragazzi sto realizzando un programmino mediante le istruzioni MIPS ma non sono sicuro di quello che ho fatto.
Il programma deve calcolare la somma RICORSIVA degli elementi di un array.
ecco il programma da me implementato:
prima lo scrivo in C poi in MIPS


int somma(int X [],int n){
if(n==0)
return 0;
else
return X[n-1] + somma(X,n-1)
}


Ora lo scrivo in MIPS




Supponiamo che la dimensione sia nel registro $ a0
e l'indirizzo base dell'array sia in $s0


somma:
addi $sp ,$sp ,-12 #incremento lo stack
sw $ao ,0($sp) #salvo il valore della dimensione
sw $ra ,4($sp) #salvo l'indirizzo di ritorno
sw $s2 ,8($sp) #nel registro $s2 manteniamo il risultato prodotto dalla ricorsione
bne $ao ,$zero ,ric # effettuo il test per vedere se la dimensione è pari a 0 ,altrimenti passo a ric ed effettuo la chiamata
ricorsiva
add $s2,$vo,$zero #assegno il valore restituito dalla chiamata ricorsiva a $so
addi $sp,$sp,12 #aggiorno il contatore
jr $ra


ric:
slt $ao, $zero, Exit #se è minore di 0 la dimensione allora esco
addi $ao,$ao ,-1 #decremento la variabile dimensione
sll $to,$ao,2 #shift logico necessario per il caricamento in memoria dell'array
add $to,$to,$so
lw $t1,0($to) #carico in memoria la posizione desiderata dell'array
add $vo,$t1,$vo #mi salvo X[n-1 ] nel registro di ritorno $vo
jal somma #chimaata ricorsva con dimensione decementata diu uno
lw $a0,0($sp) #ripristino tutti i valori dallo stack e lo aggiorno subito dopo
lw $ra,4($sp)
lw $s2,8($sp)
addi $sp,$sp,12
jr $ra

Exit:
add $vo,$vo,$zero
jr $ra