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.