← 全部课程

构建小程序 · 第 30 / 30 课 · 约 20 分钟

你自己的迷你操作系统

将队列作业分派到可复用服务,并记录结果。

01 / 解释

理解概念

操作系统协调资源,并向程序提供服务。最终项目是刻意简化的小型分派器,不是完整的现代操作系统:它消耗作业队列,选择服务,调用服务,再记录结果。

每个作业包含操作代码和值。代码 0 加倍,代码 1 求平方,代码 2 加一。输出保留完整整数结果,内存结果日志只保存字节。在系统实验室研究这些概念相关的调度、独立核心状态和事件处理。

02 / 试做

观察实际执行

两个服务结果为 8 和 9。挑战再加入队列、分派分支及第三项服务。

LOAD 4
CALL double
STORE 64
PRINT
LOAD 3
CALL square
STORE 65
PRINT
HALT
double: MUL 2
RETURN
square: MUL R0
RETURN

用单步一次跟踪一条指令。你可以修改示例并重新执行。

03 / 挑战

让它正确运行

读取 N(0–3),再读取 N 对(操作、数值)。操作 0 加倍,1 求平方,2 加一。通过 CALL 子程序分派。输出每个完整结果,并按作业顺序把结果字节存入地址 64、65、……。

检查器为 4 个测试案例分别在全新机器上运行当前编辑器程序,并自行提供输入和预设内存。实验室当前输出和内存不会决定结果。

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
需要提示?

载入操作代码执行 CMP 前,先保存作业值。调用所选服务前,立刻恢复该值。

查看完整示例答案

阅读程序,预测每条指令的效果,再在实验室逐步执行。

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
RETURN

表情符号 CPU 实验室

就绪 · 0 个周期

表情符号程序

输入 LOAD、ADD 或其他操作码,再按空格插入表情符号。Ctrl/⌘ + Enter 运行或暂停;Escape 暂停;Ctrl/⌘ + ] 缩进。Tab 移动焦点。标签使用冒号,跳转使用从零开始的指令地址。

指令映射与断点(0)

断点在指令执行前停止。运行会跳过一次当前已停止断点并继续;单步直接执行它。编辑源代码会清除旧断点和机器状态。

    CPU 寄存器

    R0
    0
    R1
    0
    R2
    0
    R3
    0
    R4
    0
    R5
    0
    R6
    0
    R7
    0
    程序计数器(PC)
    0
    栈指针(SP)
    255
    标志
    零: 关 · 负: 关 · 溢出: 关
    延迟请求
    0 ms
    栈与循环帧

    SP = 255 − 数据深度 − 调用深度。栈独立于内存。

    数据栈(底 → 顶)

    空

    调用返回地址(底 → 顶)

    空

    循环帧

    空

    输出与输入

    执行 PRINT 指令以查看输出。

    排队的输入: 空

    内存 · 256 字节 · 0 个非零

    每个单元显示地址:数值。R = 本步读取;W = 本步写入。选择单元以检查,或在执行前初始化。方向键移动,Home/End 定位行首或行尾,Ctrl/⌘ + Home/End 定位整个内存的起点或终点。

    初始化内存前请重置。保存数值绕回 0–255。
    执行轨迹 · 0 项

    下方显示最近记录。检查任意从零开始的索引,查看完整独立的执行前后状态。

    检查你的挑战

    随时可以检查。全部案例通过后才记录完成。

    进度仅使用 localStorage,保留在此浏览器,从不发送至服务器。