比赛评分系统设计_第1页
比赛评分系统设计_第2页
比赛评分系统设计_第3页
比赛评分系统设计_第4页
比赛评分系统设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、武汉理工大学微机原理与接口技术课程设计说明书目 录摘 要11概述21.1任务要求21.2编程环境22分析32.1程序功能32.2设计思路33程序流程图43.1主程序流程图43.2子程序流程图54程序调试85心得与体会9参考文献1116摘 要用汇编语言编写程序能够直接利用硬件系统的特性直接对位、字节或字寄存器、存储单元、i/o端口进行处理,同时也能直接使cpu指令系统和指令系统提供的各种寻址方式编出高质量的程序。汇编程序是最早也是最成熟的一种系统软件,能够将汇编语言源程序翻译成机器语言程序,可以自动对源程序进行检查给出错误信息等。本说明书主要介绍了用汇编语言编写程序计算比赛成绩的设计思路和编程流

2、程图,以及调试程序时的心得与体会。关键词 汇编 流程比赛评分系统程序设计1概述1.1任务要求 比赛选手人数控制在30以下; 9个评委,每个评委给分范围为010分(整数),随机给出分数 9个评委的给分中,去掉一个最高分和一个最低分,余下7位评委的平均分即为参加者的得分(精确到小数点后一位); 将分数在屏幕中间位置处用红色显示出来; 将参加比赛的选手的排名顺序显示出来。1.2编程环境把汇编语言翻译成机器语言的过程称为汇编,为了实现这一过程正确运行汇编语言,系统需具备以下编辑程序:masm.exe link.exedebug.exemasm为宏汇编程序,负责对源文件进行汇编;link为连接程序,把汇

3、编后产生的目标模块连接在一起,产生可执行文件;debug是调试程序,它是调试汇编语言程序必不可少的工具。2分析 根据设计任务书分析得出程序要求具备的功能,进而写出自己的设计思路。2.1程序功能根据设计任务要求可以得出所涉及程序必须具有以下功能(1) 显示选手序号(2) 显示9个评委的评分(3) 用红色字体显示每位选手的平均分(4) 根据选手平均得分排序(本程序按照分数由高到低排列)2.2设计思路主要采用循环结构和子程序调用的基本结构形式,编写程序产生9个010的随机数,找出这9个数中的最大和最小的数,即评委给出的最高分和最低分,分别保存。再对这9个数求和,减去前面保存的最大数和最小数,所得的值

4、除以7,即为选手的平均分,分别保存整数部分和小数部分。保存该分数并在屏幕中间用红色显示出来。以上过程循环30次,然后根据平均分的高低对选手进行排序并调用bios功能使平均分为红色显示。为了使程序方便阅读和修改,减少编程工作量,节省存储空间,并易于实现程序的模块化,在编写程序的时候尽可能的把一些具有特定功能的程序段独立出来编写成可以被其他程序多次调用的子程序,然后在主程序需要的地方调用。汇编程序中的call和ret指令就是完成子程序调用和返回功能的。有了以上基本的设计思路,便可以着手准备开始编写流程图,然后再查阅相关资料巩固关于汇编语言指令系统以及寻址方式的知识和使用技巧,复习调试程序的方法以及

5、常见问题的解决办法等等。3程序流程图流程图是算法的图形描述,它以图形的方式把解决问题的先后次序和程序的逻辑结构直观地、形象地描述出来,使得编程的思路清晰,有利于编制、调试程序。3.1主程序流程图开始从40h端口读入一个随机数除以11产生9个010的随机整数,保存找出9个随机数中的最大值和最小值9个数相加减去最大值、最小值除以7得平均分,保存小于30次控制循环30次 大于等于30次将各选手按照平均分降序排列显示选手序号、9个评委的评分和红色字体的平均分 结束图3-1 主程序流程图为了使程序简洁明了和易于调试查错,因此把流程图分成了几个部分。主程序的流程图如上图3-1所示,由流程图中可以看出程序的

6、主要设计思路和整体框架。3.2子程序流程图对于一些具有特殊功能的程序可以编制成子程序,通过调用来实现功能,这样有利于程序的读和写,也易于查错,因此本题将显示指定字符串、显示十进制ascii码、查找最高分最低分的过程编写成子程序以供调用,方便简洁明了,可以更快地确定编程的方向和目的,找出解决问题的最佳途径。由于显示指定字符串、显示十进制ascii码涉及dos功能调用,指令简单,为汇编者所熟记的知识,可以不用流程图再次赘述。查找最高分最低分的流程图如图3-2所示,从图中可以看出,找出最高分的方法和查找最低分的方法类似,只需更改其中的个别指令,即可达到目的。开始开始取出一个数取出一个数与下一个数作比

