/*
Autor: Victor Manuel Madrid Lugo
Fecha: 08/04/2025
Descripción: Verifica si un número es primo
Demostración: [https://asciinema.org/a/mZGfmONwXF8U1Sbo9K1ex2iiP]
*/
/*
Equivalente en Go:
package main
import "fmt"
func isPrime(num int) bool {
// Si el número es menor que 2, no es primo
if num < 2 {
return false
}
// Si el número es 2, es primo
if num == 2 {
return true
}
// Si es par (excepto 2), no es primo
if num%2 == 0 {
return false
}
// Verificar divisibilidad por números impares hasta la raíz cuadrada
for i := 3; i*i <= num; i += 2 {
if num%i == 0 {
return false
}
}
return true
}
func main() {
num := 97
if isPrime(num) {
fmt.Println("El número es primo")
} else {
fmt.Println("El número no es primo")
}
}
*/
.global _start
.data
num_to_check: .quad 97 // El número que queremos verificar si es primo
is_prime_msg: .ascii "El número es primo\n"
is_prime_len = . - is_prime_msg
not_prime_msg: .ascii "El número no es primo\n"
not_prime_len = . - not_prime_msg
.text
_start:
// Cargar el número a verificar en x0
ldr x0, =num_to_check
ldr x0, [x0]
// Si el número es menor que 2, no es primo
cmp x0, #2
blt not_prime
// Si el número es 2, es primo
cmp x0, #2
beq is_prime
// Si es par (excepto 2), no es primo
and x1, x0, #1 // Verifica si el bit menos significativo es 0 (número par)
cmp x1, #0
beq not_prime
// Configurar para el bucle: x1 = 3 (primer divisor a probar)
mov x1, #3
check_loop:
// Verificar si x1*x1 > num_to_check
mul x2, x1, x1
cmp x2, x0
bgt is_prime // Si x1*x1 > num_to_check, es primo
// Verificar si x1 divide a num_to_check
udiv x2, x0, x1 // x2 = x0 / x1
mul x3, x2, x1 // x3 = x2 * x1
cmp x3, x0 // Si x3 == x0, entonces x1 divide a x0 exactamente
beq not_prime // Si es divisible, no es primo
// Incrementar x1 en 2 (solo necesitamos probar números impares)
add x1, x1, #2
b check_loop
is_prime:
// Imprimir mensaje "Es primo"
mov x0, #1 // stdout
ldr x1, =is_prime_msg
mov x2, is_prime_len
mov x8, #64 // syscall write
svc #0
b exit
not_prime:
// Imprimir mensaje "No es primo"
mov x0, #1 // stdout
ldr x1, =not_prime_msg
mov x2, not_prime_len
mov x8, #64 // syscall write
svc #0
exit:
// Salir del programa
mov x0, #0
mov x8, #93 // syscall exit
svc #0