|||
姜咏江
我在2006年自己造的计算机,是从器件设计开始,设计制造的有52条指令的计算机(见图)。别小瞧它!这可是一台通用计算机,只不过是运行在二进制层面上的。所以只有相当水平的计算机专业人士才可以认可它。
这是一个8位的计算机,内有求255以内自然数阶乘的程序。255的阶乘结果有多大?告诉你,有210个字节!这个计算机能够丝毫不差的将结果算出来,而且能够用走马灯和液晶屏显示给你看。这个计算机的指令系统在后面,为了用户能够方便地使用这台计算机,我还专门设计了编辑编译软件。不过这台计算机的存储器太小,编辑编译的工作还得在你手头的电脑上完成。不过这丝毫不会降低你深入理解计算机的核心。当你手动开关和按钮,将编译好的二进制程序送入这台计算机,并且很快就会得到结果的时候,一定会很兴奋。我当时的兴奋劲儿,你也许能够理解,因为这是我自己制造的计算机。
一晃,十年的时间过去了。利用这台计算机的硬件,我当时还制造了动态计算机PMC362。针对动态计算机的设计,当时我还申请了国家专利,然而。。。
除了每年我给20多个研究生讲自己如何制造计算机,或者有一些读了我的《自己设计制作CPU与单片机》一书的人,中国的计算机业界却是无动于衷,大家的眼睛总是盯着西方的高人嘛,因而我想推广动态计算机的设计在国内十分艰难。不过国外倒是有人找过我,告诉我,我的专利已经失效等,让我明白了权利。不论如何,研究给我带来的兴趣,远远超过了其它。自娱自乐是每个科研人独享的乐趣不是?
我设计制造的这台计算机用于研究生或者本科生教学最好不过,因为通过它,你可以从无到有,从硬件到软件,系统地学习和掌握计算机的全部理论知识。现在大学计算机专业的教学课程设置实在是不敢恭维,最重要是缺乏系统性,将一些完全可以在使用中自学的东西拿到大学课堂上讲,实在是浪费学生的生命!一句话,中国的大学缺少真正的计算机科学教育家。我在十年前这样说过,现在还这样说。没有自己设计制造过计算机的人,成不了真正的计算机专家。
计算机科学是一个非常系统的体系,它和计算机应用是截然不同目标的东西。将计算机应用做为计算机专业的主要内容,真不知道那些专家们是如何考虑的。中国要成为世界强国,实现中华民族伟大复兴,在计算机科学最核心的领域不能走在前面,不去造就一大批未来的人才,在如此信息化的人类时代,恐怕成为空谈是有可能的。
说远了。还是劝有心人,自己去制造一台计算机试试,你的收获会无比的大。
检验程序运行的例子
call 乘积子程序地址;call 自然数和子程序地址;call转十进制子程序地址;call 阶乘子程序地址。
它们对应的具体输入是:88 300E 80 (调用8位无符号整数乘积);88 70 0F 80 (调用小于22的自然数和程序);88 92 3F 80 (调用将8位正十六进制数化成十进制数程序(液晶版));88 60 0E 80(调用255以内阶乘,阶乘结果的最后2位是十六进制数是字节数)。‘88’是call的编码,后面十六进制的16位地址输入时低字节在前,高字节在后,‘80’是程序输入结束代码。
表1 PMC教学计算机指令集
序号 | 功能设想 | 英文助记符 | 操作码 | 次数 | 操作码 (2进制) |
1 | 把R数据存储单元内容送到累加器da | LDA R | 81 | 3 | 10000001 |
2 | 数据存储单元R的内容与累加器da的内容相加结果送da | ADD R | 82 | 3 | 10000010 |
3 | 用累加器da的内容减去数据存储单元R的内容结果送da | SUB R | 83 | 3 | 10000011 |
4 | 将R存储单元内容输出 | OUT R | 84 | 3 | 10000100 |
5 | 跳到程序存储器的R单元取指令执行 | JMP R | 85 | 3 | 10000101 |
6 | 如果累加器da的值是0则跳到程序存储器的R单元取指令 | JZ R | 86 | 3 | 10000110 |
7 | 如果累加器da的值为负则跳到程序存储器的R单元取指令 | JN R | 87 | 3 | 10000111 |
8 | 调子程序 | CALL R | 88 | 3 | 10001000 |
9 | 输入数据到数据存储器的R存储单元 | IN R | 89 | 3 | 10001001 |
10 | 将累加器da的内容送到数据存储器存储单元R | STR R | 8A | 3 | 10001010 |
11 | 将数N送到累加器da | SDA N | 8B | 2 | 10001011 |
12 | 将累加器da的内容入栈 | PUSH | 4C | 1 | 01001100 |
13 | 将堆栈的内容送到累加器da | POP | 4D | 1 | 01001101 |
14 | 从子程序返回指令 | RET | 4E | 1 | 01001110 |
15 | 将PTR的内容加1 | INC | 4F | 1 | 01001111 |
16 | 将PTR的内容减1 | DEC | 50 | 1 | 01010000 |
17 | 将累加器da的内容送x寄存器 | DATX | 51 | 1 | 01010001 |
18 | 将累加器da的内容送y寄存器 | DATY | 52 | 1 | 01010010 |
19 | 将寄存器x、y的内容互换 | XCHY | 53 | 1 | 01010011 |
20 | x的内容送da | XTDA | 54 | 1 | 01010100 |
21 | y的内容送da | YTDA | 55 | 1 | 01010101 |
22 | 将累加器da的内容送到ptr低8位 | DALP | 56 | 1 | 01010110 |
23 | 将ptr的低8位内容送到累加器da | PLDA | 57 | 1 | 01010111 |
24 | 将累加器da复位为0 | ZERO | 58 | 1 | 01011000 |
25 | 将数据输入到ptr指示的程序存储单元 | INP | 59 | 1 | 01011001 |
26 | 如果除数为0则跳转到程序的R单元指令执行 | JERR R | 9A | 3 | 10011010 |
27 | 如果输入的数据是h80则跳转到程序的R单元指令执行 | JEND R | 9B | 3 | 10011011 |
28 | 左移一位是1跳转到R单元指令执行 | JL R | 9C | 3 | 10011100 |
29 | 右移一位是1跳转到R单元指令执行 | JR R | 9D | 3 | 10011101 |
30 | 输入缓冲区空暂停 | STPK | 5E | 1 | 01011110 |
31 | 求da值的按位逻辑非,结果在da | LNOT | 5F | 1 | 01011111 |
32 | Da与R存储单元的逻辑与放入da | LAND R | A0 | 3 | 10100000 |
33 | Da与R存储单元的逻辑或放入da | LOR R | A1 | 3 | 10100001 |
34 | Da与存储单元R的逻辑异或放入da | LXOR R | A2 | 3 | 10100010 |
35 | 将da左移一位送x,da不变 | SHL | 63 | 1 | 01100011 |
36 | 将da右移一位送x,da不变 | SHR | 64 | 1 | 01100100 |
37 | 执行下一条指令 | NOP | 65 | 1 | 01100101 |
38 | 将累加器da的内容送到指针ptr高8位 | DAHP | 66 | 1 | 01100110 |
39 | 将指针ptr的高8位内容送到累加器da | PHDA | 67 | 1 | 01100111 |
40 | 输入数据送到ptr指示的数据存储单元 | INPD | 68 | 1 | 01101000 |
41 | 将da的值送到ptr指示单元 | DAPD | 69 | 1 | 01101001 |
42 | 将ptr指示单元内容送da | DPDA | 6A | 1 | 01101010 |
43 | 有符号da与R单元相乘,结果低字节送da,高字节送x | MULS R | AB | 3 | 10101011 |
44 | 累加器da与R单元相除,商送da,余数送x | DIVI R | AC | 3 | 10101100 |
45 | 累加器da与R单元带进位加,结果送da,进位保留 | ADDC R | AD | 3 | 10101101 |
46 | 累加器da与R单元带进位减,结果送da,进位保留 | SUBC R | AE | 3 | 10101110 |
47 | 无符号da与R单元相乘,结果低字节送da,高字节送x | MULT R | AF | 3 | 10101111 |
48 | 无符号da×R+x,本位结果送da,进位字节送x | MADD R | B0 | 3 | 10110000 |
49 | 进位为1跳转 | JCRY R | B1 | 3 | 10110001 |
50 | 清除进位 | NCTY | B2 | 1 | 10110010 |
51 | 停止程序执行 | STP | 7F | 1 | 01111111 |
52 | 程序输入结束 | END | 80 | 1 | 10000000 |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-21 22:04
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社