7、较大于等于?与下一个数作比较小于等于?与下一个数作比较与下一个数作比较与下一个数作比较大于等于?不变替换n不变替换n不变nnyny替换不变保存该数为最高分结束保存该数为最高分保存该数为最高分保存该数为最高分结束图3-2 查找最高分和最低分程序流程图将各个选手按照所得的平均分排序的程序流程图如图3-3所示。由于参赛选手的人数不多,采用冒泡法排序可以达到快速、准确的效果。数据的排序采用冒泡法降序排列,将其两两比较。前一个数较大,则不改变原位置,否则两数交换,一次将全部数据排序,排序的次数由需要排序的数据个数决定。这种排序方法是从最低部的元素开始进行比较,较小的元素将会像气泡一样往上冒。在排序的过程

8、中,外循环遍历要排序的元素,内循环用于挑选出最值。内循环用于将相邻的两个元素进行比较,将小的元素调到大元素的前头,内循环的循环次数表示相邻元素的交换趟数。结束开始此外,在整个程序中,除了这三个主要环节,还需要编写子程序用于显示字符串,产生随机数等等,这些模块的编程思路比较直观,所以在流程图中没有着重表明。比较相邻两个数的大小循环29次前一个数大?ny顺序交换顺序不变小于29大于等于29 保存结果并显示图3-3 将平均成绩排序的流程图有了编写汇编语言计算比赛成绩的思路和流程图之后,通过查找一些不常见的指令和查阅相关的参考资料,就可以编写出初步的源程序。4程序调试经过调试程序,得出随机给出选手得分

9、的运行的结果如图4-1所示。图4-1 随机给出的选手得分最终排名和选手所得的分数如图4-2所示。图中给出了24位选手的成绩和排名,排名顺序为从高分到低分,最后一列为各个选手所得的平均分,用红色显示。图4-2 选手排名顺序5心得与体会在本次比赛评分系统程序的设计过程中,本小组各成员积极配合想算法,分工协作写程序,历经百般波折,通过几个昼夜的艰苦奋战,终于在我们几近绝望的最后关头突然跳出来一个窗口,程序运行成功了,大家手舞足蹈、欢欣雀跃,总算努力没有白费,俗话说得好:坚持,就意味着一切。本次微机原理课程设计感受颇深,受益匪浅。由于初学汇编语言,再加上平时的习题都很简单而且要求不高,所以在看到题目的

10、时候,一开始有些傻眼不知从何着手,仔细看了看想了想查了查资料后发现把问题分块处理,各个击破,最后再拧成一股绳,问题貌似就变得简单很多,主要是如何拧成一股绳,从何处开始拧,也就是如何把各个子程序在何处调用才能实现功能,这个问题确实需要大动脑筋才能确保最后的结果和设计要求相符。第一次上机用汇编编写程序,第一次接触用汇编语言程序产生随机数,第一次尝试着编写子程序,也是第一次听说还有bios功能调用。万事开头难,但总要开个头,第一天没着落,就想啊,查资料,通过小组成员讨论后决定各成员分工合作,每人负责一个功能,最后一起合成调试。然后各自就开始努力的工作了,先是根据要求把可能用到的书中的知识复习巩固了一

11、遍,然后对准问题查阅相关资料,遇到相似的问题就借鉴过来,再根据实际问题需要编写自己的程序,就这样一步步按照流程做了下来,途中遇到了诸多问题,但是问题必须解决才能继续往下写,虽然好些天疲于奔命于图书馆、书店,但是有压力就有动力,逐渐的问题变得越来越少。编写程序过程中,开始是一塌糊涂,对一些伪指令和dos功能调用方便掌握不牢固,编写起程序来很不灵活,经过查阅资料和询问同学,在边摸索边实践的过程中,我体会到了编写程序不仅需要广泛深入的知识面,还需要灵活的头脑和严密的逻辑思维,稍有考虑不到的方面,程序就会“没有生成obj文件”。循序渐进的,我终于编写出了我脑子里所想的初步程序,但输入到mf2kp集成开

12、发环境中运行时,一开始的热情瞬间就没了,程序无法编译,不能生成.obj文件,想了许久,明白了一点:编写程序最主要的其实不是在于如何编写而是成百上千次甚至上万次的不断调试。于是,我开始了调试程序这复杂而又极其漫长的过程。最终在小组成员共同的努力下,我们成功了,一股成就感袭上心头,各个都笑了,也松了口气,回头想想,不仅巩固了所学知识,而且锻炼我们理论结合实际的能力和团队合作能力。同时也发现了些许不足,我敢肯定的是这次发现的问题被牢牢记住了,还起了个加深记忆的作用。通过本次课设我发现,定义的变量是可以直接用inc、dec的,即对其内容值加1、减1,但是要注意,虽然变量可以看成符号地址,不过此处只是把

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

