首页
论坛
社团
我的

ADSKN论坛

 找回密码
立即注册

扫一扫,微信登陆

开启左侧

[头歌实践平台]Toy计算机-冯诺依曼体系结构??

[复制链接]
 楼主| natural 发表于2022-5-28 15:33:49 | 显示全部楼层 |阅读模式 | 来自 湖南省长沙市 联通
本帖最后由 natural 于 2022-5-31 11:45 编辑

写在前面:写这篇帖子主要是为了帮助避坑。。想要答案的出门吧,这里没有
另一个原因当然是帮助我另一个高中同学咯。
再另另一个原因就是写来给自己加点印象
因为这里我也花了好长时间才弄明白,唉,难免有误,莫要多计较

冯·诺依曼体系结构及工作原理理解

这关实训12道题真给我写麻了。。各种问题层出不穷。。

  • 数据移动和指令模拟
  • 运算指令模拟
  • 无条件和条件跳转指令模拟
  • 输入输出指令模拟
  • 完整指令集验证
  • 软件模拟 - 模拟硬件初始化
  • 软件模拟 - 程序加载
  • 软件模拟 - 取指令
  • 软件模拟 - 指令译码
  • 软件模拟 - 指令执行
  • 软件模拟 - TOY计算机执行程序的完整过程
  • 软件模拟 - 扩展TOY计算机指令集

第一关:数据移动指令模拟
上来就是对我CPU的考验。仿真实训我卡得一批。大概是Edge浏览器的问题。换成FireFox解决了


在本次实训中。寄存器reg的总数是10个。编号为0~9。主存是mem。总数为1000,编号0~999
mov1和mov3指令后第一个数字是寄存器的编号。区别是mov1是从主存mem(值为第二个操作数,后面命名为op2)中取对应的数。而mov3是直接将第二个操作数(op2)作为整数直接放进寄存器
mov2和mov1的指令正好相反。
所以mov1指令和mov2指令的值是我们自己取的。而mov3的指令的值是规定的
pReg是程序计数器。这里可以简单理解为是第几条命令。不过后续随着address参量的引入。指令可能不是从主存mem的0处编号开始取得
各位一定要理解到。



第二关:运算指令模拟
<!--{吐槽:我FireFox卡住了进不去md。我不理解。头歌这网站我用Edge(应该是Chrome内核所以方便进)仿真又巨卡。我用Firefox又打不开。就尼玛仿真实训打不开就tmd离谱ps:大概是网络原因?}-->
这关没什么难点。注意这里四个运算后面跟的两个都是寄存器reg的编号。不是数字,不是数字,不是数字!!
注意仔细看动画流程。确保弄懂
另外提一点就是好像我们平时做选择题,会有那种情况比如说add相加指令后,那个值放在第二个操作数对应的寄存器。就是add Rx Ry。Ry=Rx+Ry。这些都是人为规定的,不要想太死。


第三关:无条件和条件跳转指令模拟
这里的跳转是mem主存单元的地址。是需要把程序计数器pReg的值改为另一条指令的主存mem地址。两种跳转的目标地址所位于的位置是不一样的。
jmp在后面第一个数。jz因为还有个比较参数。第一个数是寄存器编号。看对应编号的寄存器里的值是否为0。要跳转的地址在第二个参数里。


第四关:输入输出指令模拟
这里in和out的后面都只有一个参数,全部都是寄存器reg的编号。
还是注意看动画,没什么好多说的。待输出值和待输入值随便填个差不多的整数就行。


第5关:完整指令集验证
这里的演示动画也要认真看。
不管两个数怎么运算。反正要有两个数输入。这两个数最开始不在寄存器里,主存单元也没有数据。好好想想该用哪个mov指令。
然后几个运算符了解清楚。然后输出。然后停机。确信。


