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

news2025/3/13 18:48:00

前言

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

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

我们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为代码文件,

6

in R1   #输入a到R1

movi 1 #设置R0为1

add 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.coloradmin.cn/o/1519200.html

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

相关文章

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台(包括但不限于.NET Framework 和 .NET Core)构建 HTTP 服务的框架,用于创建 RESTful Web 服务。REST(Representational State Transfer)是一种软件架构风格,它利用HT…

Vue.js+SpringBoot开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

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

以弹性方式布局子组件的容器组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。Flex组…

【Spring】SpringMVC请求原理

什么是SpringMVC: SpringMVC 是Springframework中基于Java实现的Model-View-Controller框架,用于管理web应用程序的请求处理流程,并遵循MVC设计原则。 什么是MVC: MVC是Model-View-Controller的缩写,是一种设计原则&am…

PS学习 - 抠图-通道-主题颜色和背景颜色不能相近

抠出蝴蝶 1.通道抠图 套索工具 这里需要圈住你要的,注意尽量小点 ctrl j 复制 然后去掉背景 点击通道 找到明暗对比最大的通道,这里我理解为颜色反差最大的那个,突出你要抠的东西 搜了下说是一般为蓝色 复制通道 ctrll调出色阶 通过移…

MySQL--执行一条 select 语句,期间发生了什么?

执行一条 SQL 查询语句,期间发生了什么? 连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 …

java-类和对象

1.面向对象 1.1 区分面向对象与面向过程 举个例子: 在传统的洗衣服过程中,需要经历防水,放衣服,放洗衣粉,搓洗,换水......多个步骤,每个过程都是不可或缺的,关注的是过程. 而现在的洗衣服过程,就需要我们把衣服,洗衣粉放入洗衣机,启动洗衣机即可,并不需要关注洗衣机是如何运行…

长期护理保险可改善老年人心理健康 | CHARLS CLHLS CFPS 公共数据库周报(3.6)...

欢迎报名2024年“真实世界临床研究”课程! 本周郑老师开讲:“真实世界临床研究”培训班,3月16-17日两天,欢迎报名! CHARLS公共数据库‍ CHARLS数据库简介中国健康与养老追踪调查(China Health and Retirement Longitud…

Upload-labs 靶场通关攻略(全网最全最完整)

一、环境 在github上找upload-labs-0.1环境,部署在小皮面板上 upload靶机包 也可以直接下载他的集成的环境 二、闯关 1、Pass-01(前端验证) 文件上传漏洞就是利用我们上传的后门文件可以服务器进行解析 首先我们要写一个一句话木马文件…

AI大模型额外学习一:斯坦福AI西部世界小镇笔记

文章目录 一、简单介绍1)项目代码介绍2)重新播放模拟3)适当修改分叉模拟 二、部署斯坦福小镇Demo1)准备工作2)解决遇到的bug3)启动服务器和前端 github链接 一、简单介绍 ①背景介绍 This repository acc…

声明式事务还是编程式事务,如何选择?

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:Github传送门 🍹 本人24应届生一枚,技术和水平有…

[善用佳软]推荐掌握小工具:Json解析的命令行工具jq

前言: 我们在各种生产环境或者开发测试环境中,一定遇到有很多信息都是使用JSON串或者文本文件作为输入的。在没有JQ命令行工具之前,我们要从中获取真正的输入,大都把它复制到文本里头,然后使用文本编辑器进行加工整理…

WSL2执行nvidia-smi报错:Command ‘nvidia-smi‘ not found, but can be installed with

报错信息: Command nvidia-smi not found, but can be installed with: sudo apt install nvidia-utils-390 # version 390.157-0ubuntu0.22.04.2, or sudo apt install nvidia-utils-418-server # version 418.226.00-0ubuntu5~0.22.04.1 sudo apt insta…

LeetCode 热题 100 | 回溯(二)

目录 1 39. 组合总和 2 22. 括号生成 3 79. 单词搜索 菜鸟做题,语言是 C,感冒快好版 关于对回溯算法的理解请参照我的上一篇博客; 在之后的博客中,我将只分析回溯算法中的 for 循环。 1 39. 组合总和 题眼:c…

程序员的知识宝库,100+开源书籍、文档

公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识,也有全栈交流学习摸鱼群,期待您的关注! 每天3分钟开源 hi,这里是每天3分钟开源,很高兴又跟大家见面了&#xff0…

代码随想录刷题笔记 Day 52 | 打家劫舍 No.198 | 打家劫舍 II No.213 | 打家劫舍III No.337

文章目录 Day 5201. 打家劫舍&#xff08;No. 198&#xff09;<1> 题目<2> 笔记<3> 代码 02. 打家劫舍 II&#xff08;No. 213&#xff09;<1> 题目<2> 笔记<3> 代码 03.打家劫舍III&#xff08;No. 337&#xff09;<1> 题目<2&g…

RocketMQ学习笔记三(黑马)大神级

课程来源:6.RocketMQ安装_哔哩哔哩_bilibili (时长:19.5h) 讲解版本:4.5版本(我是以4.8版本实践的) 目录 第一部分 核心功能 第1章 RocketMQ的下载、安装、启动和测试(Linux环境) 启动: 测试: 第2章 RocketMQ集群搭建 2.1 集群特点 2.2 集群模式 2.3 双主…

HTML_CSS练习:HTML注释

一、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>HTML注释</title> </head> <body><marquee loop"1">马龙强<!--下面的输入框是可以滚动的&#x…

新手必看!YouTube运营教程:你需要的策略、工具和技巧

欢迎来到 YouTube 的世界&#xff01;对于跨境电商和海外社媒营销人员来说&#xff0c;YouTube 是一个充满机遇的宝地。无论你是希望通过视频内容扩大品牌影响力&#xff0c;还是想要抓住全球买家的注意力&#xff0c;掌握YouTube运营的基础是你成功的第一步。本篇教程将为你揭…

云与云计算:从传统到云端的IT资源变革

云&#xff1a;从分散到集约&#xff0c;资源服务化的新模式 让我们先通过一个生活化的场景来理解“云”这一概念。几十年前&#xff0c;诸如农村地区的居民需要自给自足&#xff0c;比如在自家院子里打井取水&#xff0c;冬季烧煤取暖&#xff0c;一切满足自己生活需要的都要…