[Assembly] ; Assembly MIPS

blackhood888
Salve. Data la seguente traccia d'esame di Assembly Mips:






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
blackhood888
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 


Rispondi
Per rispondere a questa discussione devi prima effettuare il login.