当前位置:文档之家› 比赛评分系统设计

比赛评分系统设计

目录摘要 (1)1概述 (2)1.1任务要求 (2)1.2编程环境 (2)2分析 (3)2.1程序功能 (3)2.2设计思路 (3)3程序流程图 (4)3.1主程序流程图 (4)3.2子程序流程图 (5)4程序调试 (8)5心得与体会 (9)参考文献 (11)摘要用汇编语言编写程序能够直接利用硬件系统的特性直接对位、字节或字寄存器、存储单元、I/O端口进行处理,同时也能直接使CPU指令系统和指令系统提供的各种寻址方式编出高质量的程序。

汇编程序是最早也是最成熟的一种系统软件,能够将汇编语言源程序翻译成机器语言程序,可以自动对源程序进行检查给出错误信息等。

本说明书主要介绍了用汇编语言编写程序计算比赛成绩的设计思路和编程流程图,以及调试程序时的心得与体会。

关键词汇编流程比赛评分系统程序设计1概述1.1任务要求①比赛选手人数控制在30以下;②9个评委,每个评委给分范围为0~10分(整数),随机给出分数③9个评委的给分中,去掉一个最高分和一个最低分,余下7位评委的平均分即为参加者的得分(精确到小数点后一位);④将分数在屏幕中间位置处用红色显示出来;⑤将参加比赛的选手的排名顺序显示出来。

1.2编程环境把汇编语言翻译成机器语言的过程称为汇编,为了实现这一过程正确运行汇编语言,系统需具备以下编辑程序:Masm.exeLink.exeDebug.exeMasm为宏汇编程序,负责对源文件进行汇编;link为连接程序,把汇编后产生的目标模块连接在一起,产生可执行文件;debug是调试程序,它是调试汇编语言程序必不可少的工具。

2分析根据设计任务书分析得出程序要求具备的功能,进而写出自己的设计思路。

2.1程序功能根据设计任务要求可以得出所涉及程序必须具有以下功能(1)显示选手序号(2)显示9个评委的评分(3)用红色字体显示每位选手的平均分(4)根据选手平均得分排序(本程序按照分数由高到低排列)2.2设计思路主要采用循环结构和子程序调用的基本结构形式,编写程序产生9个0~10的随机数,找出这9个数中的最大和最小的数,即评委给出的最高分和最低分,分别保存。

再对这9个数求和,减去前面保存的最大数和最小数,所得的值除以7,即为选手的平均分,分别保存整数部分和小数部分。

保存该分数并在屏幕中间用红色显示出来。

以上过程循环30次,然后根据平均分的高低对选手进行排序并调用BIOS功能使平均分为红色显示。

为了使程序方便阅读和修改,减少编程工作量,节省存储空间,并易于实现程序的模块化,在编写程序的时候尽可能的把一些具有特定功能的程序段独立出来编写成可以被其他程序多次调用的子程序,然后在主程序需要的地方调用。

汇编程序中的CALL和RET指令就是完成子程序调用和返回功能的。

有了以上基本的设计思路,便可以着手准备开始编写流程图,然后再查阅相关资料巩固关于汇编语言指令系统以及寻址方式的知识和使用技巧,复习调试程序的方法以及常见问题的解决办法等等。

3程序流程图流程图是算法的图形描述,它以图形的方式把解决问题的先后次序和程序的逻辑结构直观地、形象地描述出来,使得编程的思路清晰,有利于编制、调试程序。

3.1主程序流程图图3-1 主程序流程图为了使程序简洁明了和易于调试查错,因此把流程图分成了几个部分。

主程序的流程图如上图3-1所示,由流程图中可以看出程序的主要设计思路和整体框架。

3.2子程序流程图对于一些具有特殊功能的程序可以编制成子程序,通过调用来实现功能,这样有利于程序的读和写,也易于查错,因此本题将显示指定字符串、显示十进制ASCII码、查找最高分最低分的过程编写成子程序以供调用,方便简洁明了,可以更快地确定编程的方向和目的,找出解决问题的最佳途径。

