Skip to content

Instantly share code, notes, and snippets.

@FranciscoJCE
Last active April 10, 2025 05:15
Show Gist options
  • Select an option

  • Save FranciscoJCE/49f8c76ff84259d456571b9950a82ea2 to your computer and use it in GitHub Desktop.

Select an option

Save FranciscoJCE/49f8c76ff84259d456571b9950a82ea2 to your computer and use it in GitHub Desktop.
Codigo Assembly ARM64 para RaspbianOS
/*
* Programa: Verificador de números primos
* Autor: Francisco Javier Crisostomo Enciso
* Descripción: Comprueba si un número es primo en ARM64 para Raspberry Pi OS
* Ejemplo en C#:
* bool EsPrimo(int n) {
* if (n <= 1) return false;
* for (int i = 2; i <= n/2; i++)
* if (n % i == 0) return false;
* return true;
* }
* Console.WriteLine(EsPrimo(29) ? "Es primo" : "No es primo");
* ASCIINEMA: https://asciinema.org/a/rF5dvXNZTioqPzofHCYgAyV2V
*/
.section .data
prompt: .asciz "Ingrese un número: "
msg_primo: .asciz "Es primo\n"
msg_noprimo:.asciz "No es primo\n"
newline: .asciz "\n"
.section .bss
.lcomm input_buffer, 12
.lcomm number, 4
.section .text
.global _start
_start:
// Mostrar prompt
mov x0, #1
ldr x1, =prompt
mov x2, #18
mov x8, #64
svc #0
// Leer entrada del usuario
mov x0, #0
ldr x1, =input_buffer
mov x2, #12
mov x8, #63
svc #0
// Convertir entrada a número
ldr x1, =input_buffer
mov w0, #0 // resultado
mov w2, #10 // base 10
mov w3, #0 // índice
convert_loop:
ldrb w4, [x1, w3, SXTW]
cmp w4, #10 // salto de línea
beq check_prime
sub w4, w4, #'0' // convertir ASCII a dígito
madd w0, w0, w2, w4 // resultado = resultado*10 + dígito
add w3, w3, #1
b convert_loop
check_prime:
// Guardar número
ldr x1, =number
str w0, [x1]
// Verificar si es primo
cmp w0, #1
ble not_prime
// Calcular √n aproximado
mov w2, #2 // i = 2
mov w3, w0 // copia de n
bl sqrt_approx // w4 = √n aproximado
prime_loop:
cmp w2, w4
b.gt is_prime
udiv w5, w0, w2
msub w6, w5, w2, w0 // w6 = n % i
cbz w6, not_prime // si divisible, no es primo
add w2, w2, #1 // i++
b prime_loop
is_prime:
// Mostrar "Es primo"
mov x0, #1
ldr x1, =msg_primo
mov x2, #9
mov x8, #64
svc #0
b exit
not_prime:
// Mostrar "No es primo"
mov x0, #1
ldr x1, =msg_noprimo
mov x2, #11
mov x8, #64
svc #0
exit:
// Salir
mov x8, #93
mov x0, #0
svc #0
// ------------------------------------------------------------
// Función: sqrt_approx
// Aproximación entera de √n (w3)
// Devuelve en w4
// ------------------------------------------------------------
sqrt_approx:
mov w4, #0 // x = 0
mov w5, #1 // m = 1
mov w6, #0 // sum = 0
sqrt_loop:
add w6, w6, w5 // sum += m
cmp w6, w3
b.gt sqrt_done
add w4, w4, #1 // x++
add w5, w5, #2 // m += 2
b sqrt_loop
sqrt_done:
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment