姜詠江
我在2006年自己造的計算機,是從器件設計開始,設計制造的有52條指令的計算機(見圖)。別小瞧它!這可是一臺通用計算機,只不過是運行在二進制層面上的。所以只有相當水平的計算機專業(yè)人士才可以認可它。
這是一個8位的計算機,內(nèi)有求255以內(nèi)自然數(shù)階乘的程序。255的階乘結果有多大?告訴你,有210個字節(jié)!這個計算機能夠絲毫不差的將結果算出來,而且能夠用走馬燈和液晶屏顯示給你看。這個計算機的指令系統(tǒng)在后面,為了用戶能夠方便地使用這臺計算機,我還專門設計了編輯編譯軟件。不過這臺計算機的存儲器太小,編輯編譯的工作還得在你手頭的電腦上完成。不過這絲毫不會降低你深入理解計算機的核心。當你手動開關和按鈕,將編譯好的二進制程序送入這臺計算機,并且很快就會得到結果的時候,一定會很興奮。我當時的興奮勁兒,你也許能夠理解,因為這是我自己制造的計算機。
一晃,十年的時間過去了。利用這臺計算機的硬件,我當時還制造了動態(tài)計算機PMC362。針對動態(tài)計算機的設計,當時我還申請了國家專利,然而。。。
除了每年我給20多個研究生講自己如何制造計算機,或者有一些讀了我的《自己設計制作CPU與單片機》一書的人,中國的計算機業(yè)界卻是無動于衷,大家的眼睛總是盯著西方的高人嘛,因而我想推廣動態(tài)計算機的設計在國內(nèi)十分艱難。不過國外倒是有人找過我,告訴我,我的專利已經(jīng)失效等,讓我明白了權利。不論如何,研究給我?guī)淼呐d趣,遠遠超過了其它。自娛自樂是每個科研人獨享的樂趣不是?
我設計制造的這臺計算機用于研究生或者本科生教學最好不過,因為通過它,你可以從無到有,從硬件到軟件,系統(tǒng)地學習和掌握計算機的全部理論知識?,F(xiàn)在大學計算機專業(yè)的教學課程設置實在是不敢恭維,最重要是缺乏系統(tǒng)性,將一些完全可以在使用中自學的東西拿到大學課堂上講,實在是浪費學生的生命!一句話,中國的大學缺少真正的計算機科學教育家。我在十年前這樣說過,現(xiàn)在還這樣說。沒有自己設計制造過計算機的人,成不了真正的計算機專家。
計算機科學是一個非常系統(tǒng)的體系,它和計算機應用是截然不同目標的東西。將計算機應用做為計算機專業(yè)的主要內(nèi)容,真不知道那些專家們是如何考慮的。中國要成為世界強國,實現(xiàn)中華民族偉大復興,在計算機科學最核心的領域不能走在前面,不去造就一大批未來的人才,在如此信息化的人類時代,恐怕成為空談是有可能的。
說遠了。還是勸有心人,自己去制造一臺計算機試試,你的收獲會無比的大。
檢驗程序運行的例子
call 乘積子程序地址;call 自然數(shù)和子程序地址;call轉(zhuǎn)十進制子程序地址;call 階乘子程序地址。
它們對應的具體輸入是:88 300E 80 (調(diào)用8位無符號整數(shù)乘積);88 70 0F 80 (調(diào)用小于22的自然數(shù)和程序);88 92 3F 80 (調(diào)用將8位正十六進制數(shù)化成十進制數(shù)程序(液晶版));88 60 0E 80(調(diào)用255以內(nèi)階乘,階乘結果的最后2位是十六進制數(shù)是字節(jié)數(shù))?!?8’是call的編碼,后面十六進制的16位地址輸入時低字節(jié)在前,高字節(jié)在后,‘80’是程序輸入結束代碼。
表1 PMC教學計算機指令集
序號
功能設想
英文助記符
操作碼
次數(shù)
操作碼
(2進制)
1
把R數(shù)據(jù)存儲單元內(nèi)容送到累加器da
LDA R
81
3
10000001
2
數(shù)據(jù)存儲單元R的內(nèi)容與累加器da的內(nèi)容相加結果送da
ADD R
82
3
10000010
3
用累加器da的內(nèi)容減去數(shù)據(jù)存儲單元R的內(nèi)容結果送da
SUB R
83
3
10000011
4
將R存儲單元內(nèi)容輸出
OUT R
84
3
10000100
5
跳到程序存儲器的R單元取指令執(zhí)行
JMP R
85
3
10000101
6
如果累加器da的值是0則跳到程序存儲器的R單元取指令
JZ R
86
3
10000110
7
如果累加器da的值為負則跳到程序存儲器的R單元取指令
JN R
87
3
10000111
8
調(diào)子程序
CALL R
88
3
10001000
9
輸入數(shù)據(jù)到數(shù)據(jù)存儲器的R存儲單元
IN R
89
3
10001001
10
將累加器da的內(nèi)容送到數(shù)據(jù)存儲器存儲單元R
STR R
8A
3
10001010
11
將數(shù)N送到累加器da
SDA N
8B
2
10001011
12
將累加器da的內(nèi)容入棧
PUSH
4C
1
01001100
13
將堆棧的內(nèi)容送到累加器da
POP
4D
1
01001101
14
從子程序返回指令
RET
4E
1
01001110
15
將PTR的內(nèi)容加1
INC
4F
1
01001111
16
將PTR的內(nèi)容減1
DEC
50
1
01010000
17
將累加器da的內(nèi)容送x寄存器
DATX
51
1
01010001
18
將累加器da的內(nèi)容送y寄存器
DATY
52
1
01010010
19
將寄存器x、y的內(nèi)容互換
XCHY
53
1
01010011
20
x的內(nèi)容送da
XTDA
54
1
01010100
21
y的內(nèi)容送da
YTDA
55
1
01010101
22
將累加器da的內(nèi)容送到ptr低8位
DALP
56
1
01010110
23
將ptr的低8位內(nèi)容送到累加器da
PLDA
57
1
01010111
24
將累加器da復位為0
ZERO
58
1
01011000
25
將數(shù)據(jù)輸入到ptr指示的程序存儲單元
INP
59
1
01011001
26
如果除數(shù)為0則跳轉(zhuǎn)到程序的R單元指令執(zhí)行
JERR R
9A
3
10011010
27
如果輸入的數(shù)據(jù)是h80則跳轉(zhuǎn)到程序的R單元指令執(zhí)行
JEND R
9B
3
10011011
28
左移一位是1跳轉(zhuǎn)到R單元指令執(zhí)行
JL R
9C
3
10011100
29
右移一位是1跳轉(zhuǎn)到R單元指令執(zhí)行
JR R
9D
3
10011101
30
輸入緩沖區(qū)空暫停
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
執(zhí)行下一條指令
NOP
65
1
01100101
38
將累加器da的內(nèi)容送到指針ptr高8位
DAHP
66
1
01100110
39
將指針ptr的高8位內(nèi)容送到累加器da
PHDA
67
1
01100111
40
輸入數(shù)據(jù)送到ptr指示的數(shù)據(jù)存儲單元
INPD
68
1
01101000
41
將da的值送到ptr指示單元
DAPD
69
1
01101001
42
將ptr指示單元內(nèi)容送da
DPDA
6A
1
01101010
43
有符號da與R單元相乘,結果低字節(jié)送da,高字節(jié)送x
MULS R
AB
3
10101011
44
累加器da與R單元相除,商送da,余數(shù)送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單元相乘,結果低字節(jié)送da,高字節(jié)送x
MULT R
AF
3
10101111
48
無符號da×R+x,本位結果送da,進位字節(jié)送x
MADD R
B0
3
10110000
49
進位為1跳轉(zhuǎn)
JCRY R
B1
3
10110001
50
清除進位
NCTY
B2
1
10110010
51
停止程序執(zhí)行
STP
7F
1
01111111
52
程序輸入結束
END
80
1
10000000