课程设计说明书设计名称:计算机操作系统课程设计题目:操作系统命令接口设计学生姓名:张协鎏专业:计算机科学与技术班级:13计算机科学与技术2班学号:2013314209指导教师:任朝晖、曾凡智、黄营、周燕日期:2015年9 月20 日计算机科学与技术专业2013 年级 2 班张协鎏一、设计题目操作系统命令接口设计二、目的和要求(1)本设计的目的是通过设计一些简单的操作系统的命令接口,使学生掌握操作系统接口的设计方法。
(2)要求学生在熟悉操作系统的命令接口及程序接口的基础上,利用C语言设计简单的命令接口。
命令接口基于DOS的命令行接口。
三、设计内容利用C语言、DOS中断中21H与屏幕显示相关的中断调用完成设计,具体包括:1.命令解释器2.列目录命令3.显示时间命令4.显示日期命令5.回显字符串命令6.创建目录命令7.删除目录命令8.更改路径命令9.显示当前工作目录命令10.删除文件命令11.打印文本命令12.文件重新命名13.显示文本命令14.显示版本命令15.显示目录结构命令16.清除当前显示内容命令上述内容中,所有命令通过命令解释器能够执行,即启动命令解释器以后,输入相应命令,按照输入指令执行相应功能,并在屏幕上显示相应结果。
四、进度安排依照教学计划,课程设计时间为:2周。
1.要求讲解、资料查找、系统分析,概要设计(2天)2.系统详细设计、功能设计(2天)3.算法实现、编程调试(5天)4.功能演示、资料整理、课程设计说明书编写。
(1天)五、完成后应上交的资料课程设计的总结报告,主要包括以下内容:1.课程设计的题目、系统的总功能和各子模块的功能;2.源程序代码;3.课程设计中遇到的主要问题和解决方法;4.设计中存在的不足及改进的设想;5.本次课程设计的感想和心得体会。
六、总评成绩指导教师签名日期年月日系主任审核日期年月日操作系统命令接口设计一、概念原理中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。
即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU 暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
中断是一种发生了一个外部的事件时调用相应的处理程序的过程,通常,程序中断是由外部设备通过CPU的中断请求线向CPU提出的。
在一定条件下,CPU响应中断后,暂停源程序的执行,转至为外设服务的中断处理程序。
中断处理程序可以按照所要完成的任务编写与过程类似的程序段。
在程序段最后执行一条中断返回指令返回主程序,继续按原顺序执行。
操作系统命令接口:通过在用户和操作系统之间提供高级通信来控制程序运行,用户通过输入设备发出一系列命令告诉操作系统执行所需功能,它包括了键盘操作命令和作业控制命令,称为作业一级的用户接口。
命令接口的两种最普遍和主要的方式是直接命令方式(命令行)和间接命令方式(命令文件)。
二、程序设计实现过程程序通过选择开关switch...case将用dos,bios调用编写的函数组合起来供用户做出选择。
在对应处理用户的选择编写的函数中,主要的核心是dos功能中断调用函数的编写,其中包括中断类型号,中断功能调用号等的设置,以及响应用户选择后中断服务程序的编写。
1、程序主要函数void menu():用户功能选择菜单;void time():显示时间功能,输出当前电脑设置时间,能精确到毫秒;void day():显示日期功能,输出当前电脑设置日期,输出格式为2015.9.20,week:0;void dos():显示电脑DOS版本号功能,输出DOS版本号,格式为5.0.16.0.0;void DeleteFile(char filename[80]):删除文件功能,调用DOS中断21H的41H的删除文件命令;void Createfile(char filename[80]):创建目录功能,调用DOS中断21H的39H的创建目录命令;void Deletefile(char filename[80]):删除目录功能,调用DOS中断21H的3AH的删除目录命令;void file(char filename1[80],char filename2[80]):文件重新命名功能,调用DOS中断21H的56H的文件改名命名命令;void showlist():显示当前工作目录功能,调用DOS中断21H的47H的显示当前工作目录命令;void rewords():键盘输入字符并回显字符功能,调用DOS中断21H的09回显字符串的命令;clrscr():清除当前显示内容功能。
2、程序调试运行结果分析开始运行功能选择界面输入功能号1显示当前系统时间,输入功能号2输出当前系统日期,输入功能号3输出当前系统DOS版本,输入功能号5创建目录,工作目录成功创建文件夹FILE输入功能号7文件改名,改名为NEWFILE,工作目录成功改名NEWFILE,输入功能号6删除NEWFILE文件夹成功,运行调试结果满足实验要求,退出程序,完成设计内容。
三、程序设计总结体会通过连续两个星期的上机编程,我体会了从事C语言课程设计工作需要特别谨慎认真地态度和作风,一点都不能马虎。
每个细微的细节都必须十分注意,如果不认真思考,就会出现或大或小的错误。
如果把早期的错误隐藏下来,对后面的工作影响就会很大,甚至有时会推倒很多前面做的工作。
有时候,我自己觉得我写的程序非常正确,但是就是编译通不过,在查找错误的过程中,面临着否认自己的过程,非常的痛苦,而且由于自己的经验及各方面的能力的不足,所以进展的速度非常的缓慢,往往几天的时间没有一点进展。
这时候,我一般是先自己通过书本,手册和资料找解决办法,实在没辙才向老师同学请教。
在开始编写程序的时候,我还不清楚DOS中断的知识,刚开始就在上网百度学习有关程序接口和中断调用相关知识,慢慢的开始知道怎么去调用DOS21H的功能号。
回顾此次课程设计,至今我仍然很多感想,的确,自从拿到题目到完成整个编程,从理论到实践,这些日子里,可以学到很多很多的东西,同时不仅可以巩固以前所学的知识,而且学到了很多在书本上所没学到的知识,通过在这次课程设计使我懂得了理论知识与实践动手能力组合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
通过一段时间的课程设计,我明白了程序一定要要亲手做过,不管它是否有结果。
你要学的是知识,是解决问题的方法和思想,要端正学习态度,一时的成败不足以论英雄,每一次突破都是一种收获,就是在这样的过程中我们才能不断提高。
在从开始接到课程设计,再到报告的完成,每走一步都渗透着努力和汗水。
在收获知识的同时收获快乐。
对给过我帮助的所有同学和各位指导老师再次表示衷心的感谢!四、源代码<在Turbo C 3.0环境>#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<dos.h>#include<bios.h>#define INTER 0x21void menu(){printf("0.Exit\n1.Display currrent time\n2.Display currrent day\n");printf("3.Display currrent Mos-dos\n4.Deletefile\n5.Createcontents\n");printf("6.Deletecontents\n7.Filename\n8.Display currrent list\n");printf("9.Echo string\n10.ReadingFile\n11.Clear screen\n");}void time(){union REGS inregs,outregs;//定义中断信息结构体struct SREGS segregs;inregs.h.ah=0x2C;int86x(INTER,&inregs,&outregs,&segregs);printf("Now the time is:%d:%d,%d:%d\n",outregs.h.ch,outregs.h.cl,outregs.h.dh,outregs.h.dl);getchar();}void day(){union REGS inregs,outregs;//定义中断信息结构体struct SREGS segregs;inregs.h.ah=0x2a;int86x(INTER,&inregs,&outregs,&segregs);printf("Now the day is:%d,%d,%d,Week:%d\n",outregs.x.cx,outregs.h.dh,outregs.h.dl,outregs.h.al);getchar();}void dos(){union REGS inregs,outregs;//定义中断信息结构体struct SREGS segregs;inregs.h.ah=0x30;int86x(INTER,&inregs,&outregs,&segregs);printf("The DOS version of this machine is:%d,%d,%d,%d:%d\n",outregs.h.al,outregs.h.ah,outregs.h.bh,outregs.h.ah,outregs.x.cx);getchar();}void DeleteFile(char filename[80]){union REGS inregs,outregs;struct SREGS segregs;inregs.h.ah=0x41;//DOS中断号41是删除文件inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);int86x(INTER,&inregs,&outregs,&segregs);if(02==outregs.x.ax)//02表示文件未找到{printf("\nFILE %s is not exist!\n",filename);}printf("\nThe File: %s has been delete successfully\n",filename);}void Createfile(char filename[80]){union REGS inregs,outregs;struct SREGS segregs;inregs.h.ah=0x39;inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);int86x(INTER,&inregs,&outregs,&segregs);if(02==outregs.x.ax)//02表示文件为找到{printf("\nFILE %s is not exist!\n",filename);}printf("success!\n");}void Deletefile(char filename[80]){union REGS inregs,outregs;struct SREGS segregs;inregs.h.ah=0x3A;inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);int86x(INTER,&inregs,&outregs,&segregs);if(02==outregs.x.ax)//02表示文件为找到{printf("\nFILE %s is not exist!\n",filename);}printf("success!\n");}void file(char filename1[80],char filename2[80]){union REGS inregs,outregs;struct SREGS segregs;inregs.h.ah=0x56;//DOS中断号56是重命名文件inregs.x.dx=FP_OFF(filename1);segregs.ds=FP_SEG(filename1);inregs.x.di=FP_OFF(filename2);segregs.es=FP_SEG(filename2);int86x(INTER,&inregs,&outregs,&segregs);if(outregs.x.ax==02){printf("\nFILE %s is not exist!\n",filename1);}printf("success!\n");}void showlist(){char list[80];union REGS reg;struct SREGS segreg;reg.h.ah = 0x47;reg.h.dl = 0;reg.x.si = FP_OFF(list);segreg.ds = FP_SEG(list);intdosx(®, ®, &segreg);printf("The current working directory is:%s\n", list); }void rewords(){union REGS reg,reg1;struct SREGS sreg;char word[200];for(int i=0;i<200;i++)word[i]='$';scanf("%s",&word);reg1.x.dx = FP_OFF(word);sreg.ds = FP_SEG(word);reg1.h.ah=0x09;int86x(INTER,®1,®1,&sreg);printf("\n");}void ReadFromFile(char filename[80]){union REGS inregs,outregs;struct SREGS segregs;int result;char ReadContents[20];inregs.h.ah=0x3D;inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);inregs.h.al=2;intdosx(&inregs,&outregs,&segregs);result = outregs.x.ax;if(2==result){printf("\nCan not read contents from file: %s ! The file may not exist\n",filename);}{inregs.x.bx=result;inregs.h.ah=0x3F;inregs.x.dx=FP_OFF(ReadContents);segregs.ds=FP_SEG(ReadContents);inregs.x.cx=20;intdosx(&inregs,&outregs,&segregs);printf("%s file byte number: %d\n",filename,outregs.x.ax);printf("%s contents is:",filename);for(int i=0;i<outregs.x.ax;i++){printf("%c",ReadContents[i]);}printf("\n");}}int main(){char DeleteFileName[80];char ReadingFileName[80];char file1[80],file2[80];do{menu();scanf("%d",&a);switch(a){case 1:time();break;case 2:day();break;case 3:dos();break;case 4:printf("\nInput the name of existing file to delete: ");scanf("%s",&DeleteFileName);DeleteFile(DeleteFileName);break;case 5:printf("\nInput createfile: ");scanf("%s",&DeleteFileName);Createfile(DeleteFileName);break;case 6:printf("\nInput deletefile: ");scanf("%s",&DeleteFileName);Deletefile(DeleteFileName);break;case 7:printf("name:");scanf("%s",&file1);printf("new name:");scanf("%s",&file2);file(file1,file2);break;case 8:showlist();break;case 9:rewords();break;case 10:printf("\nInput the name of existing file to ReadingFileName: ");scanf("%s",&DeleteFileName);ReadFromFile(ReadingFileName);break;case 11:clrscr();break;default:break;}}while(a!=0);return 0;}。