为了描述方便,在没有正式名称之前,本山寨机以后就简称XPC。
第1阶段工作是要确定指令集,指令集是软硬件的分水岭,一般情况下这是计算机系统第一步要确定的事项。XPC采用MIPS指令集子集变形是确定了的,这种情况初期调试省去了写编译器的时间,仅对MIPS汇编代码做解释再汇编为机器码即可。基于减少硬件设计的原理,最终指令个数少于100是肯定的。
昨天下班后启动了仿真器和汇编链接器的编写, 仿真机以解释执行的方式执行,目前支持算术,分支,转移,load,store,IO(这个是为了初期调试方便特有执行,不会在硬件实现,目前只有O,没有I),空指令,比较指令等几类共15条。 指令格式和MIPS一致,采用R(655556),I(65516),J(626)三种个数。
经过昨天辛苦工作,汉诺塔问题的到解决,可以输出汉诺塔结果,程序大概五十多条指令,200多字节,比较短小的主要原因是提供了强大的IO指令~~。
输出:
1 汇编连接器 其实主要是汇编器,我自定义的镜像太简单,没什么链接任务。
2 仿真器 实现链接出镜像的加载和解释执行过程,有一个。
仿真器稍微稳定后会在仿真器上启动调试器的开发,毕竟没有调试器,很多时候不太好测试。
本项目所有源码及硬件原理图我都会在适当时候公开,如果有抄袭或者借鉴我会说明并给出引用地址。
仿真器上汉诺塔测试代码: 与MIPS不完全一致,暂时也没遵从MIPS ABI。手头没有编译器,汇编码和机器码都是手工计算。
地址 | 指令 | MachineCode |
0 | loadi a0,3 | 470024195 |
4 | loadi a1,1 | 470089729 |
8 | loadi a2,3 | 470155267 |
12 | jmpf 28 | 1073741852 |
16 | halt | 939524096 |
20 | nop | 0 |
24 | nop | 0 |
28 | nop | 0 |
32 | nop | 0 |
36 | nop | 0 |
40 | subi sp,16 | 800915472 |
44 | store ra,0(sp) | 738000896 |
48 | store s0,4(sp) | 710737924 |
52 | store s1,8(sp) | 712835080 |
56 | store s2,12(sp) | 714932236 |
60 | move s0,a0 | 546439168 |
64 | move s1,a1 | 548601856 |
68 | move s2,a2 | 550764544 |
72 | testi a0,1 | 880803841 |
76 | bnei 16 | 201326608 |
80 | addi fp,1 | 131989505 |
84 | out | 603979776 |
88 | bf 72 | 134217800 |
92 | subi a0,s1,1 | 776208385 |
96 | loadi a2,6 | 470155270 |
100 | sub a2,s1 | 818321408 |
104 | sub a2,s2 | 818323456 |
108 | jmpb 68 | 268435524 |
112 | move a0,s0 | 574881792 |
116 | move a1,s1 | 577044480 |
120 | move a2,s2 | 579207168 |
124 | addi fp,1 | 131989505 |
128 | out | 603979776 |
132 | nop | 0 |
136 | subi a0,s0,1 | 776208385 |
140 | loadi a1,6 | 470089734 |
144 | sub a1,s1 | 816158720 |
148 | subi a1,s2 | 816160768 |
152 | move a2,s2 | 579207168 |
156 | jmpb 116 | 268435572 |
160 | load ra,0(sp) | 465502208 |
164 | load s0,4(sp) | 464650244 |
168 | load s1,8(sp) | 464715784 |
172 | load s2,12(sp) | 464781324 |
176 | addi sp,16 | 129826832 |
180 | jr ra | 335544320 |