[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