第6关:软件模拟 - 模拟硬件初始化
这个还是蛮简单的。把概念理清一下吧。
这里有模拟主存的。mem是个列表。1000个单元。列表每个元素都是数字0
这里有模拟通用寄存器的。reg是个列表。10个单元。列表每个数都是数字0(其实是什么无所谓,但是这里是,所以你不是的话,就过不去评测23333)
这里有模拟程序计数器的。pReg。是个数。
这里有模拟指令寄存器。iReg。初始他让赋值成0。后面它主要是存一条指令的。所以后面大概率会变成字符串



第7关:软件模拟 - 程序加载
就这关坑到我了属实是。导致我后面问题一堆。
首先我的建议是自己多在spyder里跑一跑read()、reagline()、readlines()函数。这里面还涉及到python读文件的时候的指针移动的问题(理解为鼠标光标??)我来放张图,大家自己感受。输出结果都附上了。不展开。

强调一下readline()的话每次调用会读一行,然后再调用一次会读下一行。因为读取的指针位置发生了变化,可以理解为读完一行之后。你的鼠标光标移动到了下一行开头。然后再调用readline()就是读取新的一行。除非文件被重新打开了。要注意的。
我最开始用的是readlines()。我觉得把每行拆成个列表很方便。但是但是。这里面有换行符\n。有的测试文本还有空格' '。如果你跟我选择的是一样的。切记使用split函数时。千万不要使用这种语法str.split(' ')。用空格做分隔符看起来合情合理是吧?但实际上正确的做法是str.split()!!!!!
来看演示:

作者碎碎念:
你们是不知道我最开始定义loadProgram函数的时候。使用`L=data.split(' ')`然后又是去空字符,又是去换行符\n。。其实倒也不难,顺利过去。但是第12关的toy程序文本好像是用python脚本写进去的。有制表符\t。。。。而且就12关有,前面我都过了,都没问题。然后就12关我就一直报错,我也不知道为什么。因为我自己用VSCode能跑出来结果。我自己的toy程序是没有那个\t的。我都不知道哪儿错了。后来问了教辅。教辅也鼓捣了一阵子,然后告诉我是函数loadProgrem的问题。后来把数据一打出来我才发现这很不讲武德,竟然有制表符\t。我还把expand3.toy下载下来。确信是那里的问题。又该程序把\t也去掉。全部改完教辅才告诉我可以直接`str.split()`。什么换行,什么制表,什么空格,全都没有了。

{淦。失误帖子先发出来了可还行}

mem是主存的。然后这个address的意思就是。有的时候程序加载不是从主存的编号0的位置开始的。所以这里定义一个地址的偏移量。假如是5的话。toy程序第000条指令就在主存的编号为5的位置。第008条指令就在主存编号为13的位置。




第8关:软件模拟 - 取指令
这关是不考虑地址偏移的。所以程序计数器pReg就是mem主存中对应的位置。然后iReg是指令寄存器。之前加载在主存mem中的程序就是每条指令字符串。赋值给iReg就行。然后实现程序计数器pReg自增1的过程就行




(接在回复里2333)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

参与人数 1人气 +10 一般等价物 +10 蜜柑 +1 收起 理由
Chao_Bei + 10 + 10 + 1 牛逼

查看全部评分

 楼主| natural 发表于2022-5-28 21:44:38 | 显示全部楼层 | 来自 湖南省长沙市 联通
第8关:软件模拟 - 取指令
这关是不考虑地址偏移的。所以程序计数器pReg就是mem主存中对应的位置。然后iReg是指令寄存器。之前加载在主存mem中的程序就是每条指令字符串。赋值给iReg就行。然后实现程序计数器pReg自增1的过程就行




第9关:软件模拟 - 指令译码
这里是对放在指令寄存器iReg的字符串进行处理。前面指令是字符串。后面两个无论是寄存器reg的编号还是mem主存的编号还是整数都是数。没有就是None就可以。主要的重点还是类型的转换。最后的输出是元组形式的。要么你前面建好个长度为3的列表。然后`return(tuple(L))`。要么就`return a,b,c`直接会以元组形式返回。a,b,c都是变量。a是字符串类型的。b,c要么是数字,要么为空(None)。




