|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Feb 2001
Città: Pescara
Messaggi: 10542
|
Calcolare le occorrenze delle vocali in una stringa (MIPS with SPIM)
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 : Codice:
# 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
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
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....
Codice:
.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
__________________
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:20.



















