PDA

View Full Version : Calcolare le occorrenze delle vocali in una stringa (MIPS with SPIM)


sblantipodi
29-04-2004, 13:50
Qualcuno di voi è in grado di aiutarmi a trovare uno spezzone di codice che mi indirizzi a risolvere il problema in TOPIC.
Ovviamente devo usare Assembler per MIPS usando SPIM.

Io ho trovato questo, purtroppo però calcola solamente le occorrenze di B in una stringa.
Il programma che mi serve deve calcolare tutte le vocali presenti in una stringa. :(

Ecco quello che conta le B :



# Esercizi P&H 3.23 e 3.24: bfind e bcount

.data
hello: .asciiz "Scrivi una parola: "
out: .asciiz "Numero di b = "
str: .space 32

.text
.globl main

bfind:
li $t0, 98 # $t0 = 'b'
move $t1, $zero # i = 0
loopbfind:
add $v0, $a0, $t1 # $v0: indirizzo di s[i]
lb $t2, 0($v0) # $t2 = s[i]
beq $t2, $zero, endbfind # s[i] = '\0'
beq $t2, $t0, endbfind # s[i] = 'b'
addi $t1, $t1, 1 # i = i+1
j loopbfind
endbfind:
jr $ra


bcount:
addi $sp, $sp, -8 # Alloca 8 byte per lo stack
sw $ra, 0($sp) # Salva return address
sw $s0, 4($sp) # Salva $s0

move $s0, $zero # $s0 = numero di b
loopbcount:
jal bfind
lb $t0, 0($v0)
beq $t0, $zero, endbcount
addi $s0, $s0, 1
addi $a0, $v0, 1
j loopbcount
endbcount:
move $v0, $s0
lw $ra, 0($sp)
lw $s0, 4($sp)
addi $sp, $sp, 8
jr $ra


main:
li $v0, 4 # print_string
la $a0, hello
syscall
la $a0, str
li $a1, 32
li $v0, 8 # read_string
syscall

jal bcount
move $s0, $v0

li $v0, 4 # print_string
la $a0, out
syscall
move $a0, $s0
li $v0, 1 # print_int
syscall




# Uscita
li $v0, 10 # carica in $v0 il codice della exit
syscall # uscita dal programma





Spero che qualcuno mi aiuti :(

akyra
30-04-2004, 17:29
guarda, l'ho fatto molto di fretta (ed è un po' cervellotico) comunque se ti ci rompi un po' sopra la testa capisci come funzia...lascio a te eventuali correzioni e miglioramenti (che ce ne sono da fare) per purificare il codice e renderlo più leggibile....;)



.data
hello: .asciiz "Scrivi una parola: "
out: .asciiz "Numero di vocali = "
str: .space 32


.text
contavocali:
addi $sp, $sp, -4 # Alloca 4 byte per lo stack
sw $ra, 0($sp) # Salva return address
move $t1, $zero # i = 0

nuovo_carattere:
addi $t4, $zero, 6
addi $t0, $zero, 93 #resetta gli indici
addi $t6, $zero, 4
addi $t5, $zero, 0
addi $t7, $zero, 3
add $v0, $a0, $t1 # $v0: indirizzo di s[i]

confrontavocale:
beq $t5,$t7, cambia #allora cambia il valore di $t6
beq $t5, $t4, continua #il carattere non è una vocale
continua2:
add $t0, $t0,$t6 # $t0 = 'a'-->'e'-->'i'--->'o'--->'u' carica una vocale alla volta
addi $t5, $t5, 1 #indice che dice con quante vocali ho confrontato--->se superiore a 5--->non è una vocale

lb $t2, 0($v0) # $t2 = s[i]
beq $t2, $zero, endcount # s[i] = '\0' #abbiamo finito
beq $t2, $t0, find # s[i] = 'vocale'--->vocale trovata!
#confronta con altre vocali
j confrontavocale


continua:
addi $t1, $t1, 1 # i = i+1
j nuovo_carattere
find:
addi $s0, $s0, 1 #trovata la vocale--->aumenta $s0
j continua

cambia:
addi $t6, $zero, 6
j continua2



endcount:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra


main:
addi $sp, $sp, -4
sw $ra, 0($sp)
li $v0, 4 # print_string
la $a0, hello
syscall
la $a0, str
li $a1, 16
li $v0, 8 # read_string
syscall

jal contavocali


li $v0, 4 # print_string
la $a0, out
syscall
move $a0, $s0
li $v0, 1 # print_int
syscall


# Uscita
lw $ra, 0($sp)
jr $ra



spero di esserti stato d'aiuto....ciao!