codice:
.data
stringa: .asciiz "n\n Inserire una stringa:\n "
errore: .asciiz "\n\n La stringa deve essere inferiore a 100 caratteri. \n"
sottostringa1: .asciiz "uno"
sottostringa2: .asciiz "due"
sottostringa3: .asciiz "nove"
sottostringa4: .asciiz "?"
buffer: .space 100
nuovastringa: .space 100
.text
.globl main
main:
li $v0, 4
la $a0, stringa
syscall
li $t0, 0 #indice della stringa
li $t1, 0 #indice della sottostringa1
li $t2, 0 #indice della sottostringa2
li $t3, 0 #indice della sottostringa3
li $t4, 0 #indice della sottostringa4
li $t5, 0 #indice in cui si sono trovate le sottostringhe
#cerchiamo le sottostringhe
cerca:
lb $s1, sottostringa1($t1) #carattere corrente della sottostringa1
lb $s2, sottostringa2($t2) #carattere corrente della sottostringa2
lb $s3, sottostringa3($t3) #carattere corrente della sottostringa3
lb $s4, sottostringa3($t4) #carattere corrente della sottostringa4
beqz $s1, trovata #abbiamo trovato la sottostringa1 (beq=salta se sono uguali)
beqz $s2, trovata #abbiamo trovato la sottostringa2
beqz $s3, trovata #abbiamo trovato la sottostringa3
lb $s0, stringa($t0) #carattere corrente della stringa
beqz $s0, fine #termina se la stringa è finita
bne $s0, $s1, diversa #se i due caratteri sono diversi dobbiamo ricominciare la ricerca
bne $s0, $s2, diversa
bne $s0, $s3, diversa
addi $t0, 1 #se i due caratteri sono uguali passiamo al prossimo carattere
addi $t1, 1
addi $t2, 1
addi $t3, 1
b cerca
syscall
diversa:
addi $t5, 1 #proviamo a cercare la stringa un carattere più avanti
move $t5, $t0
li $t1, 0
li $t2, 0
li $t3, 0
syscall
#in $t5 abbiamo la posizione del primo carattere della sottostringa
#in $t0 abbiamo la posizione del primo carattere che la segue
trovata:
li $t6, 0 #ci serve un indice nella stringa
li $t7, 0 #indice da cambiare
syscall
rimpiazza:
lb $s0, stringa ($t5) #in $t5 ho l’indice del primo carattere che segue la stringa trovata
loop:
bne $t0, $t1, else #if($t0(i)==$t1) continua
li $t0,1
bne $t0, $t2, else #if($t0(i)==$t2) continua
li $t0, 2
bne $t0, $t3, else #if($t0(i)==$t3) continua
li $t0, 9
add $t0, $t0, 1
j loop
else:
add $t0, $zero, $t4
beqz $s0, fine #se la stringa è finita esco
sb $s0, nuovastringa ($s5) #altrimenti copio il carattere
addi $s5, 1 #avanzo di 1
addi $t5, 1
syscall
fine:
li $v0, 10
syscall