🧠 ¿Qué hace este programa?
Este programa es un conversor de binario a decimal. El usuario elige una opción del menú:
-
Ingresar un número binario (ej.
1011)
-
Salir del programa
Si eliges la opción 1, convierte el número binario a su equivalente decimal (1011 → 11).
📦 Sección .data: variables y mensajes
msg_menu: "1. Convertir... \n2. Salir..."
msg_input_binary:"Ingrese un número binario..."
msg_result_decimal: "El número en decimal es: %d\n"
msg_error_invalido: "Número binario inválido..."
formato_int: "%d"
formato_string: "%s"
opcion: número que el usuario selecciona
numero_binario: buffer de 33 bytes (32 bits + fin de string)
potencia: valor inicial 1 para hacer potencias de 2
🔁 main y menú principal
stp x29, x30, [sp, -16]!
mov x29, sp
Guarda el frame pointer y link register.
Luego entra a un ciclo:
🔘 Mostrar menú y leer opción:
printf -> muestra menú
scanf -> lee opción en `opcion`
Y se compara para ver si elige:
-
2: termina el programa
-
1: llama a convertir_binario_decimal
⚙️ convertir_binario_decimal: lógica principal
Paso 1: Pedir número binario
printf -> "Ingrese número binario"
memset -> limpia el buffer (pone 0s en `numero_binario`)
scanf -> lee el binario como string
Paso 2: Preparar para la conversión
w19 = 0 // Acumulador decimal
w20 = 0 // Índice en la cadena
w23 = 1 // Potencia inicial = 1
Paso 3: Bucle para procesar el string de derecha a izquierda
conversion_loop:
ldrb w22, [x21, w20, SXTW] ; Leer un carácter
cbz w22, mostrar_resultado ; Si es '\0' (fin de cadena), terminamos
cmp w22, #'0'
b.lo error_conversion ; Si < '0', error
cmp w22, #'1'
b.hi error_conversion ; Si > '1', error
Esto asegura que solo haya ceros y unos.
Paso 4: Si el carácter es '1', sumamos la potencia actual
cmp w22, #'1'
b.ne bit_saltar
adr x22, potencia
ldr w23, [x22]
add w19, w19, w23
Paso 5: Multiplicamos potencia por 2
lsl w23, w23, #1
str w23, [potencia]
Y pasamos al siguiente carácter:
add w20, w20, #1
b conversion_loop
✅ mostrar_resultado
Si todo salió bien:
printf("El número en decimal es: %d\n", w19)
Luego regresa al menú.
❌ error_conversion
Si algún carácter no era 0 o 1, entra aquí:
printf("Número inválido. Solo se permiten 0s y 1s")
🛑 fin_programa
Termina limpiamente:
ldp x29, x30, [sp], 16
ret