GNU/Linux xterm bash 160 views

Este programa en ARM64 para Raspberry Pi cuenta cuántos bits activados (bits en 1) tiene un número ingresado por el usuario, y además muestra su representación binaria de 32 bits. Vamos a analizarlo paso a paso en español.


🧠 ¿Qué hace el programa?

  1. Pide al usuario que ingrese un número entero.
  2. Cuenta cuántos bits están activados (es decir, cuántos 1 hay en la representación binaria).
  3. Imprime la cantidad de bits activados.
  4. Imprime la representación binaria del número (desde el bit 31 hasta el 0).

🗂️ .data — Segmento de datos

msg_ingreso:    .string "Ingrese un número: "
msg_resultado:  .string "Número de bits activados: %d\n"
msg_binario:    .string "Representación binaria: "
msg_bit:        .string "%d"
msg_newline:    .string "\n"
formato_int:    .string "%d"

numero:         .word 0
  • Mensajes que se muestran con printf.
  • numero: variable de 4 bytes (32 bits) donde se almacena el número ingresado.

🧾 .text — Lógica del programa

🔧 Prólogo: Preparar el entorno

stp x29, x30, [sp, -16]!
mov x29, sp
  • Guarda el marco anterior y prepara uno nuevo (convención estándar de funciones).

⌨️ Ingreso del número

adr x0, msg_ingreso
bl printf

adr x0, formato_int
adr x1, numero
bl scanf
  • Imprime: Ingrese un número:
  • Luego lee un número entero del usuario y lo guarda en numero.

📥 Cargar el número y preparar variables

adr x0, numero
ldr w1, [x0]          // Cargar número en w1
mov w19, w1           // Guardar copia para impresión binaria
mov w2, #0            // Contador de bits en w2
  • w1: contendrá el número que vamos a procesar.
  • w19: copia intacta para mostrar luego en binario.
  • w2: contador de bits en 1.

🔄 Bucle para contar bits activados

contar_loop:
    cbz w1, fin_conteo         // Si w1 == 0, termina
    and w3, w1, #1             // Extrae el bit menos significativo
    add w2, w2, w3             // Suma 1 si el bit era 1
    lsr w1, w1, #1             // Desplaza w1 a la derecha
    b contar_loop
  • Desplaza el número hacia la derecha bit por bit.
  • Suma 1 a un contador (w2) cada vez que el bit menos significativo es 1.

🖨️ Mostrar número de bits activados

mov w1, w2
adr x0, msg_resultado
bl printf
  • Imprime: Número de bits activados: N

🖥️ Mostrar la representación binaria

adr x0, msg_binario
bl printf

mov w20, #32
  • Imprime: Representación binaria:
  • Luego usa w20 como contador de 32 bits.
mostrar_bits:
    sub w20, w20, #1
    lsr w21, w19, w20
    and w1, w21, #1
    adr x0, msg_bit
    bl printf
    cmp w20, #0
    b.ne mostrar_bits
  • Empieza desde el bit más alto (31) hasta el bit 0.
  • Extrae cada bit desplazando y enmascarando con AND.
adr x0, msg_newline
bl printf
  • Agrega salto de línea al final.

🧹 Epílogo: Restaurar y salir

mov w0, #0
ldp x29, x30, [sp], 16
ret

🧪 Ejemplo de uso

$ ./bits_activos
Ingrese un número: 13
Número de bits activados: 3
Representación binaria: 00000000000000000000000000001101

13 en binario es 1101 → tiene 3 bits activados (1).


✅ ¿Qué técnicas usa?

  • Desplazamientos y máscaras para contar bits.
  • Ciclo manual para imprimir binario (bit a bit).
  • Uso de registros temporales (w1, w2, w19, etc.).
  • Manejo directo del stack con printf y scanf según el ABI ARM64.