由于显示指定字符串、显示十进制ASCII码涉及DOS功能调用,指令简单,为汇编者所熟记的知识,可以不用流程图再次赘述。

查找最高分最低分的流程图如图3-2所示,从图中可以看出,找出最高分的方法和查找最低分的方法类似,只需更改其中的个别指令,即可达到目的。

图3-2 查找最高分和最低分程序流程图将各个选手按照所得的平均分排序的程序流程图如图3-3所示。

由于参赛选手的人数不多,采用冒泡法排序可以达到快速、准确的效果。

数据的排序采用冒泡法降序排列,将其两两比较。

前一个数较大,则不改变原位置,否则两数交换,一次将全部数据排序,排序的次数由需要排序的数据个数决定。

这种排序方法是从最低部的元素开始进行比较,较小的元素将会像气泡一样往上冒。

在排序的过程中,外循环遍历要排序的元素,内循环用于挑选出最值。

内循环用于将相邻的两个元素进行比较,将小的元素调到大元素的前头,内循环的循环次数表示相邻元素的交换趟数。

此外,在整个程序中,除了这三个主要环节,还需要编写子程序用于显示字符串,产生随机数等等,这些模块的编程思路比较直观,所以在流程图中没有着重表明。

图3-3 将平均成绩排序的流程图有了编写汇编语言计算比赛成绩的思路和流程图之后,通过查找一些不常见的指令和查阅相关的参考资料,就可以编写出初步的源程序。

4程序调试经过调试程序,得出随机给出选手得分的运行的结果如图4-1所示。

图4-1 随机给出的选手得分最终排名和选手所得的分数如图4-2所示。

图中给出了24位选手的成绩和排名,排名顺序为从高分到低分,最后一列为各个选手所得的平均分,用红色显示。

图4-2 选手排名顺序5心得与体会在本次比赛评分系统程序的设计过程中,本小组各成员积极配合想算法,分工协作写程序,历经百般波折,通过几个昼夜的艰苦奋战,终于在我们几近绝望的最后关头突然跳出来一个窗口,程序运行成功了,大家手舞足蹈、欢欣雀跃,总算努力没有白费,俗话说得好:坚持,就意味着一切。

本次微机原理课程设计感受颇深,受益匪浅。

由于初学汇编语言,再加上平时的习题都很简单而且要求不高,所以在看到题目的时候,一开始有些傻眼不知从何着手,仔细看了看想了想查了查资料后发现把问题分块处理,各个击破,最后再拧成一股绳,问题貌似就变得简单很多,主要是如何拧成一股绳,从何处开始拧,也就是如何把各个子程序在何处调用才能实现功能,这个问题确实需要大动脑筋才能确保最后的结果和设计要求相符。

第一次上机用汇编编写程序,第一次接触用汇编语言程序产生随机数,第一次尝试着编写子程序,也是第一次听说还有BIOS功能调用。

万事开头难,但总要开个头,第一天没着落,就想啊,查资料,通过小组成员讨论后决定各成员分工合作,每人负责一个功能,最后一起合成调试。

然后各自就开始努力的工作了,先是根据要求把可能用到的书中的知识复习巩固了一遍,然后对准问题查阅相关资料,遇到相似的问题就借鉴过来,再根据实际问题需要编写自己的程序,就这样一步步按照流程做了下来,途中遇到了诸多问题,但是问题必须解决才能继续往下写,虽然好些天疲于奔命于图书馆、书店,但是有压力就有动力,逐渐的问题变得越来越少。

编写程序过程中,开始是一塌糊涂,对一些伪指令和DOS功能调用方便掌握不牢固,编写起程序来很不灵活,经过查阅资料和询问同学,在边摸索边实践的过程中,我体会到了编写程序不仅需要广泛深入的知识面,还需要灵活的头脑和严密的逻辑思维,稍有考虑不到的方面,程序就会“没有生成OBJ文件”。

