Programming for Kids:用4917 CPU模拟器带孩子亲手调试机器码(汇编器+反汇编器实战)
【免费下载链接】programming-for-kidsbook for parents and kids.项目地址: https://gitcode.com/gh_mirrors/pr/programming-for-kids
如果孩子对电脑"内部到底在做什么"充满好奇,那么4917 CPU模拟器就是一趟最好的入门旅程。它是开源项目 Programming for Kids 中的核心教具:一台只有 16 字节内存的 4 位计算机,配合汇编器、反汇编器和可视化调试器,让孩子像玩桌游一样亲手读写、调试机器码,亲眼看到每条指令如何被 CPU 一步步执行。本文为你带来一份完整的亲子实战指南,零基础也能快速上手。
为什么推荐用 4917 CPU模拟器教孩子机器码?
真正的机器码又长又难懂,直接讲会让大人小孩都崩溃。4917 的聪明之处在于把计算机简化到只剩最本质的东西:
- 只有 2 个通用寄存器 R0、R1 和 1 个指令指针 IP;
- 内存只有 16 个格子,每个格子放一个 0~15 的数字;
- 全部指令只有 16 条,一天就能讲完。
它源自 Richard Buckland 的 4 位计算机教学思路,项目作者用它陪女儿每周学两三次,把"取指—译码—执行"(fetch-execute cycle)、指针、自修改程序、整数溢出等大学才讲的概念,变成了看得见、摸得着、能亲手操作的小实验。
先认识这台迷你计算机:16 字节内存怎么跑程序
打开 example.prg 就能看到 4917 的"世界":上面是 IP、IS、R0、R1 四个状态寄存器,下面是一张 4×4 的 16 格内存表。CPU 每走一步,就有一格数字被点亮,孩子能清清楚楚看到指令从哪里取、结果写到哪里。
指令集非常精简(完整定义见 instruction_set.py):
| 操作码 | 助记符 | 作用 |
|---|---|---|
| 0 | HLT | 停机 |
| 1 / 2 | ADD / SUB | R0 = R0 + R1 / R0 = R0 - R1 |
| 3~6 | INC / DEC | 寄存器加 1 / 减 1 |
| 7 / 8 | BEEP / PRINT | 响铃 / 打印数字 |
| 9~12 | LD / ST | 内存与寄存器之间搬运数据 |
| 13~15 | B / BZ / BNZ | 跳转、条件跳转 |
就这 16 条指令,已经足够写出循环、判断、甚至"自己修改自己"的程序——这正是理解"代码即数据"的最佳入口。
汇编器实战:把英文单词变成机器码
孩子写机器码,最怕记一堆数字。4917 的汇编器(核心代码在 assembler.py,语法说明见 ASSEMBLER.md)解决了这个问题:用LD、ST、ADD这样的英文助记符写程序,汇编器会自动翻译成 0~15 的机器码。
比如一个"把 15 存进内存再打印"的小程序可以这样写:
LD R0,15 ST R0,3 LD R0,3 PRINT 0 HLT汇编器采用两遍扫描:第一遍收集所有标签(label)的地址,第二遍生成机器码,遇到count+1这样的"标签加偏移"也能自动计算。写错了也没关系,报错信息会带着行号和^箭头指给你看,非常友好。
反汇编器实战:把数字变回人话
反过来,当你拿到一串神秘的机器码(比如卡牌背面打印的矩阵),反汇编器(disassembler.py)会把它逐条翻译成INC R0、BZ 12这样的助记符。这就像给程序"解密",让孩子直观体会:同一串数字,既可以是数据,也可以是代码。
这也是 4917 最好玩的地方之一——作者特意准备了"自我修改程序"和"自我破坏程序"卡牌:程序运行到一半改写自己的指令,孩子会惊讶地发现,屏幕上的内容突然就变了。动手试过这一课,"图灵机""程序=数据"这些概念根本不用背。
调试器实战:一步步看 CPU 内部状态
光看结果不过瘾,4917 自带逐步调试器(入口在 simulator.py,核心循环在 cpu.py)。每按一次回车,CPU 就执行一条指令,屏幕上实时高亮当前执行的指令,并刷新 IP、R0、R1 和内存状态。孩子在 play.html 网页版里也能获得同样的体验。
家长可以这样带孩子"玩调试":
- 先猜:这条指令执行后 R0 会变成几?
- 再按回车验证;
- 猜错了就讨论为什么,顺便引入"取指周期"的概念。
玩过几次之后,建议再装一个 x64dbg,打开真实程序让孩子看看——原来家里的电脑也在干一模一样的事,只是更快、更复杂而已。
亲子玩法:54 张卡牌,从饭桌玩到电脑前
这个项目最初就是一套实体卡牌游戏,卡牌源码都在 deck/ 目录下,共 54 张小卡片,从最简单的00.prg到复杂的54.prg,循序渐进覆盖了:
- 变量与指针
- 取指执行周期
- 整数溢出与下溢
- 条件跳转与控制流
- 自我修改程序
- 代码即数据、数据即代码
- 调试技巧
打印规则见 deck.html,玩法详解在 guide.html。作者的真实经验是:不用正襟危坐,饭桌上、公交车上各抽一张卡片,一起"读代码、猜结果",孩子很快就上瘾。
最快上手方法:3 步跑起来
- 克隆仓库:
git clone https://gitcode.com/gh_mirrors/pr/programming-for-kids - 进入目录:
cd programming-for-kids - 运行模拟器:
python3 projects/4917/simulator.py projects/4917/deck/10.asm
.asm文件会自动走汇编器并以反汇编视图显示,.prg文件则直接以内存矩阵视图展示(参考 example.prg)。按回车单步执行,按m打开更多调试菜单,按q退出。
写在最后
很多家长觉得"汇编、机器码"是高手专属,其实孩子学起来反而更快——他们没有"这很难"的预设。4917 CPU模拟器 + 汇编器 + 反汇编器 + 卡牌这套组合,把最底层的计算机原理变成了可以亲手拆装的玩具。与其让孩子只玩别人做好的游戏,不如带 TA 亲手写一个能被 CPU 执行的程序,那种"我在指挥电脑"的成就感,是任何动画片都给不了的。
周末就试试吧,说不定下一台"电脑"就是你家孩子自己搭出来的。
【免费下载链接】programming-for-kidsbook for parents and kids.项目地址: https://gitcode.com/gh_mirrors/pr/programming-for-kids
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考