GNU/Linux xterm-256color bash 155 views

/*
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