Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Assembly MIPS su QtSPIM
Forum - Altri Linguaggi - Assembly MIPS su QtSPIM

Avatar
aonda (Normal User)
Newbie


Messaggi: 2
Iscritto: 28/02/2020

Segnala al moderatore
Postato alle 11:32
Venerdì, 28/02/2020
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

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6196
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:17
Sabato, 29/02/2020
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à.
PM Quote
Avatar
aonda (Normal User)
Newbie


Messaggi: 2
Iscritto: 28/02/2020

Segnala al moderatore
Postato alle 8:55
Lunedì, 02/03/2020
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






PM Quote