El código implementa una cola (queue) con operaciones básicas como insertar (enqueue), eliminar (dequeue), ver el frente (peek) y mostrar todo el contenido.
🧠 Resumen general
Este programa de ARM64 corre en un loop mostrando un menú al usuario para interactuar con una cola implementada como arreglo en memoria. Usa llamadas a printf y scanf para entrada/salida y gestiona la cola usando dos índices: front y rear.
📦 Sección .data
Aquí se declaran:
-
Mensajes (
msg_menu, msg_enq, etc.)
-
Arreglo
queue: espacio reservado para 10 enteros (.skip 40)
-
Variables:
queue_size, front, rear, opcion, valor
🧭 Flujo del Programa en .text
🔹 main (función principal)
stp x29, x30, [sp, -16]!
mov x29, sp
Guarda el frame pointer (x29) y el link register (x30) en la pila para comenzar la función.
🔁 menu_loop
Muestra el menú y espera que el usuario ingrese una opción.
adr x0, msg_menu
bl printf
adr x0, formato_int
adr x1, opcion
bl scanf
Después carga el valor de la opción para decidir qué hacer:
ldr w0, [x0]
cmp w0, #5
b.eq fin_programa // salir
cmp w0, #1
b.eq enqueue // insertar
cmp w0, #2
b.eq dequeue // eliminar
cmp w0, #3
b.eq peek_elemento // ver frente
cmp w0, #4
b.eq mostrar_cola // mostrar contenido
🟢 enqueue (Insertar elemento)
1. Verifica si la cola está llena:
ldr w21, [rear]
ldr w22, [queue_size]
sub w22, w22, #1
cmp w21, w22
b.ge cola_llena
2. Si no está llena, pide un número y lo guarda:
bl scanf
Si front == -1, lo pone a 0 (cola estaba vacía). Luego incrementa rear y guarda el valor en queue[rear].
str w22, [queue, rear * 4]
🔴 dequeue (Eliminar elemento)
-
Verifica si la cola está vacía (
front == -1)
-
Muestra el valor de
queue[front]
-
Si
front == rear, reinicia cola (front = rear = -1)
-
Si no, incrementa
front
👁️ peek_elemento
Muestra queue[front] sin eliminarlo.
📃 mostrar_cola
Itera desde front hasta rear, imprime cada elemento.
⚠️ cola_vacia y cola_llena
Subrutinas que imprimen mensaje si la cola no puede operar.
🛑 fin_programa
Restablece x29 y x30, y hace ret.
📝 Comentario final
Este código es excelente para practicar:
-
Manejo de arrays y punteros
-
Comparaciones y saltos condicionales (
b.eq, cmp)
-
Acceso indirecto a memoria (
[x20, w21, SXTW #2] usa el índice como offset multiplicado por 4)