Salve ragazzi, premetto che in quanto a ricorsione ho esperienza quasi zero ed il mio rapporto con lei non è buono (rotfl)
Tuttavia essendo un futuro informatico farò del mio meglio per conquistare questa complicata(solo all'inizio a quanto si dice) ragazza (good) (good)
Il testo dell'esercizio è questo:
Tramite la tecnica della ricorsione scrivere una funzione che stampa gli elementi dell array {1,2,3,4,5,6,7,8,9,10}
Ipotizzo che l'effetto dell'errore è che viene ripetuto una volta in piu del dovuto la parte di codice tra le righe 32-37
Infatti nell'output compare sepre quell'1 di troppo alla fine
codice:
123456789101
ps: non fate caso che vengono stampati tutti attaccati, i ricamini all aspetto dell'output li farò dopo!
il codice è questo:
codice:
.data
V: .word 11,22,33
n: .word 3
.text
main:
lw $a0, V
lw $a1, n
addi $a1, $a1, -1 # l'indice per l'array va da 0 a 9, ecco perchè decrementa di 1
sll $a1, $a1, 2 # moltiplica per 4 per allinearsi con l'indirizzi che vanno di 4 in 4
jal print_elem # chiama funzione prima per la prima volta
move $a0, $v0 # sposta in a0 il risultato ritornato dalla funzione
li $v0, 1 # carica il codice per stampare un int
syscall # stampa intero
exit: li $v0, 10
syscall
print_elem:
beqz $a1, base
lw $t0, V($a1) # in t0 ora c'è l'elemento dell'array alla posizione V($a1)
addi $sp, $sp, -12 # preapra 3 posti nello stack
sw $t0, 8($sp)
sw $a1, 4($sp)
sw $ra, 0($sp)
addi $a1, $a1, -4 # decremento l'indice
jal print_elem # passo ricorsivo
lw $ra, 0($sp)
lw $a1, 4($sp)
lw $a0, 8($sp)
syscall # stampa elemento salvato in a0
addi $sp, $sp, 12 # metto apposto lo stack pointer
jr $ra
base:
lw $a0, V($a1) # carico in a0 il primo elemento
li $v0, 1
syscall # stampo primo elemento
jr $ra
ps: forse avrei potuto risolverlo senza utilizzare lo stack, ma io VOLEVO esercitarmi usando lo stack