循序渐进的,我终于编写出了我脑子里所想的初步程序,但输入到MF2KP集成开发环境中运行时,一开始的热情瞬间就没了,程序无法编译,不能生成.obj 文件,想了许久,明白了一点:编写程序最主要的其实不是在于如何编写而是成百上千次甚至上万次的不断调试。

于是,我开始了调试程序这复杂而又极其漫长的过程。

最终在小组成员共同的努力下,我们成功了,一股成就感袭上心头,各个都笑了,也松了口气,回头想想,不仅巩固了所学知识,而且锻炼我们理论结合实际的能力和团队合作能力。

同时也发现了些许不足,我敢肯定的是这次发现的问题被牢牢记住了,还起了个加深记忆的作用。

通过本次课设我发现,定义的变量是可以直接用inc、dec的,即对其内容值加1、减1,但是要注意,虽然变量可以看成符号地址,不过此处只是把它们的数据内容加1或减1,而非对其地址,之前我以为不能直接对定义好的变量用inc、dec;使用十六进制数时,若第一个数位值是字母,要在在其前加0,否则会被认为是变量;寄存器、变量之间传递值时,位数要一致;使用push后记得相应地使用pop,还要注意二者应反序,即push ax,push bx,push cx与pop cx,pop bx,pop ax相对应;在子过程中的ret 处之前应放上相应地放上pop语句,而子过程的入口处应相应放上push语句;要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错,也易于排错修改;标号最好采用有意义的英文,这样比较直观,注释尽量详细准确,便于阅读,而且有利于其它程序中作为子程序模块的调用。

还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的。

这些问题是这次课程设计体会比较深刻的几个方面。

总而言之,通过本次比赛评分系统程序的设计,不仅巩固了所学汇编知识,而且在知识的广面和深面上有了相当程度的拓展。

几个枯燥的字母被我们这一折腾竟然变得有了活力,使我感觉到汇编强大的魔力,编程就像日常生活一样,是个不断探索和发现的过程,途中必然会遇到困难,前面出现坎儿,是因为对面就是平原,编程序要知道:坚持,就意味着一切。

