Vcomputer
2019-09-26
前几天上了第一节计算机科学导论课,使用的教材是《计算机科学导论——思想与方法》(豆瓣 / 京东 / 当当),书中给出了“一个取名为 Vcomputer 的基于冯·诺伊曼的计算机器”。
基本结构
-
处理器:
- 16 个通用寄存器(8 位):R0, R1, R2 ... RE, RF
- 程序计数器(8 位)
- 指令寄存器(16 位)
- 内存:
- 一块容量“高达” 256 字节的主内存
指令集
这个机器使用固定长度的指令,每条指令 2 字节(16 位),前 4 位为操作码,后 12 位为操作数(其中包含一个或两个参数)。
下面列出这个机器的指令集:
机器码* | 汇编 | 描述 |
---|---|---|
1RXY |
Load R, [XY] |
将主存中地址 XY 的内容读取到寄存器 R |
2RXY |
Load R, XY |
将数 XY 写入到寄存器 R |
3RXY |
Store R, [XY] |
将寄存器 R 的值写入到地址 XY |
40RS |
Mov R, S |
将寄存器 R 的值复制到寄存器 S 中 |
5RST |
Add R, S, T |
将寄存器 S 与 T 的数值(补码)相加,结果存入到寄存器 R 中 |
6R0X |
Shl R, X |
将寄存器 R 中的数左移 X 位,用 0 填充腾空的位 |
7R00 |
Not R |
将寄存器 R 中的数按位取反 |
8RXY |
Jmp R, XY |
如果寄存器 R 与寄存器 0 的值相同,将程序计数器的值设为 XY |
9000 |
Halt |
停机 |
* HEX 表示的机器码格式,1 位 HEX 恰好对应 4 位 BIN,因此每条指令的机器码可用 4 位 HEX 表示。
虚拟机实现
这是 Vcomputer 虚拟机的 JavaScript 实现,可以在网页中运行。
进行中:Vcomputer
待完成:
基本功能界面美化- 状态编辑器
- 存取操作可视化
- 汇编器 / 反汇编器
程序示例
(To be done)
(因为我还没有写过有用的 Vcomputer 程序)
扩展
这个机器的指令集可能太少了,特别是如果你需要标准输入输出或者绘图…… 甚至是扩展物理地址空间?
下面是一些瞎想的扩展指令:
机器码* | 汇编 | 描述 |
---|---|---|
AM0R |
Print M, R |
将寄存器 R 的值作为数字(M 为 0 时)或作为字符(M 为 1 时)输出 |
BM0R |
Input M, R |
请求用户输入数值或字符(取决于 M),结果存入寄存器 R |
CVXY |
Draw V, X, Y |
更改画布里一个像素的颜色,三个寄存器 V、X、Y 分别提供颜色、横坐标、纵坐标 |
... | ||
F??? |
????? | 为更长的指令预留 |
(目前并没有实现这些指令。)