Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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: 6402
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