[Assembly] ; Assembly MIPS
Salve. Data la seguente traccia d'esame di Assembly Mips:


ho così scritto il mio codice Assembly Mips:
Tuttavia la funzione rec_car_search dovrebbe essere Ricorsiva(come da traccia)..non riesco bene ad implementarla ! potreste aiutarmi ?


ho così scritto il mio codice Assembly Mips:
.data
prmpt1: .asciiz "Dammi la stringa: "
prmpt2: .asciiz "Dammi il carattere: "
stringa: .space 21
prmpt3: .asciiz "\nTrovato!"
prmpt4: .asciiz "\nNon trovato!"
.text
.globl main
main:
li $v0,4
la $a0,prmpt1
syscall
li $v0,8
la $a0,stringa
li $a1,21
syscall
li $v0,4
la $a0,prmpt2
syscall
li $v0,12
syscall
move $a1,$v0
la $a0,stringa
jal rec_car_search
move $t0,$v0
beq $t0,1,trovato
li $v0,4
la $a0,prmpt4
syscall
j fine
trovato:
li $v0,4
la $a0,prmpt3
syscall
fine:
li $v0,10
syscall
###################### rec_string_search #############################
rec_car_search:
lbu $t0,0($a0)
beq $t0,0,return_0
beq $t0,$a1,return_1
addi $a0,$a0,1
j rec_car_search
return_0:
move $v0,$zero
jr $ra
return_1:
addi $v0,$zero,1
jr $ra
#########################################################################Tuttavia la funzione rec_car_search dovrebbe essere Ricorsiva(come da traccia)..non riesco bene ad implementarla ! potreste aiutarmi ?
Risposte
Ho risolto da solo ragionando un po' sui record di attivazione e sul significato di funzione ricorsiva; ecco la funzione find_in_String_rec che giustamente funziona in maniera ricorsiva:
################### find_in_string_rec ######################
find_in_string_rec:
lbu $t0,($a0) #Carica carattere della stringa nel registro temporaneo $t0
beq $t0,0,return_0 #if(*str==0) return(0);
beq $t0,$a1,return_1 #else if (*str==c) return(1);
else: #else (chiamata ricorsiva)
addi $sp,$sp,-8 #Decremento (abbasso) lo stack di 2 word
sw $a0,0($sp) #Salvo la posizione corrente nella stringa in stack
sw $ra,4($sp) #Salvo il registro di return address in stack
addi $a0,$a0,1 #Nuovo argomento per find_in_string_rec
jal find_in_string_rec
lw $ra,4($sp)
lw $a0,0($sp)
addi $sp,$sp,8 #Ripristino lo stack
jr $ra #Torno da dove sono venuto
return_0:
move $v0,$zero # find_in_string_rec restituisce l'intero 0 ( il carattere non è presente nella stringa)
jr $ra #Ritorno al chiamante (main)
return_1:
addi $v0,$zero,1 #find_in_string_rec restituisce l'intero 1 ( il carattere è presente)
jr $ra