Invertir cadena en MIPS

#Realiza un programa que lea una cadena mediante una llamada al sistema e incluya
#una subrutina que invierta la cadena que se le pasa como parámetro y la almacene en
#una dirección destino que se le pasa también como parámetro. La función main imprimir la
#cadena invertida. NOTA: utilizar la pila para invertir la cadena.

.data
cadena: .asciiz "\nIntroduzca una cadena: "
cadleida: .space 100
cadinvertida: .space 100
cadres: .asciiz "\nLa cadena invertida es: "

.text
.globl main
main:
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, cadena  #Puntero a la cadena a imprimir
syscall

li $v0, 8 #Llamada al sistema para leer una cadena
la $a0, cadleida  #Puntero al espacio reservado
li $a1, 100 #Longitud maxima de la cadena le’da
syscall

la $a0, cadleida  #Argumento 1: puntero a la cadena leida
la $a1, cadinvertida #Argumento 2: puntero al espacio reservado para almacenar la cadena invertida
jal invierte

li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, cadres  #Puntero a la cadena a imprimir
syscall

li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, cadinvertida  #Puntero a la cadena a imprimir
syscall


li $v0, 10 #Llamada al sistema para finalizar el programa
syscall

#Funcion que invierte la cadena que se la pasa como argumento y la guarda en el espacio indicado por el 2 argumento
invierte:
li $t1, 0   #Contador de la longitud
bucle:
lb $t0, ($a0) #Leo un caracter de la cadena origen
beqz $t0, desapila #Si es el fin de cadena, he acabado de leer
addi $sp, $sp, -1  #Apilo el caracter en la pila
sb $t0, ($sp)
addi $t1, $t1, 1 #Cuento que he apilado un caracter mas
addi $a0, $a0, 1 #Actualizo el puntero
j bucle
desapila:
#Ya he apilado toda la cadena, la desapilo y la voy guardando en la cadena destino
lb $t0, ($sp) #Desapilo una letra de la pila
addi $sp, $sp, 1
sb $t0, ($a1) #La guardo en la cadena de destino
addi $a1, $a1, 1 #Actualizo el puntero de la cadena de destino
addi $t1, $t1, -1 #Ya he leido una letra
bnez $t1, desapila #Mientras me queden letras apiladas, sigo desapilando
sb $zero, ($a1)  #Al final, almaceno el caracter fin de cadena
jr $ra #Fin de la función