HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)

本文主要是介绍HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

二周目玩家,浅试一下这次的原型机实验。总体感觉跟上一年的很相似,但还是有所不同。

可以比较明显地感觉到,这个界面越来越好看了,可操作与可探索的功能也越来越多了。

我们HNU的SYSTEM真的越来越好了!!!(doge)

(1)vspm,miniCC

在试玩之前,先明确vspmminiCC这些都是什么。

vspm是一个小型的原型机,模拟了一个有6个寄存器,有cpu等基础配置的计算机,使用汇编代码来逐步或多步执行,用于教学作用。(vspm读取.txt配置文件并逐步执行)

miniCC是编译器,以近似C的语法执行编译,将我们写的代码逐步编译成四元组vspm的汇编指令配置文件,以一些其它的指令可以做一些别的操作,如指定输出文件名,打印内容等。它做到的事情类似于gcc,但有所不同,gcc是逐步生成预编译文件,汇编代码与可执行文件的过程,和用作教学作用的vspm不同。

但miniCC编译器确实存在一些严重的问题,相信喜欢探索的同学已经碰到了,这个问题坦白来说确实存在,而且短时间内没法解决,可能到23级的同学的时候就能修好了。目前一个问题是在for循环的判定条件内只能识别++或者--,不能识别 i = i + 1这种。

下面是gcc逐步生成可执行文件的过程。

gcc -E helloworld.c -o helloworld.i
gcc -S helloworld.i -o helloworld.s
gcc -c helloworld.s -o helloworld.o
gcc helloworld.o -o helloworld

其实感觉形式上还是有点像的,虽然内容完全不同。 

(2)环境配置

还有环境配置,这个环境要求要java环境(因为vspm使用java编写),版本21以上,包括ubuntu环境的配置,是一个很大的工程(新手基本暴毙在环境配置上)。我的好同学,同时也是计科某班的助教LIU,写了一个《how to build java21 on ubuntu20.04》,有机会可以读一下。

下面就是试玩报告啦:

实验1.原型机vspm1.0

【实验目的】

  1. 了解冯诺伊曼体系结构;
  2. 理解指令集结构及其作用;
  3. 理解计算机的运行过程,就是指令的执行过程,并初步掌握调试方法。

【实验准备】

  1. 阅读教材,掌握冯诺伊曼体系的相关内容;
  2. 学习课程《最小系统与原型机I》。

【实验步骤】

  1. 进入终端,使用cd vspm1.0进入目录;

使用./vspm a-inst.txt来运行原型机1.0的模拟器,其中a-inst.txt为代码文件,

6in R1   #输入a到R1movi 1 #设置R0为1add R2,R1 #R2存放累加值sub R1,R0 #R1的值即a减去1,此时会设置G值movd #将当前PC值保存在R3中movi -3 #存放-3到R0中,跳转到第二行add R3,R0 #R3减去3,注意此时不能用SUB指令,会影响G值jg #如果R1的值还大于1,则跳到第2行去执行out R2 #如果R1的值此时小于等于1,则准备输出halt #停机

第一行的6,表示分配6个字节的数据段;

后面的均为原型机指令,每一行指令代表的意义及整体执行结果在《最小系统与原型机I》中已经进行了详细说明。

运行后界面如下图所示。

  1. 在运行后,提示将要执行的指令地址及内容,在本例中,提示要执行位于内存00000110处的指令“in R1”,即等待输入一个整数值。此时输入si则表示执行此指令,同时也可以输入其他的指令,使用help可以查看此模拟器支持的命令:
  2. 此时输入i r,可以查看各个寄存器的值,而输入x 6 0000则表示查看从0000开始的连续6个内存地址值,结果如图所示。
  3. 输入si,则表示运行一条指令,例如此时运行的指令是“in R1”,表示等待输入,输入一个值5,在输入完成后将此数值存至R0寄存器,运行完成后,再运行i r指令,就可以看到输入的值5确实是已经存在R0寄存器中,每个寄存器的值都用十进制和十六进制表示,如下图所示。
  4. 后续程序的执行过程可参照视频进行操作。
  5. 程序执行完毕后,可以使用q退出。

三、练习思考

1.练习内容

1.按照上述的实验步骤,完成相关操作;

【参考回答】上述a-inst.txt完成的工作是计算自然数列1+2+……+n的和,n由输入读入。

2.在目录下还有b-inst.txtc-inst.txt,请运行并调试,并对这些代码所做的工作进行解释;

b-inst.txt(完成比较a和b大小的工作,并输出较小的值)

