Last active
April 10, 2025 05:15
-
-
Save FranciscoJCE/49f8c76ff84259d456571b9950a82ea2 to your computer and use it in GitHub Desktop.
Codigo Assembly ARM64 para RaspbianOS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * 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