GNU/Linux xterm-256color bash 132 views

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?

  1. Muestra un menú con dos opciones:
    • 1: Convertir un número decimal a binario
    • 2: Salir
  2. Si el usuario elige 1, le pide un número decimal positivo
  3. Convierte ese número a binario (ej. 10 → 1010)
  4. 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)

  1. Muestra el menú
  2. Lee la opción del usuario
  3. 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

  1. Guarda la cantidad de bits usados en binary_size
  2. Imprime: El número %d en binario es:
  3. 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