HNU计算机系统实验一原型机vspm
原型机vspm1.0
- 参考文件《最小系统与原型机》
- 参考文件《原型机vspm1.0》
- 通过WSL实现Windows下的Linux子系统的Ubuntu20.04
任务名称:按照实验步骤完成a-inst.txt代码的执行
1.进入终端,运行代码

2.输入help,查看原型机的支持的命令

3.输入i r查看各个寄存器的值

4.输入x 6 0000查看从0000 开始的连续6个内存地址值

5.输入si,运行一条指令,查看结果:

R0设置为1
继续运行

R2此时为5,即为R1+R2



最终输出结果为15(即5+4+3+2+1)
最后输入q退出程序
任务名称:运行并调试b-inst.txt和c-inst.txt。并对其代码所做的工作进行解释。
b-inst.txt:


代码解释:比较a和b的大小(通过sub设置G),并且输出较小的那个数
c-inst.txt:





代码解释:通过累加法(累加b个a的值),计算a×b的值,并输出
-
- 思考问题
1.基于这些指令实现两个整数的乘法与除法?
乘法:通过运行c-inst.txt的代码,可以学习到,实现两个整数的乘法可以通过累加的方法,执行a×b,可以通过将R1设置为b,a存放到地址0000 0000中,用R2记录累加的值。进行循环。每次从0000 0010中取出上一轮的累加的值放入R2,并且将R2的值加上a,再存入0000 0000中,同时令b(即R1)减1,直到b的值不大于1,输出的结果即为a×b。
除法:学习乘法的方法,可以类比得到实现除法的方法。可以通过累减的方法,将R1设为b的值,a的值存放在0000 0000中,地址0000 0010的值为0,R2记录每次从0000 0000取出的值减去b后的值,并存入0000 0000中,同时令地址0000 0010的值加1,直到0000 0000中的值不再大于b(R1)的值,此时输出0000 0010中的值即为a/b的值,而0000 0000的值为余数。
以下为分析得到的代码进行运行的结果:






2.vspm的指令集是否完备?如果是,如何证明?如果本身,要增加哪些指令?
查阅资料可知,图灵完备性的几个关键条件有:数据存储和访问(这个在vspm中有in,out,mov等指令实现)、条件跳转(这个可以通过jg实现)、循环和分支(可以通过jg跳转来实现)、基本算数和逻辑运算(算数运算有add,sub,但不能实现逻辑运算,与运算或运算位运算等)
故指令集并不完备,缺少实现逻辑运算的指令:按位与,按位或,位运算,还有求反等。
3.如果一台计算机只支持加法和减法操作,能否计算三角函数,对数函数?
通过泰勒公式或麦克劳林公式,可以将三角函数和对数函数转化为加减乘除运算。由已知的加减法操作和拓展的通过累加累减实现的乘除法操作,是可以实现计算三角函数和对数函数的。
4.对于某个需要完成的功能,如果既可以通过硬件上增加电路来实现,也可以通过其他已有指令的组合来实现,那么如何判断哪一种比较合适?
RISC架构下:RISC通常依赖较简单的指令集实现较高的性能,因此,如果通过组合现有指令可以达到性能要求,那就选择指令组合。但如果目标是非常快速或频繁的操作,且现有指令集无法高效完成任务,可以考虑增加专用硬件来实现加速。
CISC架构下:CISC已经倾向于通过更复杂的指令集来处理一些复杂操作。如果硬件资源允许,可以直接使用现有的复杂指令来完成某些功能。而在资源受限的情况下,仍然可以考虑组合已有的简单指令来实现所需的功能。
1.性能需求:硬件适用于要求高性能的需求,而软件适合实现低性能的需求。
2.成本:如果需要大规模生产,可以考虑使用硬件,否则软件即可。
3.开发:硬件的开发较复杂,而软件较简单,且灵活。
【分任务列出实验过程中出现的问题】
实验A中vm最开始使用的utunbu版本较高(可能卡bug了或者我操作有误),导致共享文件夹始终无法实现,于是查找资料了解到还可以通过wsl实现。
实验B无问题。
思考题中,对于除法的运算,最开始写的代码功能实现有误(比如无法解决整除的情况),询问了同学和学长学姐成功修改。
【真实感受】
1.大致了解了冯诺依曼体系
2.学会了执行汇编代码
3.对于出现的问题,多动手实践,多尝试新的方法,总能够解决。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)