Oppure

Loading
28/02/20 10:32
aonda
Ciao a tutti, sono nuovo di questo forum e vorrei chiedere un aiuto perchè mi sto dilettando con alcuni programmi e mi servirebbe un aiuto.
Il programma dovrebbe leggere una frase da tastiera e conteggiare le vocali minuscole (per ora). Potete dirmi dove sbaglio per favore....grazie
.data 0x10000000 #ROM

msg: .asciiz "Inserisci una frase: \n"
msg1: .asciiz "Le vocali sono: \n"
#msg2: .asciiz "Le consonanti sono: \n"
#msg3: .asciiz "Gli spazi sono: \n"

caratteri: .asciiz "32,65,69,73,79,85"

#caratteri ASCII
#32=spazio
#65=A
#69=E
#73=I
#79=O
#85=U

.data 0x10010000    #RAM
    buffer1: .space 100

.text

main:     
    #stampo msg
    li $v0,4
    la $a0,msg
    syscall

    #imposto la lettura da tastiera di una stringa e la salvo in un buffer di dim 100 max
    li $v0, 8
    la $a0, buffer1
    li $a1, 100
    syscall

    #stampo msg1
    li $v0, 4
    la $a0, msg1
    syscall

    #richiamo la subroutine del calcolo delle vocali inserite dall'utente
    la $a0, buffer1            #indirizzo di inizio del buffer delle vocali
    jal vocali

    #sposto il valore ottenuto in t0, visto che v0 lo uso per altre syscall
    move $t0, $v0

    #stampo risultato
    li $v0, 4
    la $a0, risul
    syscall

    #stampo il numero di vocali calcolate
    li $v0, 1
    move $a0, $t0
    syscall

    #uscita senza errori
    li $v0, 10
    syscall

#-------------------------------------#
# calculate_vocali     #
#-------------------------------------#
# Param: a0 = ind iniziale buffer #
# t0: contatore ciclo     #
# t1: contenitore caratteri a0     #
# t2: contenitore caratteri a1      #
# t3: usato per confronto t1 t2 #
# t4: line feed         #
#-------------------------------------#
# v0: vocali trovate #
#-------------------------------------#
# Questa funzione si occupa di #
# calcolare le vocali presenti     #
# in due parole inserite dall'utente. #
# Visto che si possono mettere #
# stringhe di diversa lunghezza, #
# sostituisco al carattere di line #
# feed il carattere null, per una #
# comparazione piu' corretta.     #
#-------------------------------------#

vocali:
    li $t0, 0    #contatore ciclo
    li $v0,0    #contatore vocali
    li $t4, 10    #carattere di line feed

ciclo:
    beq $t0, 100, fine    #100 è la dimensione massima del buffer della parola

    lb $t1, 0($a0)
    lb $t2, 0($a1)

    bne $t1, $t4, othercheck     #controllo se il carattere e' quello di line feed
    move $t1, $zero         #se è line feed allora lo imposto a null


fine:
    j fine
aaa
29/02/20 7:17
nessuno
Nella funzione manca totalmente il conteggio delle vocali
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità;) chiamava il gioco del Lotto Tassa sulla stupidità.
02/03/20 7:55
aonda
Si è vero, ho inserito quello non completo. Questo è il completo però non capisco come mai non funziona...
.data 0x10000000 #ROM

msg: .asciiz "Inserisci una frase: \n"
msg1: .asciiz "Le vocali sono: \n"
#msg2: .asciiz "Le consonanti sono: \n"
#msg3: .asciiz "Gli spazi sono: \n"

caratteri: .word 32, 65, 69, 73, 79, 85

#caratteri ASCII
#32=spazio
#65=A
#69=E
#73=I
#79=O
#85=U

.data 0x10010000    #RAM
    buffer1: .space 100

.text

main:     
    #stampo msg
    li $v0,4
    la $a0,msg
    syscall

    #imposto la lettura da tastiera di una stringa e la salvo in un buffer di dim 100 max
    li $v0, 8
    la $a0, buffer1
    la $a1, caratteri
    syscall

    #stampo msg1
    li $v0, 4
    la $a0, msg1
    syscall

    #richiamo la subroutine del calcolo delle vocali inserite dall'utente
    la $a0, buffer1            #indirizzo di inizio del buffer delle vocali
    jal vocali

    #sposto il valore ottenuto in t0, visto che v0 lo uso per altre syscall
    move $t0, $v0

    #stampo risultato
    li $v0, 4
    la $a0, risul
    syscall

    #stampo il numero di vocali calcolate
    li $v0, 1
    move $a0, $t0
    syscall

    #uscita senza errori
    li $v0, 10
    syscall

#-------------------------------------#
# calculate_vocali     #
#-------------------------------------#
# Param: a0 = ind iniziale buffer #
# t0: contatore ciclo     #
# t1: contenitore caratteri a0     #
# t2: contenitore caratteri a1      #
# t3: usato per confronto t1 t2 #
# t4: line feed         #
#-------------------------------------#
# v0: vocali trovate #
#-------------------------------------#
# Questa funzione si occupa di #
# calcolare le vocali presenti     #
# in due parole inserite dall'utente. #
# Visto che si possono mettere #
# stringhe di diversa lunghezza, #
# sostituisco al carattere di line #
# feed il carattere null, per una #
# comparazione piu' corretta.     #
#-------------------------------------#

vocali:
    li $t0, 0    #contatore ciclo
    li $t1, 0    #contatore valori
    li $v0,0    #contatore vocali
    li $t4, 10    #carattere di line feed

ciclo:
    beq $t0, 100, fine    #100 è la dimensione massima del buffer della parola

    lb $t1, 0($a0)
    lb $t2, 0($a1)

    bne $t1, $t4, othercheck     #controllo se il carattere e' quello di line feed
    move $t1, $zero         #se è line feed allora lo imposto a null

othercheck:
    bne $t2, $t4, ciclo1        #stesso controllo ma per l'altra parola
    move $t2, $zero

ciclo1:
    lb $t0, 0($a0)        #caricamento lettera
    lw $t1, 0($a1)        #caricamento primo valore

ciclo2:    beq $t0, $t1, successiva    #confronto

ciclo3:    addi $a1, $a1, 4        #aggiornamento elemento array
    j ciclo2

ciclo4:    addi $t0, $t0, 1        #aggiornamento lettera
    j ciclo2    

successiva:
    addi $v0, $v0, 1
    j ciclo4
    

fine:
    jal fine





aaa