Cuentanumeros en MIPS

#Realice un programa que lea un numero y se lo pase a la función que cuente el numero de unos de forma recursiva. 
#La función main imprimira el resultado. NOTA: #Casos triviales: numunos(0)=0 y numunos(1)=1 #Caso recursivo: numunos (n) = numunos (n>>1) + n0 siendo n0 el bit de menos peso del numero n. .data cadena: .asciiz "\nIntroduzca un numero: " cadres: .asciiz "\nEl numero de unos 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, 5 #Llamada al sistema para leer un numero syscall move $a0, $v0 #Argumento: el numero leudo jal cuentaunos move $t0, $v0 li $v0, 4 #Llamada al sistema para imprimir una cadena la $a0, cadres #Puntero a la cadena a imprimir syscall li $v0, 1 #Llamada al sistema para imprimir una cadena move $a0, $t0 #Imprimimos el numero de unos (resultado $v0 de la funcion) syscall li $v0, 10 #Llamada al sistema para finalizar el programa syscall #Funcion que cuenta el numero de unos que hay en un numero que se le pasa como argumento cuentaunos: #compruebo si estoy en un caso trivial beq $a0, $zero, trivial li $t0, 1 beq $a0, $t0, trivial addi $sp, $sp, -4 sw $ra, ($sp) #apilo $ra andi $t0, $a0, 1 # saco el bit de menos peso de n, es decir n0 addi $sp, $sp, -4 sw $t0, ($sp) #apilo n0 srl $a0, $a0, 1 #hago n>>1 es el argumento de la llamada a la funcion jal cuentaunos lw $t0, ($sp) #desapilo n0 addi $sp, $sp, 4 add $v0, $v0, $t0 #calculo el resultado cuentaunos(n>>1)+n0 lw $ra, ($sp) #desapilo ra addi $sp, $sp, 4 jr $ra trivial: move $v0, $a0 jr $ra