微机原理课程设计-吃豆子程序.docx_第1页
微机原理课程设计-吃豆子程序.docx_第2页
微机原理课程设计-吃豆子程序.docx_第3页
微机原理课程设计-吃豆子程序.docx_第4页
微机原理课程设计-吃豆子程序.docx_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

学 号: 课 程 设 计题 目吃豆子程序学 院 专 业 班 级 姓 名 指导教师 2012年01月12日课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 题 目: 吃豆子程序 初始条件: 在屏幕上显示多行“豆子”(用“.”表示),“豆子”随机分布,用一个“嘴巴”(用字符“c”表示)吃“豆子”,程序运行时,单击上下左右键,“嘴巴”开始逐个“吃豆子”,一直到“豆子”被吃完停止或者单击p键暂停;按q键退出程序。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 设计任务及要求分析(2) 方案比较及认证说明(3) 系统原理阐述(4) 硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明(5) 软件设计课题需要说明:软件思想,流程图,源程序及程序注释(6) 调试记录及结果分析(7) 总结(8) 参考资料(9) 附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图时间安排:1月4日1月5日:收集资料,方案选择1月6日1月8日:整体流程,程序细节1月9日1月12日:调试程序,报告撰写1月12:交设计报告,程序演示,答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目 录摘要1abstract11 绪论12 设计内容及分析22.1设计内容22.2功能实现分析23 方案论证33.1方案比较33.2主要程序调用命令及格式43.2.1 int 21h中断43.2.2 int 10h中断53.2.3 int 16h中断64 单元程序设计74.1主程序74.2界面显示程序84.3延时子程序84.4暂停子程序104.5方向子程序115 程序编写与调试分析135.1源程序135.2程序的调试问题205.3运行结果及分析206 小结22参考文献23附录24武汉理工大学微机原理与接口技术课程设计说明书摘要本微机课程设计一种简便的编写“吃豆子”汇编程序。在屏幕上显示多行“豆子”(用“.”表示),“豆子”随机分布,用一个“嘴巴”(用字符“c”表示)吃“豆子”,程序运行时,单击上下左右键,“嘴巴”开始逐个“吃豆子”,一直到“豆子”被吃完停止或者单击p键暂停;按q键退出程序。通过设计该课程设计熟练掌握流程图的绘制,熟悉汇编语言特别是相关中断的调用以及掌握调试程序等相关知识。其中源程序主要分为主程序、延时子程序、暂停子程序、方向键子程序等主要部分。 关键字:吃豆子 汇编 方向 abstractthis computer course design an easy to write eat beans assembler. in the screen more lines beans (with . said), beans random distribution, with a mouth (with character c said) to eat beans , and the program is running, click the up and down or so key, mouth start eat beans one, has been to the beans was finished eating the stop or click p bond suspended; according to q key quit. through the design of the course design master chart the draw, familiar with assembly language especially relevant interrupted the call and master of debugging and related knowledge. the main points of the source program mainly procedures, delay subroutines, suspend the procedure, the direction key procedure and other major parts.keywords:bean-eating assembly direction 1武汉理工大学微机原理与接口技术课程设计说明书1 绪论 本微机原理课程设计主要是使我们增进对汇编语言的认识,加强用汇编语言编程的能力。 使我们掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等。使学生了解和掌握汇编程序设计过程、方法及实现,同时能够更好的加强对微机原理课程的进一步的学习与巩固。 本课程设计书说明书主要分析了用汇编语言编写“吃豆子”程序的过程,其中题目要求在屏幕用“.”表示豆子,“c”表示嘴巴,然后通过相关控制键嘴巴吃豆子,并且可以随时退出程序。要实现该功能需要实现在界面上显示相关的信息(可以调用dos中断)、对键盘信息的采集(可以调用bios中断)、并且实现相关的控制(如退出程序、暂停等)。 汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如masm,tasm等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。 2 设计内容及分析2.1设计内容课程设计的题目是吃豆子程序,通过分析要实现的功能又如下几点: 1. 在屏幕上显示多行“豆子”(用“.”表示),“豆子”随机分布;2. 用一个“嘴巴”(用字符“c”表示)吃“豆子”;3. 程序运行时,单击上下左右键,“嘴巴”开始“吃豆子”;4. 一直到“豆子”被吃完停止或者单击p键暂停;5. 按q键退出程序。2.2功能实现分析功能一:显示豆子在程序数据段定义一段再调用dos中断显示豆子;功能二:显示嘴吃豆子在光标所在位置显示c嘴,在将dl(dh)加一(减一),再将光标位置显示成空格,表示成豆子被“吃”了;功能三:单击方向键开始吃豆子取光标键的扫描码,判断输入方向然后分别向不同方向吃豆子,即调用功能二;功能四:单击p暂停读取键盘的是否有p输入,有则然后执行暂停子程序;功能五:单击q退出程序读取键盘的是否有q输入,有则退出程序;3 方案论证3.1方案比较经过相关资料的查阅与网上资料的收集初步整理得到了如下的两种方案;方案1:具体流程图如下图3-1所示 图3-1 方案1的流程图方案1说明:主要运用dos调用及bios调用得到相关的程序得到的,在程序数据段定义一段再调用dos中断显示豆子;在光标所在位置显示c嘴,在将dl(dh)加一(减一),再将光标位置显示成空格,表示成豆子被“吃”了;单击方向键开始吃豆子取光标键的扫描码,判断输入方向然后分别向不同方向吃豆子;读取键盘的是否有p输入,有则然后执行暂停程序;读取键盘的是否有q输入,有则退出程序。方案2:具体流程图如下图3-2所示图3-2 方案2流程图方案2说明首先定义一个字符串,内容为字符“c”的asc值还有其他的一些相关信息,然后把屏幕设置多行豆子,或者布满豆子,把“c”每往前走一格就把该位子上的豆子变为空格键,即“c”遇到非空格就跳转到下一步;这样一颗豆子就吃掉了,只要依次循环下去,就可以把豆子全部吃掉,或者中间按空格,暂停游戏。两种方案比较:方案1编写程序时可以调用相对简单的命令,循环结构不是很复杂,子程序的调用,实现起来相对比较简单直观;而方案2编写的程序功能不全吧,不能很好的实现题目要求功能,所以可以采用方案13.2主要程序调用命令及格式3.2.1 int 21h中断1. 9号功能调用(字符串输出)9号功能调用是将缓冲区中的一组以“”结束的字符串送标准输出设备输出(显示器或打印机)。调用前必须将输出缓冲区的首地址送ds:dx。格式如下:lea dx,buf;取字符串的首地址mov ah, 9;调用功能号为9号int 21h2. 2号功能调用(字符输出显示)2号功能是将一个字符(一个ascii码值)输出到标准输出设备(即显示器或打印机)。入口参数为dl寄存器,寄存器dl中存放待输出的字符。格式如下:mov dl,10;送入ascii码 mov ah,2;调用功能号为9号 int 21h3.2.2 int 10h中断1. 0号功能调用0号功能是用来设置界面显示方式,在本程序中选用8025黑白文本显示方式(2号显示方式),即在al中送入2。格式如下:mov ah,0;调用功能号为0号mov al,2;选择2号显示方式int 10h;2. 2号功能程序2号用来号功能是设置光标位置(2号功能),其中入口参数表示为ah=2(功能号),bh=页号,dh=行号,dl=列号。出口参数:无。根据dx确定了光标位置。(在调用该功能号时,之前dh、dl已经给定)格式如下:mov ah,2;调用功能号为2号int 10h3. 10号功能程序10号功能是实现在当前光标位置写字符,其中入口参数:ah=0ah,bh=页号,al=字符的ascii码,cx=写入字符数。出口参数:无。格式如下:mov ah,10;调用功能号为10号int 10h4. 15号功能程序15号功能是实现读当前显示状态,其中入口参数:ah=0fh,出口参数:al=当前显示方式,bh=页号,al=屏幕上字符列数。格式如下:mov ah,15 ;调用功能号为10号 int 10h 3.2.3 int 16h中断1. 0号功能调用0号功能是用来检查键盘缓冲区是否有一个字符。如果有,通过ah返回字符的扫描码,通过al返回字符的ascii码。若没有,等待按键出现并返回它。其中对于方向键的这样没有ascii码的字符,只通过ah返回扫描码,al=0。在本程序中运用的上下左右键对应的扫描码分别是4bh,4dh,50h,48h。格式如下:mov ah, 0int 16h2. 1号功能调用1号功能调用的功能是用来查询键盘缓冲区,对键盘扫描但不等待,并设置zf标志。若有按键操作(即键盘缓冲区不空),则zf0,al中存放的是输入的ascii码,ah中存放输入字符的扩展码。若无键按下,则标志位zf1格式如下:mov ah, 01hint 16h4 单元程序设计 经过方案比较后选择方案一,具体的编写流程图及单元程序部分得到各部分的程序,本课设完整的程序主要包含五个单元:主程序、界面显示程序、延时程序、延时子程序、方向子程序。首先是在界面显示提示信息及相关的豆子,然后是程序的主程序,再在主程序中调用相应的子程序。4.1主程序 主程序是该程序的主要部分,其中包括主要调用相应的子程序,流程图如下图4-1所示。图4-1 主程序流程图 在主程序中首先显示豆子,然后判断输入s时可以得到,程序开始运行,按下方向键可以调用相应的方向子程序来各个方向来吃豆子,按下p程序暂停并且显示p显示暂停状态;按下q则表示退出程序。4.2界面显示程序由于在程序中显示“豆子”,可以首先在程序的数据段中定义带有“豆子”的字符,然后调用dos显示功能调用,另外在输入多行字符时需要回车与换行的调用。其中界面显示部分流程图如下图4-2所示。另外相应的界面提示语的显示与豆子的显示一样,再者在显示时需要回车与换行。图4-2 界面显示流程图具体程序编写(第一行豆子输入,其他行一样):data segmentbuf1 db . . . . .$ ;数据段定义豆子字符data endslea dx,buf1 ;取buf1的首地址mov ah,9int 21h;显示字符串mov dl,10mov ah,2int 21h;回车命令mov dl,13mov ah,2int 21h;换行命令4.3延时子程序在屏幕上显示字符与字符之间显示时需要延时,所以需要编写延时程序,可以采用寄存器先赋值后再自减1来实现延时程序,具体流程图如下图4-3所示。图4-3 延时程序流程图具体程序如下:delay proc ;延时子程序 push cx ;保护寄存器cx,dx push dx mov dx,9999 ;设置延时时间10msdl500: mov cx,19999dl10ms: loop dl10ms dec dx jnz dl500 pop dx ;恢复寄存器cx,dx pop cx ret ;返回delay endp4.4暂停子程序当键盘输入p(大写)时,程序进入暂停子程序,在暂停子程序中键盘输入为方向键(上下左右)或者键s时返回主程序;当输入q键时结束程序;没有输入或者其他输入继续保持暂停状态。其中暂停程序如下图4-3。图4-4 暂停程序流程图具体程序及注释如下pauses proc ;暂停子程序 mov ah,2 int 10h;设置光标位置,dh为行号,dl为列号 mov al,50h;c的ascii码为63h mov ah,10 int 10hp: mov ah,0;检查是否有输入, int 16h; ah返回扫描码,al返回ascii码cmp ah,4bh ;判断方向键左键 jz p1 cmp ah,4dh;判断方向键右键 jz p1 cmp ah,50h;判断方向键下键 jz p1 cmp ah,48h;判断方向键上键 jz p1 cmp al,s;判断方向键s键 jz p1cmp al,q;判断方向键q键 jz ajmp pp1: call continue ;调用continue子程序 retpauses endp4.5方向子程序 当输入为方向键时则开始进入相应的方向子程序,其中在子程序中为右,dl自加1;为左,dl自减1;为上,dh自减1;为下,dh自加1,具体流程图如下图4-5所示。图4-5 方向子程序具体程序如下:dirl proc ;向左子程序 mov ah,10 mov al,c int 10h dec dl mov ah,10 mov al,0 int 10hretdirl endp5 程序编写与调试分析将上述单元流程图转换成具体的程序,再将各单元程序组成总的程序,在经过调试后得到相应的源程序。5.1源程序通过将几个单元电路的程序组合起来,在通过程序的调试得到了总的源程序具体程序如下所示:stack segment stack db 200 dup(0)stack endsdata segmentstr_1 db press direction key the mouth can eat beans $str_2 db press direction key to control direction$str_3 db press q to quit or p to pause$buf1 db . . . . .$ ;设置为5行*40列buf2 db . . . .$buf3 db . . .$buf4 db . .$buf5 db . . . . .$data ends code segment assume cs:code,ss:stack,ds:datastart: mov ax,data mov ds,ax mov ah,0 mov al,2 int 10h ;设置显示方式 lea dx,str_1 ;定义输出提示语 mov ah,9 int 21h ;显示提示语 mov dl,10 mov ah,2 int 21h;回车 mov dl,13 mov ah,2 int 21h;换行 lea dx,str_2 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h lea dx,str_3 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h lea dx,buf1 ;输出豆子和嘴共有5行 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h lea dx,buf2 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h lea dx,buf3 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h lea dx,buf4 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h lea dx,buf5 mov ah,9 int 21h mov dl,10 mov ah,2 int 21h mov dl,13 mov ah,2 int 21h mov ah,15 int 10h ;读当前显示状态 mov cx,1 mov dx,050fh;设定光标在5行15列 a11: mov ah,0 ;判断开始 int 16h cmp al,53h ;判断s je lo jne a11;判断等待lo: call continue ;调用continue子程序continue proc ;吃豆子子程序next: mov ah,2 int 10h;设置光标位置,上面设置的 mov al,63h;63h为c的ascii码 mov ah,10 int 10h;显示c call delay ;调用延时 m: mov ah,0 int 16h cmp ah,4bh je m1 cmp ah,4dh je m2 cmp ah,48h je m3 cmp ah,50h je m4 cmp al,51h je a cmp al,50h je a1 jmp a12 m1: call dirl ;调用dirl子程序 jmp a12m2: call dirr ;调用dirr子程序 jmp a12m3: call diru ;调用diru子程序 jmp a12m4: call dird ;调用dird子程序 jmp a12a12: mov ah,10 mov al,0 int 10h ;在当前位置输入空格 cmp dl,40;列数为40 ja lr cmp dl,1 jb ll cmp dh,3 jb lu cmp dh,7 ja ld jmp nextlr: inc dh mov dl,0 jmp nextll: inc dhmov dl,39 jmp nextlu: inc dl mov dh,7 jmp nextld: inc dlmov dh,3jmp nextretcontinue endp a1: call pauses ;调用pauses子程序a2: mov ah,0 int 16h cmp al,51h ;判断是否为q,退出 jne a2 a: mov ah,4ch int 21hdelay proc ;延时子程序 push cx ;保护寄存器cx,dx push dx mov dx,9999 ;设置延时时间10msdl500: mov cx,9999dl10ms: loop dl10ms dec dx jnz dl500 pop dx ;恢复寄存器cx,dx pop cx retdelay endppauses proc ;暂停子程序 mov ah,2 int 10h;设置光标位置,dh为行号,dl为列号 mov al,50h;c的ascii码为63h mov ah,10 int 10hp: mov ah,0 int 16h ;检查是否有输入,并通过ah返回扫描 ;码,al返回ascii码 cmp ah,4bh jz p1 cmp ah,4dh jz p1 cmp ah,50h jz p1 cmp ah,48h jz p1 cmp al,s jz p1 cmp al,q jz a jmp pp1: call continue ;调用continue子程序 retpauses endp dirl proc ;向左子程序 mov ah,10 mov al,c int 10h dec dl mov ah,10 mov al,0 int 10h retdirl endpdirr proc ;向右子程序 mov ah,10 mov al,c;输入字符的ascii码 int 10h;在当前位置写字符 inc dl mov ah,10 mov al,0;输入字符的ascii码,0表示空格 int 10h;在当前位置写字符 retdirr endp diru proc ;向上子程序 mov ah,10 mov al,c int 10h dec dh mov ah,10 mov al,0 int 10h retdiru endp dird proc ;向下子程序 mov ah,10 mov al,c int 10h inc dh mov ah,10 mov al,0 int 10h retdird endpcode ends end start5.2程序的调试问题在程序编写完成后没有直接实现功能,刚开始练编译文件都生成不了,错误比较多,后来有些功能不能实现,经过修改相应的参数实现,在调试程序过程中出现的问题主要有下面两个:1. 出现了按下方向后,在按下方向时不能开始转向开始转向通过单步运行程序发现需要将程序将dos调用的地方,需要将16h的1号改为0号,才能实现得到相应的结果。2. 在运行时遇到了不能通过上下左右键来控制得到相应的结果通过单步运行程序发现需要将键盘改为键盘扫描码,上下左右键没有对应的ascii码与之对应,需要用扫描码。5.3运行结果及分析在调试完全后程序得到了相应的结果,主要能实现的功能有如下几点(具体显示屏幕截图见附录):1. 编译程序后得到了出现了提示界面显示press direction key the mouth can eat beans的提示与随机显示分布的豆子;2. 按下s键开始表示开始吃豆子可以吃豆子,在设定的光标位置显示嘴巴c,“等待”吃豆子的方向键键入;3. 按下方向键可以显示向各个方向吃豆子;4. 按下q键后程序退出程序;5. 按下p键后界面显示p表示暂停。6 小结为期一个多星期课程设计对自己来说,真可谓受益匪浅,体会颇深。从最开始查找资料,到设计思路的比较,流程图的绘制,编写相关的程序,运行、调试

温馨提示

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

评论

0/150

提交评论