GNU/Linux xterm bash 147 views

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?

  1. Muestra un menú para que el usuario elija:
    • 1: Desplazamiento a la izquierda (LSL)
    • 2: Desplazamiento a la derecha (LSR)
    • 3: Salir
  2. Pide un número y la cantidad de bits a desplazar
  3. 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

  1. Imprime resultado en decimal:
adr x0, msg_resultado
bl printf
  1. Imprime mensaje “En binario:”
adr x0, msg_binario
bl printf
  1. 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