14、观,注释尽量详细准确,便于阅读,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的。这些问题是这次课程设计体会比较深刻的几个方面。 总而言之,通过本次比赛评分系统程序的设计,不仅巩固了所学汇编知识,而且在知识的广面和深面上有了相当程度的拓展。几个枯燥的字母被我们这一折腾竟然变得有了活力,使我感觉到汇编强大的魔力,编程就像日常生活一样,是个不断探索和发现的过程,途中必然会遇到困难,前面出现坎儿,是因为对面就是平原,编程序要知道:坚持,就意味着一切。参考文献1沈美明,温冬蝉.ibm-pc汇编语言程序设计(第2版).清华大学出版社,200

15、12沈美明,温冬蝉.ibm-pc汇编语言程序设计例题习题集.清华大学出版社,19913陆忠华.汇编语言程序设计.科学出版社,19934迟成文,王保秀.汇编语言程序设计.中国科学技术大学出版社,19935徐建民.汇编语言程序设计.电子工业出版社.2005年6彭虎,周培玲,傅忠谦.微机原理与接口技术(第2版).电子工业出版社,2008附录code segment assume cs:code,ds:code; ; 功能:显示指定地址(str_addr)的字符串; 入口:; str_addr字符串地址(要求在数据段); 用法: output str_addr; 用法举例:output prompts

16、troutput macro str_addr push ax lea dx,str_addr mov ah,9 int 21h pop ax endm; ; 功能:把ax中的二进制无符号数转换成显式的十进制ascii码,并送显示屏显示; 入口:ax=二进制数 ; 出口:在当前光标位置显示转换后的ascii码数字 dec_ascii proc near mov dh,10 div dh or ax,3030h ;将两位十进制数转换成ascii码 cmp al,30h ja $+4 mov al,20h ;若十位数是0,以空格代替 push ax mov ah,0eh int 10h ;显示十位

17、数 pop ax xchg ah,al mov ah,0eh int 10h ;显示个位数 ret dec_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,ax mov al,20h mov ah,4 ;字符颜色(红色) mov cx,contestants ;参赛

18、选手人数 cldline: push cx mov cx,3 rep stosw add di,154 ;显示缓冲区下一行同列偏移地址 pop cx loop line push cs pop ds ;使数据段与代码段同段 push cs pop es ;使附加段与代码段同段; ; 评委随机打分 cld lea si,buffer ;数据缓冲区地址(选手成绩链表) mov di,si add di,contestants*2 ;选手成绩存放地址 mov cx,contestants ;参赛选手人数 mov dl,11 ;除数grade_0: push cx mov si,di ;选手成绩地址

19、inc si inc si ;下一个链表节点地址 mov ax,contestants+1 sub ax,cx ;选手序号 stosb ;保存选手序号 xor bx,bx ;bh=,最高分初值,bl=最低分初值 xor dh,dh ;选手总分初值 mov cx,commentators ;评委人数grade_1: xor al,al out 43h,al in al,40h xor ah,ah div dl xchg ah,al ;舍弃商数,取余数,作为某评委的打分 stosb ;保存一个评委打分 add dh,al ;累计评委打分 cmp bh,al jae $+4 ;最高分>=此评委

20、打分 mov bh,al ;保存新的最高分 cmp bl,al jbe $+4 ;最低分<=此评委打分 mov bl,al ;保存新的最低分 loop grade_1 mov al,dh sub al,bh ;减去一个最高分 sub al,bl ;减去一个最低分 stosb ;保存最后得分 pop cx loop grade_0; ; 用冒泡排序法对选手最后得分降序排序 lea si,buffer ;选手成绩链表地址 mov cx,contestants ;参赛选手人数 dec cx ;外循环次数sorting: push cx ;入栈保存外循环次数 push si ;入栈保存数组地址c

21、ompare: push si pop di ;当前数组元素地址赋给目的变址寄存器,以备交换之用 lodsw ;将当前数组元素读入累加器 mov bx,ax mov al,bx10 ;将当前最后得分读入累加器al mov bx,si ;相邻的下一个选手信息地址 cmp al,bx10 ;当前选手最后得分与相邻的下一个选手最后得分相比较 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 cx push si mov si,si ;读入链表节点(某选手成绩地址)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论