Este código ARM64 para Raspberry Pi OS es una práctica excelente para entender desplazamientos de bits (shifts) y cómo representar números en binario. Vamos a desglosarlo paso por paso, en español claro y práctico.
🧠 ¿Qué hace este programa?
-
Muestra un menú para que el usuario elija:
-
1: Desplazamiento a la izquierda (LSL)
-
2: Desplazamiento a la derecha (LSR)
-
3: Salir
-
Pide un número y la cantidad de bits a desplazar
-
Realiza el desplazamiento y:
-
Muestra el resultado en decimal
-
Muestra su representación binaria de 32 bits
📦 .data – Datos y variables
msg_menu: Texto del menú principal
msg_num: "Ingrese el número: "
msg_pos: "Ingrese posiciones a desplazar: "
msg_resultado: "Resultado: %d\n"
msg_binario: "En binario: "
msg_bit: "%d" ; usado para imprimir bits
msg_newline: "\n"
formato_int: "%d"
opcion: opción del menú
numero: número a desplazar
posiciones: número de bits a desplazar
🔁 Ciclo principal (main y menu_loop)
1. Muestra el menú y lee opción
adr x0, msg_menu
bl printf
adr x0, formato_int
adr x1, opcion
bl scanf
Si el usuario elige 3, termina el programa:
cmp w0, #3
b.eq fin_programa
2. Pide número y posiciones a desplazar
adr x0, msg_num
bl printf
adr x0, formato_int
adr x1, numero
bl scanf
Mismo proceso para posiciones.
3. Carga los valores a registros
ldr w1, [numero] ; número original
ldr w2, [posiciones] ; cuántos bits se va a desplazar
ldr w0, [opcion] ; opción elegida
🚀 Shift operations
🔹 Opción 1: Desplazamiento a la izquierda (LSL)
lsl w1, w1, w2
Ejemplo:
5 (0b101) << 2 → 0b10100 = 20
🔸 Opción 2: Desplazamiento a la derecha (LSR)
lsr w1, w1, w2
Ejemplo:
20 (0b10100) >> 2 → 0b101 = 5
Resultado se guarda en w19.
🖨️ mostrar_resultado – Salida
-
Imprime resultado en decimal:
adr x0, msg_resultado
bl printf
-
Imprime mensaje “En binario:”
adr x0, msg_binario
bl printf
-
Loop de 32 bits para imprimir en binario:
mov w20, #32 ; contador desde 31 hasta 0
mostrar_bits:
sub w20, w20, #1
lsr w21, w19, w20 ; rota bits hacia la derecha w20 veces
and w1, w21, #1 ; se queda solo con el bit más bajo (LSB)
adr x0, msg_bit
bl printf
Esto imprime bit por bit, de más significativo a menos significativo (MSB → LSB).
✅ Ejemplo completo
Entrada:
Opción: 1 (LSL)
Número: 5
Posiciones: 2
Salida:
Resultado: 20
En binario: 00000000000000000000000000010100