PROBLEMA Stringhe assembly

xcostal

Nuovo Utente
4
0
Salve a tutti,
devo realizzare questo esercizio:
Scrivere un programma che legge una stringa di caratteri e stampa a console una stringa ottenuta eliminando le vocali dalla stringa in ingresso

Ho pensato di realizzarlo cosi:

Codice:
.data
    string1: .asciiz "Scrivi una frase e digita invio: "
    string2: .asciiz "La stringa che hai scritto è: "
    string3: .asciiz "La stringa senza vocali è: "
    letto: .space 256

.text
main:

        la $a0, string1
        li $v0, 4
        syscall
    
        la $a0, letto
        la $a1, 255
        li $v0, 8
        syscall
        
        la $a0, string2
        li $v0, 4
        syscall
        
        la $a0, letto
        li $v0, 4
        syscall
        
        move $t0, $zero  #inizializzo il contatore
        
        la $a0, string3
        li $v0, 4
        syscall
        
Loop:    lb $t2, letto($t0)
        beq $t2, $zero, End
        
        #controllo le vocali
        
        li $t3, 'a'
        beq $t2, $t3, Sott
        li $t3, 'e'
        beq $t2, $t3, Sott
        li $t3, 'i'
        beq $t2, $t3, Sott
        li $t3, 'o'
        beq $t2, $t3, Sott
        li $t3, 'u'
        beq $t2, $t3, Sott
        
        
    
        la $a0, letto($t0)
        li $v0, 11
        syscall

Sott:
        
        
        add $t0,$t0,1
        j Loop
        
    
End:
        li $v0, 10
        syscall


Ma in questo modo la stringa che verrà stampata senza vocali non sarà una vera e propria stringa, vorrei capire come creare una nuova stringa in cui andare a inserire le consonanti. Grazie in anticipo!
 

pabloski

Utente Èlite
2,868
916
Dal listato posso immaginare di che ISA si tratti. Ma per essere sicuri, che processore è? E che sistema operativo? Vedo che invochi delle syscall, ma non hai specificato il sistema operativo che le implementa.
 

xcostal

Nuovo Utente
4
0
Dal listato posso immaginare di che ISA si tratti. Ma per essere sicuri, che processore è? E che sistema operativo? Vedo che invochi delle syscall, ma non hai specificato il sistema operativo che le implementa.
Io lo utilizzo su win10 e processore intel.
Vorrei capire come creare una stringa durante l'esecuzione del programma e concatenare le varie consonanti che devo alla fine stampare
 

pabloski

Utente Èlite
2,868
916
Io lo utilizzo su win10 e processore intel.
Vorrei capire come creare una stringa durante l'esecuzione del programma e concatenare le varie consonanti che devo alla fine stampare

E allora abbiamo un problema, perchè quello non è assembly x86 ma assembly mips.

Quindi quel programma non andrà a girare su windows x86, ma su qualcos'altro. E non so questo qualcos'altro cos'è.
 

pabloski

Utente Èlite
2,868
916
per ora scrivo il codice e lo eseguo su un simulatore QtSpim

Perfetto. Beh, intanto per restare fedele alla traccia, dovresti creare un'area di memoria in cui memorizzare la stringa di destinazione senza vocali. Nel tuo listato vedo che invece stampa le singole consonanti. Visivamente il risultato è lo stesso, però tecnicamente non stai producendo una nuova stringa.

Inoltre, anche volendo stampare carattere per carattere, c'è un errore bello grosso ed è questo

Codice:
la $a0, letto($t0)

che invece dev'essere

Codice:
lb $a0, letto($t0)

Quindi, dovresti fare così

Codice:
.data
    string1: .asciiz "Scrivi una frase e digita invio: "
    string2: .asciiz "La stringa che hai scritto è: "
    string3: .asciiz "La stringa senza vocali è: "
    letto: .space 256
    senzavocali: .space 256

.text
main:

        la $a0, string1
        li $v0, 4           # syscall 4 - print string, a0 contiene la stringa
        syscall
   
        la $a0, letto
        la $a1, 255
        li $v0, 8           # syscall 8 - read string, a0 punt buffer, a1 dim buffer
        syscall
       
        la $a0, string2
        li $v0, 4
        syscall
       
        la $a0, letto
        li $v0, 4
        syscall
             
        la $a0, string3
        li $v0, 4
        syscall
       
        move $t0, $zero  #inizializzo il contatore
        move $t1, $zero

Loop:   lb $t2, letto($t0)
        beq $t2, $zero, End
       
        #controllo le vocali
       
        li $t3, 'a'
        beq $t2, $t3, Sott
        li $t3, 'e'
        beq $t2, $t3, Sott
        li $t3, 'i'
        beq $t2, $t3, Sott
        li $t3, 'o'
        beq $t2, $t3, Sott
        li $t3, 'u'
        beq $t2, $t3, Sott
       
        sb $t2, senzavocali($t1)
        add $t1,$t1,1

Sott:
        add $t0,$t0,1
        j Loop
       
End:
        move $t2, $zero
        sb $t2, senzavocali($t1)

        la $a0, senzavocali
        li $v0, 4
        syscall

        li $v0, 10
        syscall
 
Ultima modifica:

xcostal

Nuovo Utente
4
0
Perfetto. Beh, intanto per restare fedele alla traccia, dovresti creare un'area di memoria in cui memorizzare la stringa di destinazione senza vocali. Nel tuo listato vedo che invece stampa le singole consonanti. Visivamente il risultato è lo stesso, però tecnicamente non stai producendo una nuova stringa.

Inoltre, anche volendo stampare carattere per carattere, c'è un errore bello grosso ed è questo

Codice:
la $a0, letto($t0)

che invece dev'essere

Codice:
lb $a0, letto($t0)

Quindi, dovresti fare così

Codice:
.data
    string1: .asciiz "Scrivi una frase e digita invio: "
    string2: .asciiz "La stringa che hai scritto è: "
    string3: .asciiz "La stringa senza vocali è: "
    letto: .space 256
    senzavocali: .space 256

.text
main:

        la $a0, string1
        li $v0, 4           # syscall 4 - print string, a0 contiene la stringa
        syscall
  
        la $a0, letto
        la $a1, 255
        li $v0, 8           # syscall 8 - read string, a0 punt buffer, a1 dim buffer
        syscall
      
        la $a0, string2
        li $v0, 4
        syscall
      
        la $a0, letto
        li $v0, 4
        syscall
            
        la $a0, string3
        li $v0, 4
        syscall
      
        move $t0, $zero  #inizializzo il contatore
        move $t1, $zero

Loop:   lb $t2, letto($t0)
        beq $t2, $zero, End
      
        #controllo le vocali
      
        li $t3, 'a'
        beq $t2, $t3, Sott
        li $t3, 'e'
        beq $t2, $t3, Sott
        li $t3, 'i'
        beq $t2, $t3, Sott
        li $t3, 'o'
        beq $t2, $t3, Sott
        li $t3, 'u'
        beq $t2, $t3, Sott
      
        sb $t2, senzavocali($t1)
        add $t1,$t1,1

Sott:
        add $t0,$t0,1
        j Loop
      
End:
        move $t2, $zero
        sb $t2, senzavocali($t1)

        la $a0, senzavocali
        li $v0, 4
        syscall

        li $v0, 10
        syscall
se invece volessi creare una nuova stringa?
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!