Este código ARM64 es un programa que pide al usuario introducir un número, y luego le dice si es divisible entre 14 o no. Aquí te lo explico paso a paso, con contexto y detalle.
🧱 Secciones de datos
.section .data
buffer: .space 20
-
Se reserva un buffer de 20 bytes (aunque no se usa en este programa).
prompt: .asciz "Introduce un número: "
newline: .asciz "\n"
divisible_msg: .asciz "El número es divisible entre 14.\n"
not_divisible_msg: .asciz "El número no es divisible entre 14.\n"
-
Son cadenas que se imprimirán en consola.
.asciz incluye el terminador nulo (\0).
.section .bss
num: .skip 4
-
Reserva 4 bytes sin inicializar para guardar el número ingresado por el usuario (tipo
int, 32 bits).
🔧 .section .text (código principal)
_start: (punto de entrada del programa)
🖨️ Imprimir mensaje inicial
mov x0, 1 // stdout (file descriptor 1)
ldr x1, =prompt // dirección del mensaje
mov x2, 21 // longitud del mensaje
mov x8, 64 // syscall write
svc 0
-
Llama al syscall
write para mostrar "Introduce un número: ".
🧾 Leer número desde stdin
mov x0, 0 // stdin (file descriptor 0)
ldr x1, =num // dirección donde guardaremos el número
mov x2, 4 // leer 4 bytes (int)
mov x8, 63 // syscall read
svc 0
-
Lee 4 bytes de entrada estándar (suponiendo que se pasa un número en binario directamente, lo cual es poco realista, pero técnicamente válido si se invoca desde código).
📥 Cargar el número ingresado
ldr w1, [x1]
-
Carga el número leído desde la dirección
num al registro w1.
➗ Calcular residuo con 14
mov w2, 14
udiv w3, w1, w2 // w3 = cociente = w1 / 14
mul w4, w3, w2 // w4 = (w1 / 14) * 14
sub w5, w1, w4 // w5 = w1 - w4 = residuo
-
Se hace la división manual para obtener el residuo (porque
mod como tal no existe en ARM64).
-
Si el residuo es 0, el número es divisible.
✅ Comprobación de divisibilidad
cmp w5, #0
beq divisible // si el residuo es cero, salta a `divisible`
❌ No divisible
not_divisible:
mov x0, 1
ldr x1, =not_divisible_msg
mov x2, 36
mov x8, 64
svc 0
b end_program
-
Imprime el mensaje:
"El número no es divisible entre 14."
✅ Divisible
divisible:
mov x0, 1
ldr x1, =divisible_msg
mov x2, 34
mov x8, 64
svc 0
-
Imprime:
"El número es divisible entre 14."
🛑 Terminar el programa
end_program:
mov x8, 93 // syscall exit
mov x0, 0 // código de salida
svc 0
-
Llama al syscall
exit(0) para finalizar.
🧪 Nota Importante
Este programa espera que el número se ingrese en formato binario (no como texto), lo cual es poco amigable para un usuario. En un sistema real, se necesitaría:
-
Leer texto con
read
-
Convertir con una función como
atoi o implementando un parser (como en C).