微机原理课程设计-数字方阵的显示.doc_第1页
微机原理课程设计-数字方阵的显示.doc_第2页
微机原理课程设计-数字方阵的显示.doc_第3页
微机原理课程设计-数字方阵的显示.doc_第4页
微机原理课程设计-数字方阵的显示.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

郑州航空工业管理学院微机原理课程设计 2007 级 电气工程及其自动化 专业0706071班级题 目 数字方阵 姓 名 学号指导教师 职称 教授 二一0 年 六 月 十一 日目 录1、概 述32、设计任务及要求42.1、设计任务42.2、设计要求43、程序设计基本思想44、设计方案及程序流程图5 4.1、主程序流程图5 4.2、子程序流程图65、程序源代码与运行结果66、调试记录与分析(屏幕截图)137、附录:完整的程序源代码158、参考文献199、结语及致谢1910、本科生课程设计成绩评定表20数字方阵的显示1、概 述 微机原理与接口技术这门课以intel微处理器为背景,围绕“基础”、“主线”和“关键技术”展开。使我们掌握微型计算机的基本概念,介绍cpu、汇编程序设计及32位汇编程序设计简介、存储器、i/o接口;结合微处理器的发展历程,使我们了解微型计算机在不断克服瓶颈效应,提高性能和速度方面,采用的技术和方法,如cache、虚拟存储、超标量流水线,将微型计算机的技术发展作为贯穿教材的主线;将微型计算机的关键技术如存储管理、中断、dma、系统总线、与外设的接口等作为的重点。微型计算机是现代社会不可缺少的智力辅导工具,面向21世纪的学子,只有学好微机原理与接口技术这门课,掌握汇编语言编辑,调试技术及接口芯片的编程与使用,才能为以后应用微机解决工程实践中的各种技术问题(参数测试,数据采集处理,工程控制,生产自动化,设备改造与研制)打下良好基础。而作为自动化专业的学生这门课更是必须掌握的,是我们学习更深层次的专业知识的基础。比如我们以后将要接触很多的单片机,对单片机进行编程,用到的语言就是汇编语言。这次课程设计既是对我们的一次检验,也是我们的一个锻炼机会。我们可以运用自己所学的知识根据自己的想法写出程序,并在计算机上进行调试、修改可以完全按照自己的想法来做任务。2、设计任务及要求2.1、主要任务将n方个(n=3,4,5)个自然数按螺旋纹路填入n*n方阵,要求程序运行时输入参数n,然后输出所需的n阶方阵,如n=4时输出显示:1 2 3 412 13 14 511 16 15 610 9 8 72.2 、要求独立的设计出汇编程序,写出设计基本思想,设计方案及程序流程图,分析过程,调试记录与分析(屏幕截图),程序源代码与运行结果(源代码附详细注释,屏幕截图或打印) 3、程序设计基本思想 我们考虑过用算法直接设计这个程序,就是用算法控制输出数据,只要输入1到9之间任何数就可输出对应的方阵。用循环来控制输出的行和列以及数据,但这样难度很大,我们无法完成这样多次的循环嵌套。最后我们采用了另一种想法。只实现n值为3,4,5各阶方阵运算,将3,4,5各阶方阵的元素,按指定的次序分别存放 到缓冲区buf1,buf2,buf3中,缓冲区dbuf存储从以上各缓冲区中截取的字符串和循环变量n,程序通过dos 终端21h的01号功能调用接收从键盘上输入3,4,5的ascii码,将其转换为十进制数,送给循环变量n来控 制行的循环,同时设置各方阵每行输出的元素个数,送给cx寄存器,最后通过光标来定行输出的位置。 这种方案难度虽然有所降低,但仍然不太好做。操作说明:运行程序后,屏幕上会出现一个提示:“please input a number (3-5)” 当从键盘上输入3-5中的一个数时就会出现其对应的螺旋方阵4、设计方案及程序流程图4.1、主程序流程图开始段寄存器初始,调用清屏子程序显示提示语退出从键盘输入字符,并判断是否是q?y n调用子程序sy判断输入字符是否为3?并设置为3时输出格式nn调用子程序sy判断输入字符是否为4?并设置为4时输出格式n调用子程序sy判断输入字符是否为5?并设置为5时输出格式nn显示关于输入错误的提示语 4.2、子程序s流程图开始从主程序得到输出的数据和格式(输出的行数n和列数b) 设置输出数据的首地址指针si和数据缓冲区首地址di将要输出的数据付到数据缓冲区执行si+1和di+1执行列数n-1n判断n是否为0在字符结尾加字符结束符$,y设置输出光标的位置并用9号功能输出,行数加1n循环次数-1=0?y5、程序源代码与运行结果 源程序及分析如下:ddata segmentbuf1 db 1 2 38 9 47 6 5 ;n=3时输出的数据buf2 db 1 2 3 412 13 14 511 16 15 610 9 8 7;n=4时输出的数据buf3 db 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 ;n=5时输出的数据dbuf db 14 dup(?) ;用于存放每行输出的数据i1 db 0dh,0ah,this is a fangzhen programme ;提示语 db 0dh,0ah,input q to exit db 0dh,0ah,please input a number(3-5):,$i2 db 0dh,0ah,input error,please reinput!,$n db ? ;用于控制输出列数(包括空格)b db 1 ;用语控制输出地方(即屏幕中的哪一行)data endsstack segment para stack stack ;设置堆栈段 db 100 dup(?)stack endscode segment assume ds:data,cs:code,ss:stackmain: mov ax,data mov ds,ax call clear ;调用子程序clear(清屏)lop: mov b,1 ;将提示语从第一行输出 lea dx,i1 ;将i1首地址付给dx mov ah,9 ;调用9号功能,输出dx中的字符串 int 21h mov ah,1 ;调用1号功能,从键盘输入字符 int 21h cmp al,q ;输入字符如果是q,则退出 jz quit lea si,buf1 ;设置缓冲区指针 mov n,7 ;设置每行输出的字符数(包括空格) mov cl,3 ;设置循环次数 call clear ;清屏 cmp al,3 ;输入的字符如果是3则跳转到s jz s lea si,buf2 mov n,10 mov cl,4 cmp al,4 ;输入的字符如果是4则跳转到s jz s lea si,buf3 mov cl,5 mov n,13 cmp al,5 ;输入的字符如果是5则跳转到s jz s mov ah,2 ;调用2号功能,设置光标的位置 mov dh,1 mov dl,0 int 10h lea dx,i2 ;设置提示语字符的首地址指针 mov ah,9 ;调用9号功能,将提示语从所设的光标位置输出 int 21h jmp lops: mov bl,n lea di,dbuf ;设置存放输出数据的缓冲区的地址指针l: mov al,si ;以下六句的功能为:将所要输 mov di,al ;出数据缓冲区数据的前n个字 inc si ;符存到缓冲区dbuf inc di dec bl jne l mov di,byte ptr $ ;在数据缓冲区dbuf末尾加$ mov ah,2 ;调用2号功能设置输出位置 mov dh,b ;光标的位置 mov dl,0 int 10h lea dx,dbuf ;调用9号功能将缓冲区dbuf mov ah,9 ;的数据输出 int 21h inc b loop s jmp lopquit: mov ah,4ch ;退出程序 int 21hclear proc near ;子程序clear的功能为清屏。 push ax ;将ax、bx、cx、dx入栈,保存 push bx ;里面的数据, push cx push dx ; mov ah,6 ;调用6号功能,以空格充满屏幕 mov al,0 ;达到清屏 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h mov ah,02h mov dh,0 mov dl,0 int 10h pop dx ;将dx、cx、bx、ax出栈 pop cx pop bx pop ax retclear endpcode ends end main运行结果如下:运行界面输入字符不是3、4、5时的界面:输入3时的结果:输入4时的运行结果:输入5时的运行结果:6、调试记录与分析经过一个学期对汇编语言的学习,对编写基本的汇编语言程序已经基本掌握了,包括用debug进行调试和修改。这次课程设计中,在对自己编写的这段程序进行调试的时候仍发现了自己在这方面的不足和缺点。刚开始,将程序输入在编译时就发现了很多语法性错误,比如在堆栈段和数据段的定义上就有一些问题,导致无法进行编译或机器死机。还有,有时将输入法调错导致编译时报错,等这些简单错误,只要仔细点,应该可以避免。将这些简单的错误一一改正后重新将程序进行编译连接,然后执行程序 ,发现只能输出第一行数据,比如输入5时,输出界面为:这时我首先想到的问题是循环取字符的那段程序出了问题,仔细检查后发现了错误,在循环段后再加了一个循环loop s解决了问题。 再次经过调试以后发现又出现了一个问题:在输入错误字符时界面是正确的,但输入正确数字(3.4.5)时却出现错误:经过思考,我认为是由于在一次循环,结束并将字符输出是没有结束符号$,我们仔细讨论后,将这个问题在程序中解决,加入正确代码后,界面出现正确显示。经过多次调试后程序已可以正确运行,但我注意到在联接结束时会出现警告no stack segmemt,发现始终有一个警告,虽然不影响程序的执行,但是我仍然想找出原因。经过仔细查找资料后,也没有发现有关于这个问题的解答,只是发现书上对于堆栈段后面都加了这样一句话para stack “stack”.我也将它加了进去,然后再编译、连接就没有发现这个问题了,然后查找关于para的问题,发现他是关于设置段的属性的设置将程序执行以后,每输入一个字符,在显示相应的数据以后,他的下一次显示总在前一次显示的下面,这就导致在你输入很多次字符以后,他的显示已经到界面下面,已无法在界面上正确显示出来。即在对输出字符的光标控制上需进行调整,我用2号的输出功能将输出的光标始终控制在屏幕的顶端,这样就不会出现由于输入字符过多而无法显示的问题了。 除了这些错误外,还出现了几个错误,但在同学们的帮助下,再加上自己查找了相关的资料后都得到解决。在这个调试过程中,我掌握了一些调试的方法,例如,当你改变一段代码后,出现了一个问题,或者一个错误,但这些错误并不在你的意料之中,你就得重新审查这段代码,看它除了会得到你想的结果外,还会跟哪些段产生联系。这些联系也许就是在自己更改代码时没有注意的,这样就可以逐步考察到这段代码给整个程序带来的影响,进而就可以逐步更改自己的程序,并进行优化。7、附录:完整的程序源代码data segmentbuf1 db 1 2 38 9 47 6 5buf2 db 1 2 3 412 13 14 511 16 15 610 9 8 7buf3 db 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9dbuf db 14 dup(?)i1 db 0dh,0ah,this is a fangzhen programme db 0dh,0ah,input q to exit db 0dh,0ah,please input a number(3-5):,$i2 db 0dh,0ah,input error,please reinput!,$n db ?b db 1data endsstack segment para stack stack db 100 dup(?)stack endscode segment assume ds:data,cs:code,ss:stackmain: mov ax,data mov ds,ax call clearlop: mov b,1 lea dx,i1 mov ah,9 int 21h mov ah,1 int 21h cmp al,q jz quit lea si,buf1 mov n,7 mov cl,3 call clear cmp al,3 jz s lea si,buf2 mov n,10 mov cl,4 cmp al,4 jz s lea si,buf3 mov cl,5 mov n,13 cmp al,5 jz s mov ah,2 mov dh,1 mov dl,0 int 10h lea dx,i2 mov ah,9 int 21h jmp lops: mov bl,n lea di,dbufl: mov al,si mov di,al inc si inc di dec bl jne l mov di,byte ptr $ mov ah,2 mov dh,b mov dl,0 int 10h lea dx,dbuf mov ah,9 int 21h i

温馨提示

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

最新文档

评论

0/150

提交评论