Vcomputer

2019-09-26

前几天上了第一节计算机科学导论课,使用的教材是《计算机科学导论——思想与方法》(豆瓣 / 京东 / 当当),书中给出了“一个取名为 Vcomputer 的基于冯·诺伊曼的计算机器”。

基本结构

指令集

这个机器使用固定长度的指令,每条指令 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??? ????? 为更长的指令预留

(目前并没有实现这些指令。)