




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 计算机科学与技术学院 系统软件开发实践报告 王冬升 姓名: 08123228 号 : 学 业:专 计算机科学与技术 级:班计科12-1 班 博 指导教师: 张 月 2015 4年 摘 要 操作系统和编译原理是大学计算机专业的必修课程。在这些课程的教学教程中,容易偏重于理论的介绍,而忽视了实践环节。 本课程设计是在完成C+程序设计、数据结构、操作系统、编译技术教学后所进行的,全面综合训练学生的系统软件开发能力 关键字:编译系统、Flex、Bison、操作系统、启动、内存管理 计算机科学与技术学院系统软件开发实践报告 第1页 目 录 1 借助Flex进行词法分析 2 1.1实验内容 2 1.2
2、实验要求 2 1.3 程序代码 2 1.4 实验结果 4 2 借助Flex/Bison进行语法分析 5 2.1 实验内容 5 2.2 实验要求 5 2.3 程序代码 5 2.4 实验步骤 5 2.5 实验结果 7 3 Flex/Bison综合实验 7 3.1 实验内容 7 3.2 计算器具体需要实现的功能 7 3.3 实验要求 7 3,4 程序代码 8 3.5 实验结果 11 4(操作系统实验)lib0:熟悉实验环境 11 4.1 实验目的 11 4.2 实验环境搭建 11 4.3 GCC编译练习 12 4.4 GDB调试练习 12 13 :启动操作系统 5(操作系统实验)lib113 5.1
3、 实验目的14 5.2 实验内容14 5.3 实验步骤15 5.4 操作系统启动过程 16 5.5 实模式与保护模式 16 :物理内存管理 6(操作系统实验)lib216 6.1 实验目的16 6.2 实验内容 6.3 实验体会7 参考文献8 计算机科学与技术学院系统软件开发实践报告 第2页 1借助Flex进行词法分析 1.1实验内容 给定C语言的一个子集,具体内容如下: 1. 下面是语言的关键字: else if switch for int float return void while 所有的关键字都是保留字,并且必须是小写。 2. 下面是专用符号: + - * / < <=
4、 > >= = != = ; , ( ) /* */ 3. 其他标记是标识符(ID) 和数字(NU ),通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|9 注:小写和大写字母是有区别的。 4. 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 5. 注释用通常的C语言符号/* . . . */围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 1.2实验要求 编写 LEX 源文件,实
5、现C 语言子集的词法分析功能,最后上机调试。 要求编写一个测试程序,以给定的测试文件作为输入,输出运行结果到输出文件中 1.3程序代码 Lex.l源码: % #include <stdio.h> #include <stdlib.h> #include <string.h> int yywrap(); int lineno=1; % delim t ws delim+ letter A-Za-z digit 0-9 计算机科学与技术学院系统软件开发实践报告 第3页 id letter+ number digit+ enter n spchar 尨屻屼屽屼屛屼
6、屝屼尨屼尩屼尻屼尽屼尬屼尫屼尭屼尪屼?籜?籜?尽屼尾屼?籜?尽屼!=) comment /*(*/|*)*/ kwd (else|if|switch|for|int|float|return|void|while) % ws comment enter lineno+; kwd fprintf(yyout,%d行tkeywodt%sn,lineno,yytext); spchar fprintf(yyout,%d行tspchart%sn,lineno,yytext); id fprintf(yyout,%d行tidentit%sn,lineno,yytext); number fprintf(
7、yyout,%d行tnumbert%sn,lineno,yytext);. % int yywrap() return 1; int main(void) char infilename100; 牰湩晴尨输入文件名: ); scanf(%s,infilename); yyin = fopen(infilename,); yyout = fopen(out,w); yylex(); return 0; 1-1.cpp 测试程序:#include<iostream> using namespace std; 计算机科学与技术学院系统软件开发实践报告 第4页 int main() int
8、 a; int d=123456; float b=123.45; int e=9; a=(1+2-1)*4/2; if(a>b)cout<<a>b<<endl; else cout<<a<=b<<endl; cout<<a<<endl; cout<<b<<endl; cout<<Welcome to c+<< endl; return 0; 1.4实验结果 实验结果输出到.out文件中,截图示例: 第5页 计算机科学与技术学院系统软件开发实践报告 进行语法
9、分析2借助Flex/Bison 2.1实验内容语言分析编写一个C语言文法的相关参考资料,利用利用附录提供的CYacc/Bison 器。具体内容:编写一个语法分析程序,与词法分析器结合能够利用语法分析器生成工具Bison1) 根据语言的上下文无关文法,识别输入的单词序列是否文法的句子语言分CC语言文法的相关参考资料,利用Yacc/Bison编写一个利用附录提供的2) 析器。 实验要求2.2 源文件,实现 BisonC 语言的语法分析功能,最后上机调试。1) 编写 2) 要求编写一个测试程序,以给定的测试文件作为输入,输出运行结果到输出文件中。 2.3程序代码由于本实验的lex源文件和yacc源文
10、件代码较长而且在“实验附录:C语言相关文法”文件夹中已经给出相关源码的链接,由于报告篇幅限制不再贴出源码 Test.测试文件源码: void main() int i = 0;int j = 0; void t1() int i = 0; typedef unsigned int uint; uint xx; uint yy; 2.4实验步骤 1、flex -l input.lex 计算机科学与技术学院系统软件开发实践报告 第6页 bison -d cgrammar-new.y (产生头文件和.c文件) 2、comment函数调用yyinput,编译会有链接错误,解决方法一,将lex.yy.c
11、中的yyinput函数定义拷贝一份到input.lex, 重命名为my_yyinput, 或者将lex.yy.c中的 #ifdef _cplusplus static int yyinput() #else static int input() #endif 改为static int yyinput() 上述问题出现的情形:词法分析器的后缀名为.c, 而不是.cpp 3、cgrammar-new.tab.c中如下程序段 /*-. | yyparse. | -*/ #ifdef YYPARSE_PARAM # if defined (_STDC_) | defined (_cplusplus)
12、int yyparse (void *YYPARSE_PARAM) # else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; # endif #else /* ! YYPARSE_PARAM */ #if defined (_STDC_) | defined (_cplusplus) int yyparse (void) #else int yyparse () ; #endif #endif 改为 int yyparse () 或者 int yyparse (void) 4、lex.yy.c中,将下面语句注释 if ( ! yyin )
13、yyin = stdin; 5、解析之前,设置yyin为输入文件指针 extern FILE *yyin; if(!(yyin = fopen(filename,) printf(he file not existn); exit(0); 2.5实验结果 实验结果输出到.out文件中,截图示例: 计算机科学与技术学院系统软件开发实践报告 第7页 综合实验3 Flex/Bison 实验内容3.1开发了一个具有全部功能的桌面计算器,能够支持变量,过程,bisonflex和使用 循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。 重点学习抽象语法树的用法,它具有强大而简单的数据结构来表
14、示分析结果 3.2计算器具体需要实现的功能if/then/else等于等等)实现实现赋值功能;实现比较表达式(大于、小于、变量命名; do/while的流程控制;用户可以自定义函数;简单的错误恢复机制和 3.3实验要求 语言的语法分析功能,最后上机调试。 Flex/Bison源文件,实现C 编写 要求编写一个测试程序:avgNewton方法来迭代计算平方根;,和avgsq函数使用首先自定义两个函数1) sq 函数计算两个数值的平均值。 利用定义好的函数进行计算,得到计算结果并显示出来2) 程序代码3.4 源码Cal.l% #include cal.tab.h % %option noyywra
15、p 0-9+ integer 计算机科学与技术学院系统软件开发实践报告 第8页 dreal (0-9*.0-9+) ereal (0-9*.0-9+EedD+-?0-9+) real dreal|ereal nl n plus + minus - times * divide / lp ( rp ) module % power % t ; /*skip any blanks */ integer sscanf(yytext, %d, &eger); return INTEGER; real sscanf(yytext, %lf, &yylval.real)
16、;/*yylval = atof(yytext); work doesn't it under MSVSC*/ return REAL; return PLUS; plus return MINUS; minus return TIMES; times return DIVIDE; divide return MODULE; module return POWER; power return LP; lp return RP; rp return NL; nl return yytext0; . Cal.y源码% <stdio.h> #include <math.h&
17、gt; #include % real; /* real value */ %union double integer; /* integer value */ int %token <real> REAL %token <integer> INTEGER lines %start %token NUMBER NL %token PLUS MINUS TIMES DIVIDE MODULE POWER LP RP rexpr %type <real> %type <integer> iexpr /*left associative */ %lef
18、t PLUS MINUS %left TIMES DIVIDE MODULE /*left associative */ 计算机科学与技术学院系统软件开发实践报告 第9页 %left POWER %left UNARYMINUS % lines: /* nothing */ | lines line NL | lines error NL yyerror();yyerrok; ; line : iexpr printf(%dn,$1); | rexpr printf(%lfn,$1); ; iexpr: INTEGER $ = $1; | iexpr PLUS iexpr $ = $1 + $
19、3; | iexpr MINUS iexpr $ = $1 - $3; | iexpr TIMES iexpr $ = $1 * $3; | iexpr DIVIDE iexpr if($3) $ = $1 / $3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero, 3.first_line, 3.first_column, 3.last_line, 3.last_column); | iexpr MODULE iexpr $ = $1 % $3; | iexpr POWER iexpr $ = pow($1, $3);
20、| MINUS iexpr %prec UNARYMINUS $ = - $2; | LP iexpr RP $ = $2; | LP iexpr error $ = $2; yyerror(missing ')'); yyerrok; | PLUS iexpr %prec UNARYMINUS $ = $2; rexpr :REAL $ = $1; | rexpr PLUS rexpr $ = $1 + $3; | rexpr MINUS rexpr $ = $1 - $3; | rexpr TIMES rexpr 计算机科学与技术学院系统软件开发实践报告 第10页 $ =
21、$1 * $3; | rexpr DIVIDE rexpr if ($3)$ = $1 / $3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero, 3.first_line, 3.first_column, 3.last_line, 3.last_column); | rexpr POWER rexpr $ = pow($1,$3); | LP rexpr RP $ = $2; | LP rexpr error $ = $2; yyerror(missing ')'); yyerrok; | MINUS r
22、expr %prec UNARYMINUS $ = -$2; | PLUS rexpr %prec UNARYMINUS $ = $2; | iexpr PLUS rexpr $ = (double)$1 + $3; | iexpr MINUS rexpr $ = (double)$1 - $3; | iexpr TIMES rexpr $ = (double)$1 * $3; | iexpr DIVIDE rexpr if($3) $ = (double)$1 / $3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero,
23、3.first_line, 3.first_column, 3.last_line, 3.last_column); | iexpr POWER rexpr $ = pow(double)$1,$3); | rexpr PLUS iexpr $ = $1 + (double)$3; | rexpr MINUS iexpr $ = $1 - (double)$3; | rexpr TIMES iexpr $ = $1 * (double)$3; | rexpr DIVIDE iexpr if($3) $ = $1 / (double)$3; else $ = $1; printf (stderr
24、, %d.%d-%d.%d: division by zero, 计算机科学与技术学院系统软件开发实践报告 第11页 3.first_line, 3.first_column, 3.last_line, 3.last_column); | rexpr POWER iexpr $ = pow($1,(double)$3); ; % void main() yyparse(); int yyerror(char* msg) printf(Error: %s encountered n, msg); 3.5实验结果 实验结果截图: 4(操作系统实验)lib0:熟悉实验环境 4.1实验目的 1) 了解
25、操作系统开发实验环境 熟悉命令行方式的编译、调试工程 2) 掌握基于硬件模拟器的调试技术 3) 熟悉C语言编程和指针的概念4) 了解5) X86汇编语言 4.2实验环境搭建 1) 在线实验-基于实验楼在线平台 2) Windows下基于MingW进行实验 3) Windows下基于VirtualBox or VMWare进行实验 计算机科学与技术学院系统软件开发实践报告 第12页 4) 在MAC OS下进行实验 5) 手动在物理PC中安装环境 4.3 GCC编译练习 采用实验环境:在线实验-基于实验楼在线平台 gcc示例: #include<stdio.h> int main(vo
26、id) printf(hello!n); return 0; 在实验环境中右键->从模板创建->空文件,将上述示例代码输入 1) 保存为hello.c 打开命令行,输入以下命令: 2) 编译:gcc -Wall hello.c -o hello 3) 执行:./hello 操作及结果截图: 4.4 GDB调试练习 1)输入命令:gcc -o hello hello.c g进行编译 2)输入命令:gdb进入调试 3)依次输入以下命令熟悉gdb调试 计算机科学与技术学院系统软件开发实践报告 第13页 file hello:进入hello文件 run:运行hello break 1:在第
27、一行插入断点 next:单步执行下一行语句 clear 1:清除第一行的断点 list :显示hello文件的内容 quit:退出gdb调试 对应命令执行结果截图: GDB的其它调试命令补充: next :单步到程序源代码的下一行,不进入函数。 nexti :单步一条机器指令,不进入函数。 step :单步到下一个不同的源代码行(包括进入函数)。 stepi :单步一条机器指令 他们功能各不相同,区别在于单步的“跨度”上。 5(操作系统实验)lib1:启动操作系统 5.1实验目的 操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来
28、完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1提供了一个非常小的bootloader和ucore OS,整个bootloader执行代码小于512个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloader和ucore OS,读者可以了解到: 1)计算机原理 CPU的编址与寻址: 基于分段机制的内存管理 计算机科学与技术学院系统软件开发实践报告 第14页 CPU的中断机制 外设:串口/并口/CGA,时钟,硬盘 2)Bootloader软件 编译运行bootloader的过程 调试boot
29、loader的方法 PC启动bootloader的过程 ELF执行文件的格式和加载 外设访问:读硬盘,在CGA上显示字符串 3)ucore OS软件 编译运行ucore OS的过程 ucore OS的启动过程 调试ucore OS的方法 函数调用关系:在汇编级了解函数调用栈的结构和处理过程 中断管理:与软件相关的中断处理 外设管理:时钟 5.2实验内容 lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS 。5.3实验步骤 熟悉以
30、下命令,掌握操作系统的启动过程: 1) make(ucore.img的生成过程) 2) make V=(gcc把c的源代码编译成.o的目标文件 ld会把这些目标文件呢会转换成一个执行程序,这里面会转换成这个bootblock.out这个实际上是可以理解为是一个Bootloader一个执行程序,第一个是Bootloader 第二叫kernel) 3)启动系统:make qemu 计算机科学与技术学院系统软件开发实践报告 第15页 4) 启动并调试:make debug:进入debug模式 n(执行下一行代码) p ph(显示当前值) continue(继续执行) ctrl+c(中断) quit(
31、推出 5.4操作系统启动过程 当X86一开始加电时候,启动是实模式(实地址寻址模式)(早期的为了ss向下兼容 以前的80X86一开始启动是16位的实模式) 第一条地址: 段地址寄存器CSCS和EIP结合在一起来决定它启动的第一条地址: 按实模式的寻址方式:cs(base)基址+EIP->bios(指向bios) 这个bios固件会去加载磁盘或者硬盘的第一个主引导扇区(即执行0号扇区 lab1中的bootloader)它完成来对我们说的这个操作系统 uCore的进一步加载 Bootloader的工作: 1)要从实模式切换到保护模式,就是从实模式的16位的寻址空间切换到了32位的寻址空间寻址
32、空间:从1M(物理地址=左移4位的段地址+偏移地址)变为4G,段机制可以正常工作了。对系统寄存器CRO(或者叫控制寄存器 )把它的第0号bit置成1那么就意味着现在的系统我们的CPU会进入到保护模式 2)就是读取kernel 就是uCore的代码,CS EIP的值指向我们操作系统内核所在内存中的起始点,之后就相当于是把控制权交给了uCore OS去执行 计算机科学与技术学院系统软件开发实践报告 第16页 5.5实模式与保护模式 (1) 实模式 在bootloader接手BIOS的工作后,当前的PC系统处于实模式(16位模式)运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且无法发挥Intel 80386以上级别的32位CPU的4GB内存管理能力。 实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样,用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。通过修改A20地址线可以完成从实模式到保护模式的转换 (2) 保护模式 只有在保护模式下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社交媒体时代的影视广告新模式研究
- 2025至2030年中国热处理时效炉数据监测研究报告
- 2025至2030年中国灌浆压水测控系统数据监测研究报告
- 北京市物业服务合同(XXXX)
- 科技助力下的绿色校园行动计划
- 未来城市中的高层办公楼规划策略
- 2024年周口市扶沟县农业农村局招募特聘农技员考试真题
- 现代商业会议新标准多功能会议室装修指南
- 2025至2030年中国水肌霜数据监测研究报告
- 科技农业助力大豆种植技术的创新发展
- 企业承包经营合同范本
- 2025年01月公安部第三研究所公开招聘人民警察笔试笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 光缆线路施工安全协议书范本
- 《我国国有企业股权融资效率实证研究》相关概念及国内外文献综述2600字
- 2025-2030全球锂电池用隔膜行业调研及趋势分析报告
- 2025年湖南交通职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 成本合约规划培训
- 2025年高考作文备考训练之二元思辨作文题目解析及范文:我与“别人”
- 《中央集成式商用车电驱动桥总成技术要求及台架试验方法》
- 交通法规教育课件
- 小学校长任期五年工作目标(2024年-2029年)
评论
0/150
提交评论