Buongiorno a tutti, sto facendo un esercizio come da titolo, devo inserire una stringa e poi un carattere; contare quante volte il char è presente nella stringa...tutto deve essere fatto con un loop da quale esco solo quando l'utente inserisce uno spazio...
Il problema è il programma gira ma solo la prima volta che inserisco il carattere...già al secondo inserimento, ottengo sempre 0...
Grazie a chi risponde!
Posto il codice:
# ESAME del 24 Giugno 2026
#
# Scrivere un programma assembly che allochi una stringa al più di 255 caratteri. Il main legge in input
# la stringa e, in loop, un carattere del quale conteggiare le occerrenze all'interno della stringa fornita.
# Il loop di input potrà essere terminato fornendo uno spazio (codice ASCII 32). Una funzione
# conta_occorrenze riceve il puntatore alla stringa ed il carattere da cercare come parametri e ritorna
# il suo numero di occorrenze nella stringa, che sarà opportunamente stampato nel main.
# Maiuscole e minuscole devono essere considerate equivalenti
.global _main
.data
prompt_string: .asciz "\n Inserire una frase: "
size: .space 255
prompt_char: .asciz "\n Inserire il carattere da ricercare (spazio per uscire): "
print_char: .asciz "\n Numero di caratteri trovati: "
.text
_main:
la a0, prompt_string
li a7, 4
ecall
li a7, 8
li a1, 255
ecall
mv t2, a0
loop:
la a0, prompt_char
li a7, 4
ecall
li a7, 12
ecall
mv t0, a0 # Salva il carattere inserito nel registro t0
li t1, 32 # Carattere terminatore
beq t0, t1, end
jal ra, conta_occorrenze # Richiamo della funzione per il conteggio
la a0, print_char
li a7, 4
ecall
mv a0, t4 # Viene spostato il conteggio del char nel registro a0
li a7, 1
ecall
j loop
end:
# Fine programma
li a7, 10
ecall
# Funzione per il conteggio dei caratteri
conta_occorrenze:
li t4, 0 # Inizializzare il contatore
ciclo:
lb t3, 0(t2) # Caricare il prossimo carattere della stringa in t2
beqz t3, fine
bne t3, t0, jump # Se i caratteri sono differenti salta a jump
addi t4, t4, 1 # Incrementa il contatore, vuol dire che i due caratteri sono uguali
jump:
addi t2, t2, 1
j ciclo
fine:
# mv a0, t4 # Commentanto perchè altrimenti non ho il conteggio
ret