GNU/Linux xterm-256color bash 145 views

🧠 ¿Qué hace este programa?

Este programa es un conversor de binario a decimal. El usuario elige una opción del menú:

  1. Ingresar un número binario (ej. 1011)
  2. Salir del programa

Si eliges la opción 1, convierte el número binario a su equivalente decimal (101111).


📦 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