三十小步,走进计算机

OpenKernel 课程

理解概念,在可见 CPU 中试做,再解决由机器检查的挑战。从三条指令开始,最终完成自己的小程序。

无需账户或安装。只有程序通过全部挑战案例,才完成一课。进度和徽章留在此浏览器中。

开始第 1 课 → 打开免费实验室

你的进度

进度在你的浏览器中载入。

完成一个单元即可获得徽章。徽章记录通过的挑战,而非访问次数。

隐私浏览、清除网站数据或更换设备可能删除本地记录。你可以按任意顺序学习。

单元 1 · 约 20 分钟

认识机器

解释取指与执行、寄存器、PC、输出和停止。

已通过 0 / 3 个挑战

  1. 你的第一个表情符号程序 · 5 分钟

    将数字送入 CPU,输出它,然后停止。

  2. 认识寄存器 · 8 分钟

    使用八个快速工作区,并保留需要的数值。

  3. 跟随程序计数器 · 7 分钟

    阅读轨迹,区分源代码行与指令地址。

单元 2 · 约 28 分钟

算术与输入

保存输入,用测试案例构建整数计算。

已通过 0 / 3 个挑战

  1. 表情符号数学 · 9 分钟

    用有序步骤组合加法、减法和乘法。

  2. 除法与余数 · 9 分钟

    解释向下取整除法和带符号余数,包括负数情况。

  3. 双输入计算器 · 10 分钟

    编写可复用的计算器,而不是固定答案。

单元 3 · 约 28 分钟

字节内存

区分数值与地址,读取和写入字节存储。

已通过 0 / 3 个挑战

  1. 内存:计算机的笔记本 · 10 分钟

    覆盖 R0 后,实际取回已经保存的字节。

  2. 寄存器中的地址 · 9 分钟

    将地址当作数据,读取查找表。

  3. 字节与边界 · 9 分钟

    观察为什么内存数值会绕回,而寄存器不会。

单元 4 · 约 29 分钟

判断与标志

用比较、余数和带标签的路径表达决定。

已通过 0 / 3 个挑战

  1. 条件逻辑:作出决定 · 10 分钟

    比较数值,再根据保存的标志选择路径。

  2. 偶数还是奇数 · 9 分钟

    使用余数和分支判断输入。

  3. 依据内存作出决定 · 10 分钟

    根据保存的数据判断,并记录结果。

单元 5 · 约 34 分钟

重复与计数器

使用有界循环、零次情况、计数器和累加器。

已通过 0 / 3 个挑战

  1. 循环:重复执行 · 10 分钟

    配对 LOOP 与 RETURN,正确处理零次重复。

  2. 编写计数器 · 12 分钟

    输出 1 到 10,并推广到可变计数。

  3. 从一加到 N · 12 分钟

    将累加总和与循环计数器分开保存。

单元 6 · 约 42 分钟

有状态的算法

描述并检查阶乘、斐波那契和反向复制的不变量。

已通过 0 / 3 个挑战

  1. 阶乘与循环不变量 · 12 分钟

    使用乘法累加器,并解释为什么 0! 等于 1。

  2. 斐波那契数列 · 15 分钟

    保留前两个值,以安全的顺序更新。

  3. 反向复制内存缓冲区 · 15 分钟

    使用来源和目标指针,倒序复制缓冲区。

单元 7 · 约 39 分钟

栈与函数

使用后进先出数据、调用帧和保存/恢复约定。

已通过 0 / 3 个挑战

  1. 栈操作:后进先出 · 12 分钟

    将数值保存到数据栈,再倒序取回。

  2. 调用子程序 · 12 分钟

    复用代码,并返回 CALL 后面的指令。

  3. 保留调用者的状态 · 15 分钟

    函数需要临时工作区时,采用保存与恢复约定。

单元 8 · 约 39 分钟

位与表示

选择和翻转位,解释有符号 32 位行为。

已通过 0 / 3 个挑战

  1. 位掩码与标志 · 12 分钟

    用 AND 选择单个位,用 OR 设置位。

  2. 翻转位 · 12 分钟

    利用 XOR 的可逆变化更新保存的设置。

  3. 有符号位与最大值 · 15 分钟

    理解 NOT,用符号掩码检查有符号差值。

单元 9 · 约 45 分钟

调度、核心与事件

区分调度策略、工作划分和处理程序状态恢复。

已通过 0 / 3 个挑战

  1. 协作式调度 · 15 分钟

    让任务轮流执行,区分策略与 CPU 指令。

  2. 跨核心划分工作 · 15 分钟

    拆分独立作业,并合并结果。

  3. 中断与处理程序 · 15 分钟

    处理事件,再恢复被中断的前台数值。

单元 10 · 约 56 分钟

构建小程序

结合指令集,编写游戏、缓冲区工具和作业分派器。

已通过 0 / 3 个挑战

  1. 迷你目标游戏 · 18 分钟

    用保存的状态与计分规则制作三轮游戏。

  2. 用栈实现缓冲区工具 · 18 分钟

    结合输入、循环、栈和索引存储。

  3. 你自己的迷你操作系统 · 20 分钟

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

欢迎首次编程的学习者

三个入门指南

遵循简短步骤,预测输出。在实验室打开完全相同的程序,再完成相应课程挑战,检查自己的答案。

你的第一个程序

编写输出 42 的程序,再查看它的执行轨迹。

  1. 从指令面板插入 📥 LOAD。
  2. 在 LOAD 后写上数字 42。
  3. 在下一行添加 🖨️ PRINT。
  4. 在最后一行添加 ⏹️ HALT。
  5. 运行程序,确认实际输出窗口显示 42。
  6. 逐步执行,观察 R0、PC 和输出。
📥 42
🖨️
⏹️

预期输出: 42

在实验室打开指南 →

开始课程挑战 →

表情符号数学

计算 10 + 5,观察累加器如何变化。

  1. 插入 📥 LOAD。
  2. 载入数字 10。
  3. 在下一行添加 ➕ ADD。
  4. 将 ADD 的操作数设为 5。
  5. 添加 🖨️ PRINT 显示结果。
  6. 添加 ⏹️ HALT 停止执行。
  7. 运行程序,确认输出窗口显示 15。
  8. 再次逐步执行,说明为什么 PRINT 读到的是总和。
📥 10
➕ 5
🖨️
⏹️

预期输出: 15

在实验室打开指南 →

开始课程挑战 →

倒计时循环

利用带标签的出口,从五倒数到一。

  1. 插入 📥 LOAD。
  2. 将起始计数设为 5。
  3. 给 PRINT 指令加上标签 again:,让跳转目的地清晰可见。
  4. 在打印之后添加 ➖ SUB。
  5. 每轮减去 1。
  6. 紧接着 SUB 添加 ❓ JUMP_IF_ZERO。
  7. 使用标签 done 作为退出目标。
  8. 添加 ⏭️ JUMP,让程序继续计数。
  9. 使用标签 again 返回 PRINT。
  10. 在循环之后添加 done: ⏹️ HALT。
  11. 运行程序,确认实际输出为 5、4、3、2、1。
  12. 跟踪最后一次减法:零标志变为真,执行到达 HALT。
📥 5
again: 🖨️
➖ 1
❓ done
⏭️ again
done: ⏹️

预期输出: 5, 4, 3, 2, 1

在实验室打开指南 →

开始课程挑战 →