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?
-
Pide al usuario que ingrese un número entero.
-
Cuenta cuántos bits están activados (es decir, cuántos
1 hay en la representación binaria).
-
Imprime la cantidad de bits activados.
-
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.