这次大作业的代码量比往年少很多,算上注释也就300行左右。
我觉得最难的部分是对于题目的理解,也就是对指令集的理解。如何正确地获取和处理指令中蕴含的信息是解决该问题的关键。
程序的大致步骤:
程序开始时要从指定文件中读入一段用给定指令集写的程序至内存(从地址0开始顺序保存),程序计数器初始值也为0。然后程序就开始不断重复取指令(读取程序计数器PC内的指令地址,根据这个地址将指令从内存中读入,并保存在指令寄存器中,同时程序计数器内容加4,指向下一个条指令。因为我们所有的指令长度固定为4个字节,所以加4)。分析指令(对指令寄存器中的指令进行解码,分析出指令的操作码,所需操作数的存放位置等信息)和执行指令(完成相关计算并将结果写到相应位置)的过程。程序每执行一条指令就要输出CPU当前的状态,如各寄存器的值,指定内存的值等(具体要求在后边)。当读到停机指令时,程序按要求输出后就结束了。
What I Learn:
- 在位运算中 &0xff 所起的作用。有兴趣的小伙伴可以看看我的另一篇博文https://www.cnblogs.com/ziyang1060/p/13109907.html
- short类型转按位转化为两个char类型的黑魔法:
- 封装的重要思想:每次根据指令的类型对寄存器中数据处理的时候,情况很复杂,数据寄存器,地址寄存器和立即数寄存器都可以是目标寄存器与源寄存器。但是从整体上看,这个过程无外乎就是从寄存器中取数据,以及将结果存入寄存器中。这样得话,我们就可以将这两个子过程封装成两个函数,极大地简化了程序。
附上:单核CPU模拟器代码链接:https://pan.baidu.com/s/1lzqZin4oJarKANA0LEOyzw 提取码:aohc
CPU模拟器任务书链接:https://pan.baidu.com/s/1fXxnys4flisHV1sRcPdqEg 提取码:pxb7