Buonasera, ho appena svolto questo esercizio; i problemi che vorrei risolvere sono di fatto tre:

1) Avendo terminato i registri t, dovrei usare quelli s nella funzione, devo necessariamente usare anche lo stack?

2) purtroppo il programma da in output che la frase è sempre palindroma...

3) inoltre, quando salto ad una funzione, posso usare i registri temporanei, t, ripartendo da zero oppure devo cmq tener conto che li ho già usati nel main?

vi posto anche il lungo codice...che sarà sicuramente migliorabile

###########################################################
#	ESAME del 9 Settembra 26																							
#																																					#
# Scrivere un programma assembly il cui main richiami una funzione "palindrome".					
# Tale funzione esegue l'input di una stringa di max 16 caratteri. La funzione deve 					
# ritornare un valore booleano vero o falso (1 o 0) a seconda che la stringa sia palindroma		
# (è uguale letta sia da sinistra che da destra) o non palindroma. Il test non deve essere			
# case - sensitive. Il main stamperà un messaggio opportuno a seconda del valore				
# ritornato dalla funzione. 																							
###########################################################

.global _main

.data
	buffer: 				.space 16
	str_in:				.asciz "\n Dammi la stringa -> "
	msg_out1:		.asciz "\n La stringa è palindroma!"
	msg_out2:		.asciz "\n La stringa non è palindroma!"
	
	flag:					.asciz "\n flag"
	white_space: 	.asciz " "

.text 
_main:

	la a0, str_in
	li a7, 4
	ecall
# Input della stringa da analizzare	
	la a0, buffer
	li a1, 16
	li a7, 8
	ecall
	la t0, buffer	
# mv t0, a0

	li t3, 65
	li t4, 90
	li t5, 10								# Carattere terminatore
	lb t2, 0(t0)							# Se il primo carattere inserito è invio, il programma termina
	beq t2, t5, end						# Programma che termina se si preme invio
	
loop_conversion:
	lb t2, 0(t0)
	beqz t2, step						# La stringa non ha più caratteri
	ori t2, t2, 0x20					# Converte il carattere maiuscolo in miscolo (0x20 = 32)
	addi t0, t0, 1						# Scorro la stringa

	j loop_conversion
	
step:
	jal ra, palindrome
	li t1, 1
	
	bne a0, t1, frase_non_pal
	
	la a0, msg_out1
	li a7, 4
	ecall
	j _main

frase_non_pal:
	la a0, msg_out2
	li a7, 4
	ecall
	
	j _main

end:
# Fine del programma
	li a7, 10
	ecall

palindrome:
		mv s1, t0										# s1 = puntatore sinistro (inizio stringa)
		mv s2, t0										# s2 = puntatore destro (fine stringa)
	fine_stringa:	
		lbu s3, 0(s2)								# Carica il byte corrente
		beqz s3, imposta_dx
		addi s2, s2, 1								# Avanza al carattere successivo
		j fine_stringa
	imposta_dx:
		addi s2, s2, -1								# Torna indietro di 1 per puntare all'ultimo carattere valido
	ciclo_confronto:
		bge s1, s2, palindroma				# Se il puntatore sx >= puntatore dx, abbiamo finito con successo
	
		lbu s3, 0(s1)
		lbu s4, 0(s2)
		bne s3, s4, non_palindroma		# Se i caratteri sono diversi, la frase non è palindroma
		
		addi s1, s1, 1								# Sposta il puntatore a destra
		addi s2, s2, -1								# Sposta il puntatore a sinistra
		j ciclo_confronto
		
	palindroma:
		li a0, 1
		jr ra
		
	non_palindroma:
		li a0, 0
		jr ra

Grazie in anticipo a chi mi risponde!