Construye pequeños programas · Lección 30 de 30 · unos 20 minutos
Tu propio minisistema operativo
Despacha trabajos en cola a servicios reutilizables y registra sus resultados.
01 / Comprende
Comprender la idea
Un sistema operativo coordina recursos y ofrece servicios a los programas. El proyecto final es un despachador muy pequeño, no un sistema operativo moderno completo: consume una cola de trabajos, elige un servicio, lo llama y registra resultados.
Cada trabajo tiene un código de operación y un valor. El código 0 duplica, el 1 eleva al cuadrado y el 2 suma uno. La salida conserva el resultado entero completo, mientras el registro de resultados en memoria guarda un byte. Usa el laboratorio de sistemas para investigar planificación, estado separado por núcleo y gestión de eventos.
02 / Prueba
Observar qué ocurre
Los resultados de los dos servicios son 8 y 9. El reto añade una cola, decisiones de despacho y un tercer servicio.
LOAD 4
CALL double
STORE 64
PRINT
LOAD 3
CALL square
STORE 65
PRINT
HALT
double: MUL 2
RETURN
square: MUL R0
RETURNUsa Avanzar un paso para seguir una instrucción cada vez. Puedes modificar el ejemplo y repetirlo.
03 / Reto
Hacerlo funcionar
Lee N (0–3) y después N pares (operación, valor). La operación 0 duplica, la 1 eleva al cuadrado y la 2 suma uno. Despacha mediante subrutinas CALL. Imprime cada resultado completo y guarda su byte en las direcciones 64, 65, … en el orden de los trabajos.
El comprobador ejecuta el programa actual del editor en una máquina nueva para cada uno de 4 casos. Suministra entradas y memoria inicial; la salida y memoria actuales del laboratorio no deciden el resultado.
INPUT
COPY R0 R3
LOAD 64 R2
LOOP R3
INPUT
COPY R0 R4
INPUT
COPY R0 R1
#
RETURN
HALT
double: MUL 2
RETURN
square: MUL R0
RETURN
increment: ADD 1
RETURN¿Necesitas una pista?
Guarda el valor del trabajo antes de cargar el código de operación para CMP. Restaura el valor justo antes de llamar al servicio elegido.
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 R3
LOAD 64 R2
LOOP R3
INPUT
COPY R0 R4
INPUT
COPY R0 R1
LOAD R4
CMP 0
JUMP_IF_ZERO doubleJob
CMP 1
JUMP_IF_ZERO squareJob
LOAD R1
CALL increment
JUMP finish
doubleJob: LOAD R1
CALL double
JUMP finish
squareJob: LOAD R1
CALL square
finish: STORE R2
PRINT
LOAD R2
ADD 1
COPY R0 R2
RETURN
HALT
double: MUL 2
RETURN
square: MUL R0
RETURN
increment: ADD 1
RETURNLaboratorio de CPU con emojis
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
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.
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.