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寄存器是干什么的……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter 查看 TPS 数据,详细指南

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。在 JMeter 中,我们可以使用以下方法查看 T…

量子遗传算法优化VMD参数,五种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵、排列熵/互信息熵...

关于量子遗传算法,在众多文献均有应用。下面简述一下原理。 (1)量子比特编码 子遗传算法通过引入量子比特来完成基因的存储和表达。量子比特是量子信息中的概念,它与经典比特不同,是因为它可以在同一时刻处于两个状态的…

Unreal发布Android App如何面对混乱的Android SDK开发环境

Unreal发布Android App如何面对混乱的Android SDK开发环境 混乱的Android SDK开发环境Unreal 4可以借用Unity3D安装的Android环境Unreal 5需要安装Android Studio开发环境Android Studio的DK版本目录处理gradle和java版本gradle提示错误总结 混乱的Android SDK开发环境 Unreal…

Python爬虫 Day1

要注意看网页的请求方式是request还是get 一、小型爬虫 (爬百度首页) from urllib.request import urlopen url "https://www.baidu.com" resp urlopen(url) print(resp.read().decode(utf-8)) print("over!") //!&am…

【Hadoop】Hadoop概述与核心组件

目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop(常用)2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高(高可靠、高扩展、高效、高容错) Hadoop组成1.HDFS管理者:NameNode(n…

css3 实现html样式蛇形布局

文章目录 1. 实现效果2. 实现代码 1. 实现效果 2. 实现代码 <template><div class"body"><div class"title">CSS3实现蛇形布局</div><div class"list"><div class"item" v-for"(item, index) …

音视频如何快速转二维码?在线生成音视频活码的教程

音频文件的二维码制作步骤是什么样的呢&#xff1f;扫描二维码来展现内容是很流行的一种方式&#xff0c;基本上日常生活中经常会用的图片、音频、视频等都可以使用生成二维码的方式。现在很多的幼儿园或者学校会录制孩子的音频或者视频内容用来展示&#xff0c;那么二维码制作…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:RelativeContainer)

相对布局组件&#xff0c;用于复杂场景中元素对齐的布局。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 规则说明 容器内子组件区分水平方向&#xff0c;垂直方向&#xff1a; 水平方向为left&…

HTTPS的工作过程

一、HTTPS 是什么 HTTPS 也是⼀个应用层协议&#xff0c;是在 HTTP 协议的基础上引入了⼀个加密层. HTTP 协议内容都是按照文本的方式明文传输的。这就导致在传输过程中出现⼀些被篡改的情况. 在互联网上, 明文传输是比较危险的事情!!! HTTPS 就是在 HTTP 的基础上进行了加密…

platform设备注册驱动模块的测试

一. 简介 上一篇文章编写了 platform设备注册代码&#xff0c;文章地址如下&#xff1a; 无设备树platform驱动实验&#xff1a;platform设备注册代码实现-CSDN博客 本文继续无设备树platform驱动实验&#xff0c;本文对编译好的 设备注册程序进行测试&#xff0c;测试所实…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列&#xff09;简称MQ&#xff0c;是一种应用程序对应用程序的消息通信机制。在MQ中&#xff0c;消息以队列形式存储&#xff0c;以便于异步传输&#xff0c;在MQ中&#xff0c;发布者&#xff08;生产者&#xff09;将消息放入队列&#xff…

LeetCode 面试经典150题 80.删除有序数组中的重复项II

题目&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…

百度paddleocr GPU版部署

显卡&#xff1a;NVIDIA GeForce RTX 4070&#xff0c;Nvidia驱动程序版本&#xff1a;537.13 Nvidia驱动程序能支持的最高cuda版本&#xff1a;12.2.138 Python&#xff1a;python3.10.11。试过python3.12&#xff0c;安装paddleocr失败&#xff0c;找不到相关模块。 飞桨版本…

Linux从0到1——Linux第一个小程序:进度条

Linux从0到1——Linux第一个小程序&#xff1a;进度条 1. 输出缓冲区2. 回车和换行的本质3. 实现进度条3.1 简单原理版本3.2 实际工程版本 1. 输出缓冲区 1. 小实验&#xff1a; 编写一个test.c文件&#xff0c;&#xff1a; #include <stdio.h> #include <unistd.h…

老电脑装什么系统流畅

对于一些老旧电脑来说&#xff0c;重装系统是提升电脑性能的最佳选择。那么&#xff0c;老电脑装什么系统流畅呢&#xff1f;推荐Windows 7系统&#xff0c;它对硬件的需求相对较低。配置较低的电脑运行Windows 7可以更好地利用系统资源&#xff0c;提高电脑的运行速度和响应能…

c语言实现https客户端 源码+详细注释(OpenSSL下载,visual studio编译器环境配置)

OpenSSL的下载和环境配置 请参考&#xff1a;openssl下载安装教程 步骤&#xff1a;官网下载->安装到选定目录->配置环境变量->打开命令窗口检查是否安装成功 注意&#xff1a; 打开命令窗口&#xff08;快捷键winr,在弹出窗口内输入cmd按回车&#xff09;&#xff0…

ChatGPT解决hmm...something seems to have gone wrong.

ChatGPT解决hmm…something seems to have gone wrong. 这里是官方社区的一种workaround办法。仅仅只是mark一下。 我这边遇到的现象是&#xff0c;ChatGPT 3.5是正常的&#xff0c;但是使用ChatGPT 4就会频繁的出现这样的输出。而且恶心的是&#xff0c;即使是这种输出&…

(三)丶RabbitMQ的四种类型交换机

前言&#xff1a;四大交换机工作原理及实战应用 1.交换机的概念 交换机可以理解成具有路由表的路由程序&#xff0c;仅此而已。每个消息都有一个称为路由键&#xff08;routing key&#xff09;的属性&#xff0c;就是一个简单的字符串。最新版本的RabbitMQ有四种交换机类型&a…

云计算2主从数据库

设置主从数据库的目的是将数据库1和数据库2分别建在两个虚拟机上&#xff0c;并实现数据互通访问 首先准备两个虚拟机&#xff0c;这里示例ip分别为&#xff1a; 192.168.200.10&#xff1b;192.168.200.20 修改主机名&#xff0c;一个是mysql1&#xff0c;一个是mysql2&#x…