GNU/Linux xterm bash 134 views

Este código es un menú interactivo en consola que realiza operaciones lógicas a nivel de bits (AND, OR, XOR) sobre dos números enteros.


🧠 Resumen del programa

  • Muestra un menú con opciones: AND, OR, XOR y Salir.
  • Pide al usuario dos números.
  • Realiza la operación seleccionada.
  • Muestra el resultado tanto en decimal como en binario.
  • Repite el proceso hasta que el usuario seleccione salir.

🗂️ Sección .data – Declaración de mensajes y variables

msg_menu:       .string "\nOperaciones a nivel de bits\n1. AND\n2. OR\n3. XOR\n4. Salir\nSeleccione una opción: "
msg_num1:       .string "Ingrese el primer número: "
msg_num2:       .string "Ingrese el segundo número: "
msg_resultado:  .string "Resultado: %d\n"
msg_binario:    .string "En binario: "
msg_bit:        .string "%d"
msg_newline:    .string "\n"
formato_int:    .string "%d"

opcion:         .word 0
numero1:        .word 0
numero2:        .word 0
  • Son cadenas (.string) usadas con printf y scanf.
  • opcion, numero1, y numero2 son variables de 32 bits (.word) donde se almacenan los valores ingresados.

🧾 Sección .text – Lógica del programa

.global main
.align 2
main:
    stp x29, x30, [sp, -16]!
    mov x29, sp
  • Configura el stack frame: guarda el FP (x29) y LR (x30), típico en funciones C.

🔁 Inicio del bucle del menú

menu_loop:
    adr x0, msg_menu
    bl printf
  • Muestra el menú en consola.

🧑‍💻 Leer opción del usuario

adr x0, formato_int
adr x1, opcion
bl scanf
  • Usa scanf("%d", &opcion) para leer un entero.

🚪 Verificar si se seleccionó “Salir”

adr x0, opcion
ldr w0, [x0]
cmp w0, #4
b.eq fin_programa
  • Si opcion == 4, salta a fin_programa.

🔢 Lectura de números

adr x0, msg_num1
bl printf
adr x0, formato_int
adr x1, numero1
bl scanf

adr x0, msg_num2
bl printf
adr x0, formato_int
adr x1, numero2
bl scanf
  • Pide y almacena numero1 y numero2.

🧮 Seleccionar y realizar operación lógica

adr x0, numero1
ldr w1, [x0]
adr x0, numero2
ldr w2, [x0]
  • Carga los dos números en w1 y w2.
adr x0, opcion
ldr w0, [x0]

cmp w0, #1
b.eq hacer_and
cmp w0, #2
b.eq hacer_or
cmp w0, #3
b.eq hacer_xor
b menu_loop
  • Compara la opción y salta a la etiqueta correspondiente.

Operaciones lógicas

hacer_and:
    and w1, w1, w2
    b mostrar_resultado

hacer_or:
    orr w1, w1, w2
    b mostrar_resultado

hacer_xor:
    eor w1, w1, w2
  • Realiza la operación entre los dos números.

🖨️ Mostrar resultado en decimal y binario

mostrar_resultado:
    mov w19, w1
    adr x0, msg_resultado
    bl printf
  • Muestra el resultado decimal (aunque falta mov x1, x19 antes del printf).
adr x0, msg_binario
bl printf

mov w20, #32
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
  • Ciclo que imprime bit a bit el valor en binario desde el bit más significativo hasta el menos.
adr x0, msg_newline
bl printf
b menu_loop
  • Imprime salto de línea y vuelve al menú.

🚪 Fin del programa

fin_programa:
    mov w0, #0
    ldp x29, x30, [sp], 16
    ret
  • Restaura el stack y termina el programa.