6
in R1 		#输入第一个数a
in R2 		#输入第二个数b
mova R0,R1 	#在R0保存a 
sub R1,R2  	#a-b,此时会设置G
mova R1,R0 	#a保存到R1
movd       	#保存当前的PC值到R3
movi 6     	#R0的值设置为6,即跳转到11行
add R3,R0  	#R3的值加6
mova R0,R2 	#b的值保存到R0
jg         	#如果a的值比b大,就跳转
#跳转地址
mova R0,R1 #将a的值保存到R0
out R0     #输出R0
halt

c-inst.txt(完成两个大于1的正数相乘的工作,并输出结果)

8
#两个大于1的正数相乘
in R1		#乘数a
movb R0,R1	#乘数a存放到内存0000 0000
in R1		#被乘数b
movi 1
movb R0,R1	#被乘数b存放在内存0000 0001#结果存放在内存 0000 0010
#开始循环
movi 1		#R0中的值为1
movc R1,R0	#从内存中取出值b
movi 1		#设置R0中的值为1
sub R1,R0	#R1即b值减1,此时设置G值
movi 1
movb R0,R1	#b值需要保存回去
movi 0		#R0中设置为0,即内存地址0
movc R2,R0	#取出a值
movi 2		#R0中设置为2,即内存地址0000 0010
movc R1,R0	#取出结果
add R1,R2	#做加法
movb R0,R1	#将结果存回去
movd       	#保存当前的PC值到R3
movi -12     	#R0的值设置为-12
add R3,R0  	#R3的值加-12
jg         	#如果第12行的减法设置G为1,就跳转
#循环结束
movi 2		#R0中设置为2,即内存地址0000 0010
movc R1,R0	#取出结果
out R1		#打印结果
halt

3.完成实验报告。

2.思考问题

(1)   如果基于这些指令实现两个整数的乘法与除法?

【参考想法】

实际上可以先用c++写好,然后使用hnu-vspm编译器来进行编译。

分别使用下述命令,若没有编译报错,则可以最终生成配置文件(供vspm读取的汇编代码)

./miniCC -c1 mytest.c -o mytest.q
./miniCC -lvspm mytest.q -o mytest.hnus
./miniCC -lvspm mytest.hnus -o mytest.txt

最后再使用如下指令就可以像上面的a-inst等一样单步运行了。

./vspm mytest.txt

前提是没有出编译错误。

上述过程大致可以截图如下:

 然后就可以试试自己的代码能不能成功运行,是不是可以转成合适的vspm汇编代码。

(2)  vspm1.0的指令集是否完备?如果是,那么如何证明(提示:搜索并阅读“可计算性理论”)?如果不是,那么要增加哪些指令?

【参考想法】

(3)  如果一台计算机只支持加法、减法操作,那么能否计算三角函数,对数函数?(提示:搜索并阅读“泰勒级数展开”等内容)

【参考想法】

   (4)对于某个需要完成的功能,如果既可以通过硬件上增加电路来实现,也可以通过其他已有指令的组合来实现,那么如何判断哪一种比较合适?(提示:搜索并阅读RISC与CISC)。

【参考想法】

此外还有一些比较有趣的点值得关注

比如数据段是什么,配置文件的第一个数字6是什么意思,PC寄存器和G寄存器是干什么的……

这篇关于HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813547

相关文章

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

这位在做游戏的前电影导演,希望能变着法子讲故事,并给予玩家会心一击

从黎巴嫩到瑞典,从电影人到游戏从业者,这是一位“作者”开发者的冒险 这是又一名瑞典游戏开发者的故事。 区别于大多数安静内向的同行,Josef Fares 因为其张扬的个性而成为为玩家所熟知的开发界网红。他敢在 TGA 直播中脱口而出“F**k Oscar”,敢在开箱危机的风口浪尖为 EA 说话,他创作了两款极具个人风格的独立游戏——讲述兄弟在幻想世界里历险为父亲求解药的《兄弟:双子传说》(Br

军事目标无人机视角检测数据集 3500张 坦克 带标注voc

数据集概述 该数据集包含3500张无人机拍摄的图像,主要用于坦克目标的检测。数据集已经按照VOC(Visual Object Classes)标准进行了标注,适用于训练深度学习模型,特别是物体检测模型。 数据集特点 目标明确:专注于坦克这一特定军事目标的检测。多样视角:图像采集自无人机的不同飞行高度和角度,涵盖了各种环境下的坦克图像。高质量标注:每个坦克实例都被精确标注,包括位置信息和类别