GNU/Linux xterm bash 164 views

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).