《计算机组成原理Ⅱ课程设计》报告
目录
思考题
由于md图片的显示问题,具体可以联系qq 邮箱1528882125@qq.com获取本实验全套的代码和报告
1. 有什么办法?
1.利用栈进行表达式求值,一个栈储存运算符,一个栈醋和农村操作数,首先将中缀表达式转化为后缀表达式,明确运算符的优先级和结合性之后进行计算,将后缀表达式压入栈中,运算符匹配时弹栈,重复此操作最后实现求值。
2. 一些简单的正则表达式
1.0x
开头十六进制
0x[0-9a-f]+
2.英文字母和数字的字符串
^[A-Za-z0-9]+$
3.当变量只包含数字,ASCII
字母,下划线且以字母,下划线开头
^[a-zA-Z_][0-9a-zA-Z_]*$
4.16开头的学号,2-4的汉字姓名,包含数字字母和点号的字符串
16\d{7} - ^[\u4e00-\u9fa5]{2,4}$ - ^[0-9a-zA-Z.]+.pdf$
3. 这是为什么?
首先字符串中的\\
被编译器解释为\
第一步,编译器将字符串转变为“正则表达式”
然后作为正则表达式, 第二步,才开始把第一步的结果当做是正则表达式,开始进行匹配
4. 如何处理以上的问题
使用make clean
清空工作树或许可以释放一部分缓存的区域。防止溢出缓存区。
5. 递归求值的过程?
在过程中调用自己就是递归求值。
6. 体验监视点
编写test.c
编译进入gdb
使用l
查看程序内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1nQqj2Y-1649584239871)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\监视点.jpg)]
b
设置断点,利用watch
设立监视点a、b
持续监视a、b
的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n0oYrsq5-1649584239872)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\监视点1.jpg)]
利用c
继续运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXVp5Trj-1649584239873)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\监视点1.jpg)]
7. 科学起名
使用free_
作为空闲监视点管理的头指针可以避免和其他的链表头指针撞车导致监视点链表被调用产生错误。
8. 温故而知新
此处的含义是静态全局变量,该变量只可以被本文件中的函数调用,并且由于是全局变量,所以不可以被统一程序的不同函数调用,此书使用static
是为了避免它被失误修改。
9. 一点也不能长?
不可以,因为当我们在调试器中对代码的某一行设置断点时,会把这里本来指令的第一个字节保存起来,然后写入一条INT 3指令,机器码为0xcc,仅有一个字节,设置和取消断点时也需要保存和恢复一个字节
10. “随心所欲”的断点
断点不在指令的首个字节就无法检测到断点。
11. NEMU的前世今生
模拟器emulator
和调试器debugger
的不同。我觉得debugger
是一个命令行调试工具,设置断点,调试程序,测试bug
,emulator
是一个载体,就是虚拟机,是一个独立的系统,不会对电脑本身的系统造成影响.
12. 尝试通过目录定位关注的问题
386intel
手册5.1.3
内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5gNiSda-1649584239875)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\lector.jpg)]
13. 理解基础设施
调试上花费75h
,建议调试器帮忙节省50h
14. 查阅i386手册
1.34
页CF
位是进位标志,在最高位发生进位或者错位时置为1
否则置为0
2.ModR/M由Mod,Reg/Opcode,R/M三部分组成。Mod是前两位,提供寄存器寻址和内存寻址,Reg/Opcode为345位,如果是Reg表示使用哪个寄存器,Opcode表示对group属性的Opcode进行补充;R/M为678位,与mod结合起来查图得8个寄存器和24个内存寻址
3.347
页格式:DEST<-SRC
15. shell 命令
在2021\pa1
中使用指令find . -name "*[.h|.cpp]" | xargs wc -l
,做差看出写了代码行数为529
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7M5tanrm-1649584239876)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\计数.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhV5nt94-1649584239877)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\计数2.jpg)]
指令find . –name “*[.cpp|.h]” | xargs grep “^.” | wc -l
查看不包括空格的行数为:501
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9hMpU9Ca-1649584239878)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\计数3.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MB3QwQmY-1649584239879)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\计数4.jpg)]
16. 使用man
Wall
使GCC产生尽可能多的警告信息,取消编译操作,打印出编译时所有错误或警告信息。
-Werror
要求GCC将所有的警告当成错误进行处理,取消编译操作。
使用-Wall
和-Werror
就是为了找出存在的错误,减少程序错误
17. git log
和远程git仓库提交截图
git log
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DFdo6WqT-1649584239880)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\gitlog.jpg)]
提交到仓库的截图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XdQfEu0-1649584239881)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\思考.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X3QEns7b-1649584239882)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\git push.jpg)]
实验内容
1. 编写匹配规则(1)
首先需要在rules
数组中添加对应规则的相应正则表达式,另外需要在enum
中 添加相应的token
类型。
添加结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Pv9ElML-1649584239884)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\1.JPG)]
2. 添加 p 命令
在ui.c
中完善指令使其可以调用expr
进行表达式求值的运算返回结果打印输出:
此外还要需要格外注意需要同时在help
数组中添加p
指令,一遍在界面显示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqqrVeZs-1649584239885)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\2.JPG)]
3. 识别并存储 token
这一步就是要完善make _token
函数的时候了,同时需要更新nr_token
的数值来记录读入的运算符和操作数的个数,储存之后如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4ziztL9-1649584239886)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\3.JPG)]
4. 实现括号匹配
利用left
记录读入的左括号数量,利用flag
来记录表达式是否进行到最后的阶段,每读入一个左括号left+1
,i
来记录当前读入的第几个字符,如果到狮子读入完毕之后left
不等于零就表明括号不匹配,利用assert(0)
中断程序。实现如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChIpT7a2-1649584239887)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\4.JPG)]
5. 实现子表达式拆分
以4+3*(2-1)
为例,总表达式的中心操作符为+
,子表达式的中心操作符分别为*
和+
,函数find_dominated_op
利用p
和q
两个数值,一个指示表达式的前端一个只是表达式的后端,找到表达式判断优先级之后进行截断分为两个表达式,之后子表达式再次进入函数寻找运算符,直到p,q
相同,表达式结束。
以4+3*(2-1)
为例:首先+
为中心操作符之后是*
和-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dhz09Fc5-1649584239887)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\5.1.JPG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3AN2iDq-1649584239888)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\5.JPG)]
6. 实现表达式求值
测试结果成立如下图所示,满足结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BiZJo3CC-1649584239889)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\6.JPG)]
7. 实现指针解引用
指针解引用就是判断是乘号还是地址号,通过判断其前一个符的token
类型即可判断,如果他前面的字符的token
类型如果不是十进制数或者十六进制数则大概率可能是指针,实现如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zEYGPpX-1649584239890)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\7.JPG)]
8. 实现负数
在eval
函数中识别token
类型时调整返回值加负号 即可
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STGbBu2C-1649584239891)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\8.JPG)]
9.实现x命令使用表达式求值
实现此功能需要修改cmd_x
指令 ,可以判断x
之后输入的的内容开头如果以0
开头则读入的是地址,如果是是其他开头
10. 监视点结构体
定义char
型数组expr[100]
,和两个int
型变量new_val和old_val
储存新值和旧值。结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGQluAkx-1649584239892)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\10.JPG)]
11. 监视点池的管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIhKp6BU-1649584239893)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\11.JPG)]
12. 监视点加入调试器
将w
和d
指令加入到ui.c
中,并且添加info w
指令
w
指令为设置监视点,d
指令监视点编号并且删除监视点
这两个指令调用后续编写的函数set_watchpoint
和delete_watchpoint
即可,实现如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHTONNJN-1649584239893)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\12.1.JPG)]
info w
指令需要仿照info r
指令并调用list_point
函数,最后实现如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQYyyMey-1649584239896)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\12.JPG)]
13. 监视点主要功能
函数主要用到的还是链表的操作实现如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sm20M00r-1649584239897)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\13.JPG)]
测试了设立监视点,显示监视点,删除监视点的功能,结果入下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cAdeK17I-1649584239898)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\13.1.JPG)]
14. 实现软件断点
(暂时没有实现)
遇到问题及解决方法
1.遇到问题:在写完第一次匹配规则并且完善p
指令之后运行1+1
出现如下问题:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m23Z28yX-1649584239900)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\问题1.JPG)]
解决方法:经过了解后可知,因该是make_token
函数没有完善导致导致其中的token
无法识别所以报错,应先完善make_town
函数。
2.遇到问题:在编写完set_watchpoint list_watchpoint和delete_watchpoint
函数之后回到nemu
目录下make run
显示没有在ui.c
中定义函数,但是确实定义了。
解决方法:在ui.c
中存在watchpoint.h
的头文件,所有 watchpoint
相关的函数全都要声明,在watchpoint .h
中声明函数即可,解决如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-addQcwvk-1649584239901)(C:\Users\86178\Documents\计组\PA1.2 1.3\picture\问题2.jpg)]
实验心得
本次实验的难度比之前实验难度大很多,接触到的例如正则表达求值,正则达式的表示 ,都是引得只是,刚开始使用稍不注意就会报错,匹配方面还要慢慢 修改,监视点的内容运用了链表的知识,回去复习了一遍,软件的断点目前还没有思路和方法实现,还需要一些时日,总之,实验难度大了,思考内容多了起来,要慢慢跟上节奏。
其他备注
明天会更好
在watchpoint .h
中声明函数即可,解决如下:
[外链图片转存中…(img-addQcwvk-1649584239901)]
实验心得
本次实验的难度比之前实验难度大很多,接触到的例如正则表达求值,正则达式的表示 ,都是引得只是,刚开始使用稍不注意就会报错,匹配方面还要慢慢 修改,监视点的内容运用了链表的知识,回去复习了一遍,软件的断点目前还没有思路和方法实现,还需要一些时日,总之,实验难度大了,思考内容多了起来,要慢慢跟上节奏。
其他备注
明天会更好