《计算机系统》
原型机实验报告
班级:计科21XX
学号:20210801XXXX
姓名:wolf
目录
1.实验项目一
1.1项目名称
原型机I
1.2实验目的
- 了解冯诺伊曼体系结构;
- 理解指令集结构及其作用;
- 理解计算机的运行过程,就是指令的执行过程,并初步掌握调试方法。
- 理解计算机的运行过程,对指令集进行修改
1.3实验资源
(1)教材中冯诺伊曼体系的相关内容;
(2)课程《最小系统与原型机I》。
2.实验任务
2.1原型机I
2.1.1练习内容
(1)按照上述的实验步骤,完成相关操作;
①打开与初始化,认识帮助界面
②逐步运行至判断跳转指令,
指令4 1 R2将累加步长1存放在R2内;
此后指令2 R0 R1,这步每次将R0累加至R1,其中R1存放累加结果,也就是最终结果;
指令3 R2 R0是计算下一个需要累加的数并存放在R0内。
③判断跳转
由于上一步的减法运算结果不为0,故R3=1,满足跳转条件,程序回到之前重复累加计算。
④多次运行si 3跳过循环
⑤判断跳转跳出循环,输出结果
此时由于R3=0,不符合跳转回循环的条件,故继续执行下一步,即跳出循环。
然后将结果传输回内存中,并输出结果。
(2)在目录下还有2.config,3.config,其对应的指令代码文件分别为b.txt和c.txt,请运行并调试,并对这些代码所做的工作进行解释;
Ⅰ对于b.txt
①运行调试
范例1:A=3,B=5
到上一步为止,进行的是A和B 的比较并且已经比较出结果
这里是将较大结果输出的过程
范例2:A=7,B=4
②工作解释
先后输入两个数A和B,比较A与B的大小并输出较大的数
下面给出逐步解释:
指令 | 解释 | |
1 | 1 | 输入A,存储在R0 |
2 | 5 R0 0000 | 将A存储在地址0000 |
3 | 5 R0 R1 | 将A转移至R1 |
4 | 1 | 输入B |
5 | 5 R0 0001 | 将B存储在0001 |
6 | 3 R1 R0 | A与B作差,生成R3 |
7 | 6 3 | 若B>A,跳转至10 |
8 | 5 0000 0010 | A>B,将A传输给0010 |
9 | 7 2 | A>B,跳转至11 |
10 | 5 0001 0010 | A<B,将B传输给0010 |
11 | 5 0010 R0 | 将0010传输给R0,也就是较大的数 |
12 | 8 R0 | 输出结果 |
13 | 0 | 停机 |
Ⅱ对于b.txt
①运行调试
②工作解释
这段代码做的是一个整除的工作,通过不断模拟减法与计数来统计最终的结果
2.1.2思考问题
- 如果基于这些指令实现两个整数的乘法与除法?
①实现乘法:
用到R0、R1、R2。对于A*B的计算,选定A与B的较小值作为计数量,较大值作为基础量。假定A<B,那么原理就是将B自加A次。具体操作如下:
(由于只有三个寄存器可用,所以需要涉及到多次从内存中存取,较为繁琐,这里就不写代码了)
R0作为基础量,R1作为结果,R2作为计数量。
R0加到R1上;
R2自减1;
检验R3(R2-1是不是为0),在R3=0时跳出循环
输出结果
②实现整除:
用到R0、R1、R2。对于A/B的计算,原理就是多次将A-B,但保证A>0,计数结果即为答案。具体操作如下:
(由于只有三个寄存器可用,所以需要涉及到多次从内存中存取,较为繁琐,这里就不写代码了)
循环内
R0为A,R1为B,R2作为计数量。
3 R1 R0;
若R3跳转至:R2自加1并继续循环;
否则跳转结束并输出R2
(2)原型机I的指令集是否完备?如果是,那么如何证明(提示:搜索并阅读“可计算性理论”)?如果不是,那么要增加哪些指令?
原型机I的指令集是不完备的,
比较浅薄地观察可以发现,缺少了一些基本的逻辑指令,比如按位运算指令的
按位与、按位或、按位非、求补、求反这些都无法完成。
2.2原型机II-扩充指令集
2.2.1练习内容
- 按照上述的实验步骤,完成相关操作;
①增添代码段
在ExecuteInstruction增加一个判断分支如下
②增加一个d.txt文件,其中包括有乘法指令并修改1.config为
4
3
0011
d.txt
③使用make生成可执行文件,
④执行代码,操作过程如下
⑤增加一个e.txt文件,基于原型机I的指令完成两个数的乘法操作,
这里为了节省空间,只演示3*2的运算过程
(2)为原型机II增加整除指令,并基于原型机I的指令写出两数整除的代码,进行对比;
Ⅰ为原型机II增加整除指令
①增添代码段
在ExecuteInstruction增加一个判断分支如下
②增加一个f.txt文件,其中包括有除法指令并创建4.config
③使用make生成可执行文件,
④执行代码,操作过程如下
Ⅱ基于原型机I的指令写出两数整除的代码
代码及解读如下
1 | 1 | 读入被除数A |
2 | 5 R0 00000 | 将A存入00000 |
3 | 1 | 读入除数B(一直保存在R0中) |
4 | 5 00000 00001 | 将A存入00001 (此后00001用来保存A被减去n次后剩下的数M) |
5 | 5 00001 R1 | 将M存入R1 |
6 | 3 R0 R1 | M减去B,结果存入R1 |
7 | 6 2 | 若M>B(即还能继续减),跳转至9(继续循环) |
8 | 7 7 | 若M<=B(即不够减了),跳转至15(跳出循环) |
9 | 5 00010 R2 | 00010中的值存入R2(取出ans) |
10 | 4 1 R3 | |
11 | 2 R3 R2 | ans自加1(即M-B成功了) |
12 | 5 R2 00010 | ans存入00010 |
13 | 5 R1 00001 | (M-B)存入00001,成为新的M |
14 | 7 -9 | 跳转至5 |
15 | 5 00001 R1 | 将M存入R1 |
16 | 5 R0 R2 | 将B存入R2 |
17 | 3 R1 R2 | B减去M,结果保存在R0中 |
18 | 6 5 | 若M<B(即不能继续减了,直接输出ans即可)跳转至23 |
19 | 5 00010 R2 | 若M>=B,即还可以再减一次,00010存入R2 |
20 | 4 1 R3 | |
21 | 2 R3 R2 | ans自加1 |
22 | 5 R2 00010 | 将R2存入00010 |
23 | 5 00010 R1 | 将00010存入R1 |
24 | 8 R1 | 输出R1 |
25 | 0 | 结束 |
运行效果:
对比:显然使用模块化的处理会比自己编写程序更为方便,但是使用逐步编写程序的方法也是可以将这个功能实现的。
2.2.2思考问题
(1)原型机I与原型机II完成乘法和除法操作的方式有何不同?
原型机I需要使用现有指令集去编写实现乘法与除法的功能;
而原型机II将乘法与除法操作写入了指令集中,可以直接调用指令完成功能。
(2)在指令集中增加乘法、除法等指令时,原型机中需要增加代码,那么硬件实现上需要增加什么样的部件?
需要增加一个移位寄存器,可以实现移位操作,进而实现乘法与除法的功能。
(3)如果一台计算机只支持加法、减法操作,那么能否计算三角函数,对数函数?(提示:搜索并阅读“泰勒级数展开”等内容)
可以计算三角函数,
对三角函数与对数函数可以进行麦克劳林展开,可以在舍弃无穷小的情况下近似为只含四则运算的运算式,而由模型机I可知乘法与除法可由加法与减法来实现。
综上可知,该计算机可以计算三角函数与对数函数。
(4)对于某个需要完成的功能,如果既可以通过硬件上增加电路来实现,也可以通过其他已有指令的组合来实现,那么如何判断哪一种比较合适?(提示:搜索并阅读RISC与CISC)。
CPU从指令集的特点上可以分为两类:CISC和RISC。
RISC是“精简指令运算集”,CISC就是“复杂指令运算集”。RISC的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。关于RISC与CISC的比较如下
1)RISC更能充分利用VLSI芯片的面积。CISC的控制器大多采用微程序控制,其控制存储器在CPU芯片内所占的面积为50%以上,而RISC控制器采用组合逻辑控制,其硬布线逻辑只占CPU芯片面积的10%左右。
2)RISC更能提高运算速度。RISC的指令数、寻址方式和指令格式种类少,又设有多个通用寄存器,采用流水线技术,所以运算速度更快,大多数指令在一个时钟周期内完成。
3)RISC便于设计,可降低成本,提高可靠性。RISC指令系统简单,故机器设计周期短;其逻辑简单,故可靠性高。
4)RISC有利于编译程序代码优化。RISC指令类型少,寻址方式少,使编译程序容易选择更有效的指令和寻址方式,并适当地调整指令顺序,使得代码执行更高效化。
3总结
3.1实验中出现的问题
在1.1任务中,出现的问题有
- 对于指令集的掌握不够牢固,在阅读学习汇编代码的时候需要经常性地查阅指令集来猜测汇编代码的意思,但是通过阅读多个汇编代码并多次练习,已经有所掌握与改善。
- 对于汇编代码的含义理解不够到位,由于是第一次阅读汇编代码,对于较为简短的程序还好理解,比方说a.txt和b.txt,但是对于较为长的代码就不是很好理解,比如说c.txt,我还是结合程序运行的情况再加上一些自己的猜测才能大致猜测出写的是一个整除的程序。
- 对于ubuntu的操作还不是很熟练。
在1.2任务中,出现的问题有
- 直接从老师给的说明文档上复制下来的汇编代码中间有“,”,导致运行失败,这个花费了许多时间才纠正。
- 老师给的说明文档上的ExecuteInstruction与模型机上的不配套,需要自行更改为case语句以配套,这一点需要小心。
3.2心得体会
由于上学期数电的学习,对于模型机我有一定的基础,因此第一个实验还是比较好上手的。但是ubuntu这个崭新的环境还是给我的模型机实验带来了一些挑战。所幸按照老师给的说明文档所铺设的梯度,在一次一次的使用i r查看寄存器值与使用x 3 0000查看内存地址的值的情况下,我对于汇编程序的思想与结构还是有了更为深入的了解。
总的感受就是,这是一门有趣的课程,但是需要花费时间与精力才能学习好。这是一门好玩的学科,也值得花费更多尝试。