.data
cad: .asciiz "Programa que imprime los n primeros numeros primos, siendo n un numero introducido por el ususario."
cad1: .asciiz "\nIntroduzca un número positivo: "
cad2: .asciiz "El númer no es positivo!!"
cad3: .asciiz ","
cad4: .asciiz "Los n primeros numeros primos son: "
.globl main
.text
main:
li $v0, 4
la $a0, cad
syscall
# 1. Pedir un número al usuario imprimiendo una cadena
ini: li $v0, 4
la $a0, cad1
syscall
# 2. Leer un número. Si el número introducido no es positivo debe dar un mensaje de error y volver a pedir el número.
li $v0, 5
syscall #llamada al sistema para leer un numero
move $a1, $v0 #guardamos el numero en $a1
la $a2, cad2 #guardamos en a2 la cadena de error
bltz $a1, negativo
li $v0, 4
la $a0, cad4
syscall
move $a0, $a1
la $a1, cad3
jal funcion_primos
li $v0,10 #fin
syscall
negativo:
#si el numero es negativo da un mensaje de error y vuelve a pedir el numero
li $v0, 4 #Si es negativo, imprimimos la cadena de error de $a1
move $a0, $a2
syscall #El númer no es positivo!!
j ini # si el numero es negativo volvemos a empezar
#Función primos
funcion_primos:
addi $sp,$sp, -4 #Como vamos a llamar a otra función, almacenamos
sw $ra, ($sp) # el registro $ra en la pila
li $a2, 2 #contador, si el uno se cuenta comp primo, pponer 1
li $a3, 0#contador
move $t4, $a0
move $t5, $a1
seguir_imprimir:
beq $a3, $t4, fin_funcion_primos
move $a0, $a2 #le pasamos el numero en a0
jal primo
li $t7, 1
beq $v0, $t7, imprimir_numero
addi $a2, $a2, 1
j seguir_imprimir
imprimir_numero:
li $v0,1 #imprime el numero
la $a0, ($a2)
syscall
jal print
addi $a2, $a2, 1
addi $a3, $a3, 1
j seguir_imprimir
print:
move $t9, $t4
addi $t9, $t9, -1
beq $a3, $t9, volver
li $v0,4 #imprime el espacio
move $a0, $t5
syscall
volver:
jr $ra
fin_funcion_primos:
lw $ra, ($sp) #Desapilamos $ra
addi $sp, $sp, 4
jr $ra #volvemos al main
#Función primo
primo:
addi $sp,$sp, -4 #Como vamos a llamar a otra función, almacenamos
sw $ra, ($sp) # el registro $ra en la pila
jal calcula_divisores #Esta función devuelv een $v0 el nº e divisores del número almcenado en $a0 (argumento de la función)
lw $ra, ($sp) #Desapilamos $ra
addi $sp, $sp, 4
li $t0, 2
beq $v0, $t0, es_primo #Si el númer otiene 2 divisores (1 y él) es primo
li $t0, 1
beq $v0, $t0, es_primo #Si el númer otiene 1 divisores (1) es primo (es el 1)
li $v0, 0 #Devolvemos cero porque no es primo (no tiene 2 divisores)
jr $ra
es_primo:
li $v0, 1 #Devolvemos uno porque es primo
jr $ra
calcula_divisores:
li $t1, 0 #inicializamos el contador de divisores
li $t2, 1 #El primer número que vamos a analizar si es divisor es el 1
bucle:
bgt $t2, $a0, fin #Si el número a analizar es mayor, hemos acabado
div $a2, $t2 #Dividimos el número entre el posible divisor
mfhi $t3 #Nos quedamos con el resto
addi $t2, $t2, 1 #Pasamos al siguiente número
bne $t3, $zero, bucle #Si el resto no es 0, no es divisor. Seguimos mirando...
addi $t1, $t1, 1 #Si el resto es 0, es divisor. Sumamos uno al contador de divisores
j bucle #Seguimos mirando
fin:
move $v0, $t1 #Pasamos el número de divisres a $v0
jr $ra