← Todas las lecciones

Planificación, núcleos y eventos · Lección 27 de 30 · unos 15 minutos

Interrupciones y manejadores

Atiende un evento y restaura el valor de la tarea interrumpida.

01 / Comprende

Comprender la idea

Una interrupción es un evento que desvía temporalmente una tarea hacia un manejador. Este debe guardar el estado que aún necesita el código interrumpido, realizar su trabajo y después reanudar la ejecución. El laboratorio de sistemas registra explícitamente la entrega del evento y la reanudación.

La CPU de 25 instrucciones no tiene una instrucción de interrupción oculta. Este reto modela un manejador con CALL y guardar/restaurar en la pila de datos. Tras el manejador, el valor original debe volver a R0; los bytes del evento están en las direcciones 240 y 241.

02 / Prueba

Observar qué ocurre

La salida será el valor original restaurado, 17, y después el resultado del evento, 5. La pila queda vacía al volver.

STORE 4 240
LOAD 17
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler: PUSH
LOAD [240]
ADD 1
STORE 241
POP
RETURN

Usa Avanzar un paso para seguir una instrucción cada vez. Puedes modificar el ejemplo y repetirlo.

03 / Reto

Hacerlo funcionar

Lee un entero de la tarea principal y después un byte de evento. Guarda el evento en la dirección 240. Llama a un manejador que escriba evento + 1 en la memoria de bytes 241 conservando R0 mediante PUSH/POP. Imprime el valor principal restaurado y después el resultado del evento guardado.

El comprobador ejecuta el programa actual del editor en una máquina nueva para cada uno de 3 casos. Suministra entradas y memoria inicial; la salida y memoria actuales del laboratorio no deciden el resultado.

INPUT
COPY R0 R1
INPUT
STORE 240
LOAD R1
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler:
  #
RETURN
¿Necesitas una pista?

Usa PUSH antes de cargar el evento y POP después de guardar el resultado del manejador.

Mostrar una solución resuelta

Lee el programa, predice el efecto de cada instrucción y después avanza paso a paso en el laboratorio.

INPUT
COPY R0 R1
INPUT
STORE 240
LOAD R1
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler: PUSH
LOAD [240]
ADD 1
STORE 241
POP
RETURN

Laboratorio de CPU con emojis

Listo · 0 ciclos

Programa con emojis

Escribe LOAD, ADD u otro código de operación y pulsa Espacio para insertar su emoji. Ctrl/⌘ + Intro ejecuta o pausa; Escape pausa; Ctrl/⌘ + ] añade sangría. Tab mueve el foco. Las etiquetas terminan en dos puntos. Los saltos usan direcciones de instrucción que empiezan en cero.

Mapa de instrucciones y puntos de interrupción (0)

Los puntos de interrupción detienen la ejecución antes de una instrucción. Ejecutar permite pasar una vez por el punto en el que se ha detenido; Avanzar un paso ejecuta esa instrucción directamente. Editar el código borra los puntos de interrupción anteriores y el estado de la máquina.

    Registros de la CPU

    R0
    0
    R1
    0
    R2
    0
    R3
    0
    R4
    0
    R5
    0
    R6
    0
    R7
    0
    Contador de programa (PC)
    0
    Puntero de pila (SP)
    255
    Indicadores
    Cero: inactivo · Negativo: inactivo · Desbordamiento: inactivo
    Espera solicitada
    0 ms
    Pilas y marcos de bucle

    SP = 255 − profundidad de datos − profundidad de llamadas. La pila está separada de la memoria.

    Pila de datos (fondo → cima)

    Vacío

    Direcciones de retorno de llamadas (fondo → cima)

    Vacío

    Marcos de bucle

    Vacío

    Salida y entrada

    Ejecuta una instrucción PRINT para ver la salida.

    Entrada en la cola: Vacío

    Memoria · 256 bytes · 0 distintos de cero

    Cada celda muestra dirección:valor. R = leído en este paso; W = escrito en este paso. Selecciona una celda para inspeccionarla o inicializarla antes de ejecutar. Usa las flechas para desplazarte, Inicio/Fin para la fila y Ctrl/⌘ + Inicio/Fin para toda la memoria.

    Reinicia antes de inicializar la memoria. Los valores guardados se ajustan al intervalo 0–255.
    Traza de ejecución · 0 entradas

    Abajo aparecen las entradas recientes. Inspecciona cualquier índice, empezando por cero, para ver una copia completa e independiente del estado anterior y posterior.

    Comprobar tu reto

    Puedes comprobarlo en cualquier momento. Todos los casos deben superar la prueba para registrar la finalización.

    El progreso usa solo almacenamiento local. Permanece en este navegador y nunca se envía a un servidor.