Este código es un conversor de números decimales a binarios escrito en ensamblador ARM64 para Raspberry Pi OS o Ubuntu ARM64. Lo vamos a explicar paso por paso en español, estilo amigable para estudiantes que vienen de C o C#.
🧠 ¿Qué hace este programa?
-
Muestra un menú con dos opciones:
-
1: Convertir un número decimal a binario
-
2: Salir
-
Si el usuario elige 1, le pide un número decimal positivo
-
Convierte ese número a binario (ej.
10 → 1010)
-
Muestra el resultado bit a bit, de izquierda a derecha
📦 Sección .data (datos y variables)
msg_menu: "1. Convertir número\n2. Salir"
msg_input: "Ingrese un número decimal"
msg_result: "El número %d en binario es: "
msg_negative: "Por favor ingrese un número positivo"
msg_bit: "%d" ; Para imprimir bits individuales
msg_newline: "\n"
formato_int: "%d" ; Formato para scanf y printf
opcion: donde se guarda lo que el usuario elige
numero: el número decimal a convertir
binary: espacio para guardar hasta 32 bits
binary_size: cantidad de bits generados
🚦 Flujo principal (main)
stp x29, x30, [sp, -16]! ; Guardamos el frame pointer
mov x29, sp ; Configuramos nuevo frame
🔁 menu_loop (menú principal)
-
Muestra el menú
-
Lee la opción del usuario
-
Compara:
-
Si es 2, termina
-
Si es 1, va a
convertir_numero
-
Cualquier otro valor: vuelve a mostrar el menú
⚙️ convertir_numero (lógica de conversión)
Paso 1: Pedir número
printf -> msg_input
scanf -> guarda en `numero`
Paso 2: Verifica si es negativo
cmp w0, #0
b.lt numero_negativo
🔄 Bucle de conversión decimal → binario
mov w19, w0 ; w19 contiene el número a convertir
mov w21, #0 ; índice del arreglo binary
Cada iteración:
and w22, w19, #1 ; bit actual = número & 1
str w22, [binary, w21*4]
add w21, w21, #1 ; siguiente posición
lsr w19, w19, #1 ; divide por 2
🔁 Repite hasta que w19 == 0
⚠️ Caso especial: número 0
Si el número es 0, guarda un solo bit 0 y va a mostrar el resultado:
mov w22, #0
str w22, [binary]
mov w21, #1
🖨️ mostrar_resultado
-
Guarda la cantidad de bits usados en
binary_size
-
Imprime:
El número %d en binario es:
-
Recorre el arreglo de bits de atrás hacia adelante (
w21 - 1 → 0)
-
Esto es porque se guardaron los bits del menos significativo al más significativo
sub w21, w21, #1 ; índice final
mostrar_bits:
ldr w1, [binary, w21*4]
bl printf
sub w21, w21, #1
b.ge mostrar_bits
❌ numero_negativo
Si el usuario mete un número negativo, se muestra:
"Por favor ingrese un número positivo"
Y vuelve al menú.
🛑 fin_programa
Limpia registros y termina:
ldp x29, x30, [sp], 16
ret