参考文献[1]沈美明,温冬蝉.IBM-PC汇编语言程序设计(第2版).清华大学出版社,2001[2]沈美明,温冬蝉.IBM-PC汇编语言程序设计例题习题集.清华大学出版社,1991[3]陆忠华.汇编语言程序设计.科学出版社,1993[4]迟成文,王保秀.汇编语言程序设计.中国科学技术大学出版社,1993[5]徐建民.汇编语言程序设计.电子工业出版社.2005年[6]彭虎,周培玲,傅忠谦.微机原理与接口技术(第2版).电子工业出版社,2008 附录Code SegmentAssume CS:Code,DS:Code; -------------------------------------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addrpush axlea dx,Str_Addrmov ah,9int 21hpop axEndM; -------------------------------------; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示; 入口:AX=二进制数; 出口:在当前光标位置显示转换后的ASCII码数字Dec_ASCII Proc Nearmov dh,10div dhor ax,3030h ;将两位十进制数转换成ASCII码cmp al,30hja $+4mov al,20h ;若十位数是0,以空格代替push axmov ah,0ehint 10h ;显示十位数pop axxchg ah,almov ah,0ehint 10h ;显示个位数retDec_ASCII EndP; -------------------------------------Commentators equ 9 ;评委人数Contestants equ 23 ;参赛选手人数Press_Key db 0ah,0dh,'The complated. Press any key to exit...$' Start: mov di,64 ;显示缓冲区偏移地址mov ax,0b800h ;显示缓冲区段地址mov es,axmov al,20hmov ah,4 ;字符颜色(红色)mov cx,Contestants ;参赛选手人数cld@@Line: push cxmov cx,3rep stoswadd di,154 ;显示缓冲区下一行同列偏移地址pop cxloop @@Linepush cspop ds ;使数据段与代码段同段push cspop es ;使附加段与代码段同段; -------------------------------------; 评委随机打分cldlea si,Buffer ;数据缓冲区地址(选手成绩链表)mov di,siadd di,Contestants*2 ;选手成绩存放地址mov cx,Contestants ;参赛选手人数mov dl,11 ;除数Grade_0: push cxmov [si],di ;选手成绩地址inc siinc si ;下一个链表节点地址mov ax,Contestants+1sub ax,cx ;选手序号stosb ;保存选手序号xor bx,bx ;BH=,最高分初值,BL=最低分初值xor dh,dh ;选手总分初值mov cx,Commentators ;评委人数Grade_1: xor al,alout 43h,alin al,40hxor ah,ahdiv dlxchg ah,al ;舍弃商数,取余数,作为某评委的打分stosb ;保存一个评委打分add dh,al ;累计评委打分cmp bh,aljae $+4 ;最高分>=此评委打分mov bh,al ;保存新的最高分cmp bl,aljbe $+4 ;最低分<=此评委打分mov bl,al ;保存新的最低分loop Grade_1mov al,dhsub al,bh ;减去一个最高分sub al,bl ;减去一个最低分stosb ;保存最后得分pop cxloop Grade_0; -------------------------------------; 用冒泡排序法对选手最后得分降序排序lea si,Buffer ;选手成绩链表地址mov cx,Contestants ;参赛选手人数dec cx ;外循环次数Sorting: push cx ;入栈保存外循环次数push si ;入栈保存数组地址Compare: push sipop di ;当前数组元素地址赋给目的变址寄存器,以备交换之用lodsw ;将当前数组元素读入累加器mov bx,axmov al,[bx][10] ;将当前最后得分读入累加器ALmov bx,[si] ;相邻的下一个选手信息地址cmp al,[bx][10] ;当前选手最后得分与相邻的下一个选手最后得分相比较jae NextOne ;若大于或等于,不作数据交换,处理下一个数组元素mov ax,[di] ;若小于,读入当前选手信息链表节点xchg ax,[si] ;交换链表元素mov [di],ax ;保存数值较大者节点地址NextOne: loop Compare ;处理下一个数组元素pop si ;数组地址出栈pop cx ;外循环次数出栈loop Sorting ;下一趟比较; -------------------------------------; 按总成绩降序显示所有选手各评委打分、平均得分mov cx,Contestants ;参赛选手人数xor bh,bh ;显示页号0Contestant: push cxpush simov si,[si] ;读入链表节点(某选手成绩地址)lodsb ;读入选手序号xor ah,ahcall Dec_ASCII ;显示参赛选手序号mov ah,0ehmov al,':'int 10hmov al,20hint 10h ;空一格mov cx,Commentators ;评委人数Commentator: xor ah,ahlodsb ;读入选手某评委打分call Dec_ASCII ;显示分数mov ax,0e20hint 10h ;空一格loop Commentatorint 10h ;空一格lodsb ;读入选手最后得分xor ah,ahmov dl,Commentators-2 ;评委人数-2 div dl ;AL=商数,AH=余数mov bl,ahor al,30hmov ah,0ehint 10h ;显示平均得分商数mov ah,0ehmov al,'.'int 10h ;显示小数点mov al,blmov bl,10mul bldiv dlor al,30hmov ah,0ehint 10h ;显示平均得分小数mov ax,0e0dhint 10hmov al,0ahint 10hpop siinc siinc si ;下一个链表节点地址pop cxloop Contestant; -------------------------------------Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序mov ah,1int 21hmov ah,4ch ;结束程序int 21hBuffer: ;数据缓冲区Code ENDSEND Start ;编译到此结束。

相关主题