PDA

Visualizza la versione completa : Problema Programma assembly


qwe
11-05-2017, 12:22
Ciao a tutti! :ciauz: Devo creare un programma che inserisca una stringa di caratteri e come output mi da una stringa con le seguenti regole:
se nella stringa iniziale sono presenti le parole "uno" mi scrive 1 , "due" mi scrive due, "nove" mi
scrive 9... per tutti gli altri caratteri mi scrive "?"
ad esempio >> input: etr 55 ciao yui uno qeu due
output: ? ? ? ? 1 ? 2
Non riesco a trovare l' errore:dh: , mi potete dare una mano? Grazie in anticipo



.data
stringa: .asciiz "n\n Inserire una stringa:\n "
errore: .asciiz "\n\n La stringa deve essere inferiore a 100 caratteri. \n"
sottostringa1: .asciiz "uno"
sottostringa2: .asciiz "due"
sottostringa3: .asciiz "nove"
sottostringa4: .asciiz "?"
buffer: .space 100
nuovastringa: .space 100


.text
.globl main
main:
li $v0, 4
la $a0, stringa
syscall
li $t0, 0 #indice della stringa
li $t1, 0 #indice della sottostringa1
li $t2, 0 #indice della sottostringa2
li $t3, 0 #indice della sottostringa3
li $t4, 0 #indice della sottostringa4
li $t5, 0 #indice in cui si sono trovate le sottostringhe


#cerchiamo le sottostringhe
cerca:
lb $s1, sottostringa1($t1) #carattere corrente della sottostringa1
lb $s2, sottostringa2($t2) #carattere corrente della sottostringa2
lb $s3, sottostringa3($t3) #carattere corrente della sottostringa3
lb $s4, sottostringa3($t4) #carattere corrente della sottostringa4
beqz $s1, trovata #abbiamo trovato la sottostringa1 (beq=salta se sono uguali)
beqz $s2, trovata #abbiamo trovato la sottostringa2
beqz $s3, trovata #abbiamo trovato la sottostringa3
lb $s0, stringa($t0) #carattere corrente della stringa
beqz $s0, fine #termina se la stringa finita
bne $s0, $s1, diversa #se i due caratteri sono diversi dobbiamo ricominciare la ricerca
bne $s0, $s2, diversa
bne $s0, $s3, diversa
addi $t0, 1 #se i due caratteri sono uguali passiamo al prossimo carattere
addi $t1, 1
addi $t2, 1
addi $t3, 1
b cerca
syscall



diversa:
addi $t5, 1 #proviamo a cercare la stringa un carattere pi avanti
move $t5, $t0
li $t1, 0
li $t2, 0
li $t3, 0
syscall



#in $t5 abbiamo la posizione del primo carattere della sottostringa
#in $t0 abbiamo la posizione del primo carattere che la segue


trovata:
li $t6, 0 #ci serve un indice nella stringa
li $t7, 0 #indice da cambiare
syscall

rimpiazza:
lb $s0, stringa ($t5) #in $t5 ho l’indice del primo carattere che segue la stringa trovata
loop:
bne $t0, $t1, else #if($t0(i)==$t1) continua
li $t0,1
bne $t0, $t2, else #if($t0(i)==$t2) continua
li $t0, 2
bne $t0, $t3, else #if($t0(i)==$t3) continua
li $t0, 9
add $t0, $t0, 1
j loop
else:
add $t0, $zero, $t4
beqz $s0, fine #se la stringa finita esco
sb $s0, nuovastringa ($s5) #altrimenti copio il carattere
addi $s5, 1 #avanzo di 1
addi $t5, 1
syscall

fine:
li $v0, 10
syscall

MItaly
11-05-2017, 13:39
Dovresti specificare di che assembly si tratta...

qwe
11-05-2017, 14:30
Utilizzando QtSpim

Loading