Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
09/05/13 18:09
lavitz
Innanzitutto salve a tutti sono nuovo, prima di postare ho cercato nel forum, ho trovati casi simili al mio ma non proprio uguali, che ahimé non hanno saputo aiutarmi molto, ho un problema specifico nella mia funzione che non riesco a risolvere.. Spero possiate aiutarmi il prima possibile! Quindi un grazie in anticipo!

Premetto che uso il MARS e non spim.
la funzione che sto cercando di creare deve, preso in input l'indirizzo di una stringa di testo terminata da zero presente in memoria, rendere maiuscola l'iniziale di ogni parola.
Spiego meglio con l'esempio: inserisco la stringa "marCo noN Sa pRoGRAMMare in MIps!"
la funzione dovra ritornare "Marco Non Sa Programmare In Mips!"
Il codice da me ideato é:

FUNZ1:
	la $t3, space

	
loop:	lb $t0, 0($a0)
	beqz $t0, end		#fine della stringa raggiunta!
	seq $t4, $t0, $t3	#se il Char caricato é uno spazio, t4=1 altrimenti t4=0, lo uso come un booleano
	beq $t4, 1, next	#se ho uno spazio passo al char successivo
	li $t2, 97		# inizializzo l'indice j del secondo for
	li $t1, 60		# inizializzo l'indice i del primo for
for1:
	bne $t0, $t1, add1	#se diversi passo a incrementare la i del for
	j ctrlUpper		
for2:
	bne $t0,$t2, add2	#se diversi incremento la j del secondo for
	j ctrlLower
	
ctrlUpper:
	    beq $t4, 1, next	#se il char segue uno spazio lo lascio invariato e passo al prossimo
UPNow: addi $t0, $t0, 32	#trasformo il char da maiuscolo a minuscolo
	    li $t4, 0		#azzero il booleano
	    j next
ctrlLower:
	bne $t4, 1, next	# lascio invariato il char minuscolo
	subi $t0, $t0, 32	#trasformo il char da minuscolo a MAIUSCOLO
	j next

add1:				#gestione primo ciclo
	bgt $t1, 90, for2	#se i > 90 non ho maiuscole e passoa  controllare con il 2 for
	addi $t1, $t1, 1	# i++
	j for1
add2:				#gestione secondo ciclo for
	bgt $t2, 122, next	#se j > 122 non ho una lettera, lo lascio invariato e passo avanti
	addi $t2, $t2, 1	#j++
	j for2
	
next:
	sb $t0, 0($a0)		#sostituisco con il carattere precedentemente in quella posizione
	addi $a0, $a0, 1	        # NEXT CHAR
	beq $t4, 1, UPNow	#modifico direttamente il carattere successivo in maiuscolo
	j loop
	
end:
	jr $ra			#torno alla funzione principale
	



EDIT: ho risolto il problema di prima, Ora UN PROBLEMA DI CUI non trovo l'errore..
Mi stampa tutto in minuscolo, non converte da minuscolo a maiuscolo.. sapete perche?

Spero di essermi spiegato abbastanza e mi auguro che il codice sia facilmente comprensibile, i 4 registri usati sono:
T0 = dove carico il carattere della stringa di input
T1 = indice i del primo ciclo for
T2 = indice j del secondo ciclo for
T3 = carattere di spazio " "
T4 = registro FLAG usato come boolean
Ultima modifica effettuata da lavitz 09/05/13 21:28
aaa
11/05/13 17:50
pierotofy
Aprirei un nuovo topic, con una nuova descrizione del problema e con il sorgente aggiornato. Altrimenti si fa confusione con il problema precedente.
Il mio blog: piero.dev