第10关:软件模拟 - 指令执行
第10关其实最开始我没有看懂。我直接先做的后面两关。有点不可思议吧。最后还把调用本关的那个老师写的文件给下下来了。放在VSCode里调试好才过的
要不,就写一堆if判断一下?执行以下对应指令的操作。编号为几的寄存器reg的值和编号为几的寄存器reg的值运算了?还是把程序计数器pReg的值改了?mov2指令比较特殊,是我掉过的坑。函数的返回值return可以是False(后面用来退出循环的,就是halt停机指令)。也可以是寄存器reg[op1]的值。还有可能是更改过后的程序计数器pReg的值。还有一个比较特殊,我就先不过多赘述了23333。又是我掉过的坑。也不一定,聪明的你可能已经避开了。。




第11关:软件模拟 - TOY计算机执行程序的完整过程
这关如果前面你们都按照要求写的应该不是特别难过关。我当时过关的时候是把fetch函数的作用架空了。单单用来取指令。fetch函数的pReg被我改成了全局变量。。返回值我都没用。。程序计数器pReg在execute()里自增或者是更改。寄存器reg也被我改成了全局变量。所以我写的run函数对你们正常过关的应该一点用也没有哈哈哈哈哈。我也不知道你们该注意些什么,反正我这关挺顺利的。如果会出什么bug的话。我觉得调试的时候把寄存器reg的值一点一点打印出来检查很有作用。我都是在VSCode里调试的。


第12关:软件模拟 - 扩展 TOY 计算机指令集
第12关的要求还是很清晰的。做到这里toy计算机的代码应该是自己要能看懂个大概的。到这里整个实现toy计算机的过程就展示出来了。
附一张废案,不能通关的。折磨了我有几个小时的东西。唉


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

Chao_Bei 发表于2022-5-28 23:34:38 | 显示全部楼层 | 来自 辽宁省大连市 移动
edge性能方面做的有点不太好,chrome这块做的好一些,或者你看看edge的硬件加速开了吗
回复

使用道具 举报

 楼主| natural 发表于2022-5-29 08:48:08 | 显示全部楼层 | 来自 湖南省长沙市 联通
Chao_Bei 发表于 2022-5-28 23:34
edge性能方面做的有点不太好,chrome这块做的好一些,或者你看看edge的硬件加速开了吗 ...

硬件加速我可不敢开,浏览器直接开闪。我还得眨眼补帧2333.我觉得做的确实不好。但我从Chrome换过来的懒得换回去了。大多数一般情况还是可以接受的
回复

使用道具 举报

 楼主| natural 发表于2022-5-29 08:55:50 | 显示全部楼层 | 来自 湖南省长沙市 联通
如果有第10关像我一样也不太明白的。可以去看一下头歌里老师是如何调取我们编写的函数的。是src里test5.py。我这里放个百度网盘,也是那个文件。里面去掉了老师第一行的引入,加了点注释。用作我自己在VSCode里调试的。
https://www.adskn.com/L1202
回复

使用道具 举报

Chao_Bei 发表于2022-5-29 11:50:12 | 显示全部楼层 | 来自 辽宁省大连市 移动
natural 发表于 2022-5-29 08:48
硬件加速我可不敢开,浏览器直接开闪。我还得眨眼补帧2333.我觉得做的确实不好。但我从Chrome换过来的懒 ...

眨眼补帧?那不是更棒吗
回复

使用道具 举报

公告
  • 问题反馈请扫码加入一期核心用户群
  • [学生认证] 认证后获取生活类板块发帖权限
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

QQ|Archiver|手机版|小黑屋|ADSKN短链接收益平台 ( 冀ICP备2021002162号 )

GMT+8, 2022-10-5 16:17 , Processed in 0.656439 second(s), 24 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表