数字方阵的显示.docx
《数字方阵的显示.docx》由会员分享,可在线阅读,更多相关《数字方阵的显示.docx(19页珍藏版)》请在冰豆网上搜索。
数字方阵的显示
郑州航空工业管理学院
微机原理课程设计
2007级电气工程及其自动化专业0706071班级
题目数字方阵
姓名学号
指导教师职称教授
二О一0年六月十一日
目录
1、概述……………………………………………………………………………3
2、设计任务及要求………………………………………………………………4
2.1、设计任务…………………………………………………………4
2.2、设计要求…………………………………………………………4
3、程序设计基本思想……………………………………………………………4
4、设计方案及程序流程图………………………………………………………5
4.1、主程序流程图……………………………………………………5
4.2、子程序流程图……………………………………………………6
5、程序源代码与运行结果………………………………………………………6
6、调试记录与分析(屏幕截图)………………………………………………13
7、附录:
完整的程序源代码……………………………………………………15
8、参考文献………………………………………………………………………19
9、结语及致谢……………………………………………………………………19
10、本科生课程设计成绩评定表………………………………………………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 4
12 13 14 5
11 16 15 6
10 9 8 7
2.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寄存器,最后通过光标来定行输出的位置。
这种方案难度虽然有所降低,但仍然不太好做。
操作说明:
运行程序后,屏幕上会出现一个提示:
“pleaseinputanumber(3-5)”
当从键盘上输入3-5中的一个数时就会出现其对应的螺旋方阵
4、设计方案及程序流程图
4.1、主程序流程图
开始
段寄存器初始,调用清屏子程序
显示提示语
退出
从键盘输入字符,并判断是否是Q?
Y
N
调用子程序S
Y
判断输入字符是否为3?
并设置为3时输出格式
NN
调用子程序S
Y
判断输入字符是否为4?
并设置为4时输出格式
N
调用子程序S
Y
判断输入字符是否为5?
并设置为5时输出格式
NN
显示关于输入错误的提示语
4.2、子程序S流程图
开始
从主程序得到输出的数据和格式(输出的行数N和列数B)
设置输出数据的首地址指针SI和数据缓冲区首地址DI
将要输出的数据付到数据缓冲区执行SI+1和DI+1
执行列数N-1
N
判断N是否为0
在字符结尾加字符结束符$,
Y
设置输出光标的位置并用9号功能输出,行数加1
N
循环次数-1=0?
Y
5、程序源代码与运行结果
源程序及分析如下:
DDATASEGMENT
BUF1DB'123894765';n=3时输出的数据
BUF2DB'12341213145111615610987';n=4时输出的数据
BUF3DB'12345161718196152425207142322218131211109'
;n=5时输出的数据
DBUFDB14DUP(?
);用于存放每行输出的数据
I1DB0DH,0AH,'THISISAFANGZHENPROGRAMME';提示语
DB0DH,0AH,'INPUTQTOEXIT'
DB0DH,0AH,'PLEASEINPUTANUMBER(3--5):
','$'
I2DB0DH,0AH,'INPUTERROR,PLEASEREINPUT!
','$'
NDB?
;用于控制输出列数(包括空格)
BDB1;用语控制输出地方(即屏幕中的哪一行)
DATAENDS
STACKSEGMENTPARASTACK'STACK';设置堆栈段
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
MAIN:
MOVAX,DATA
MOVDS,AX
CALLCLEAR;调用子程序clear(清屏)
LOP:
MOVB,1;将提示语从第一行输出
LEADX,I1;将I1首地址付给DX
MOVAH,9;调用9号功能,输出DX中的字符串
INT21H
MOVAH,1;调用1号功能,从键盘输入字符
INT21H
CMPAL,'Q';输入字符如果是Q,则退出
JZQUIT
LEASI,BUF1;设置缓冲区指针
MOVN,7;设置每行输出的字符数(包括空格)
MOVCL,3;设置循环次数
CALLCLEAR;清屏
CMPAL,'3';输入的字符如果是3则跳转到S
JZS
LEASI,BUF2
MOVN,10
MOVCL,4
CMPAL,'4';输入的字符如果是4则跳转到S
JZS
LEASI,BUF3
MOVCL,5
MOVN,13
CMPAL,'5';输入的字符如果是5则跳转到S
JZS
MOVAH,2;调用2号功能,设置光标的位置
MOVDH,1
MOVDL,0
INT10H
LEADX,I2;设置提示语字符的首地址指针
MOVAH,9;调用9号功能,将提示语从所设的光标位置输出
INT21H
JMPLOP
S:
MOVBL,N
LEADI,DBUF;设置存放输出数据的缓冲区的地址指针
L:
MOVAL,[SI];以下六句的功能为:
将所要输
MOV[DI],AL;出数据缓冲区数据的前N个字
INCSI;符存到缓冲区DBUF
INCDI
DECBL
JNEL
MOV[DI],BYTEPTR'$';在数据缓冲区DBUF末尾加$
MOVAH,2;调用2号功能设置输出位置MOVDH,B;光标的位置
MOVDL,0
INT10H
LEADX,DBUF;调用9号功能将缓冲区DBUFMOVAH,9;的数据输出
INT21H
INCB
LOOPS
JMPLOP
QUIT:
MOVAH,4CH;退出程序
INT21H
CLEARPROCNEAR;子程序CLEAR的功能为清屏。
PUSHAX;将AX、BX、CX、DX入栈,保存
PUSHBX;里面的数据,
PUSHCX
PUSHDX;
MOVAH,6;调用6号功能,以空格充满屏幕
MOVAL,0;达到清屏
MOVCH,0
MOVCL,0
MOVDH,24
MOVDL,79
MOVBH,7
INT10H
MOVAH,02H
MOVDH,0
MOVDL,0
INT10H
POPDX;将DX、CX、BX、AX出栈
POPCX
POPBX
POPAX
RET
CLEARENDP
CODEENDS
ENDMAIN
运行结果如下:
运行界面
输入字符不是3、4、5时的界面:
输入3时的结果:
输入4时的运行结果:
输入5时的运行结果:
6、调试记录与分析
经过一个学期对汇编语言的学习,对编写基本的汇编语言程序已经基本掌握了,包括用DEBUG进行调试和修改。
这次课程设计中,在对自己编写的这段程序进行调试的时候仍发现了自己在这方面的不足和缺点。
刚开始,将程序输入在编译时就发现了很多语法性错误,比如在堆栈段和数据段的定义上就有一些问题,导致无法进行编译或机器死机。
还有,有时将输入法调错导致编译时报错,等这些简单错误,只要仔细点,应该可以避免。
将这些简单的错误一一改正后重新将程序进行编译连接,然后执行程序,发现只能输出第一行数据,比如输入5时,输出界面为:
这时我首先想到的问题是循环取字符的那段程序出了问题,仔细检查后发现了错误,在循环段后再加了一个循环loops解决了问题。
再次经过调试以后发现又出现了一个问题:
在输入错误字符时界面是正确的,
但输入正确数字(3.4.5)时却出现错误:
经过思考,我认为是由于在一次循环,结束并将字符输出是没有结束符号$,我们仔细讨论后,将这个问题在程序中解决,加入正确代码后,界面出现正确显示。
经过多次调试后程序已可以正确运行,但我注意到在联接结束时会出现警告——nostacksegmemt,发现始终有一个警告,虽然不影响程序的执行,但是我仍然想找出原因。
经过仔细查找资料后,也没有发现有关于这个问题的解答,只是发现书上对于堆栈段后面都加了这样一句话parastack“stack”.我也将它加了进去,然后再编译、连接就没有发现这个问题了,然后查找关于para的问题,发现他是关于设置段的属性的设置
将程序执行以后,每输入一个字符,在显示相应的数据以后,他的下一次显示总在前一次显示的下面,这就导致在你输入很多次字符以后,他的显示已经到界面下面,已无法在界面上正确显示出来。
即在对输出字符的光标控制上需进行调整,我用2号的输出功能将输出的光标始终控制在屏幕的顶端,这样就不会出现由于输入字符过多而无法显示的问题了。
除了这些错误外,还出现了几个错误,但在同学们的帮助下,再加上自己查找了相关的资料后都得到解决。
在这个调试过程中,我掌握了一些调试的方法,例如,当你改变一段代码后,出现了一个问题,或者一个错误,但这些错误并不在你的意料之中,你就得重新审查这段代码,看它除了会得到你想的结果外,还会跟哪些段产生联系。
这些联系也许就是在自己更改代码时没有注意的,这样就可以逐步考察到这段代码给整个程序带来的影响,进而就可以逐步更改自己的程序,并进行优化。
7、附录:
完整的程序源代码
DATASEGMENT
BUF1DB'123894765'
BUF2DB'12341213145111615610987'
BUF3DB'12345161718196152425207142322218131211109'
DBUFDB14DUP(?
)
I1DB0DH,0AH,'THISISAFANGZHENPROGRAMME'
DB0DH,0AH,'INPUTQTOEXIT'
DB0DH,0AH,'PLEASEINPUTANUMBER(3--5):
','$'
I2DB0DH,0AH,'INPUTERROR,PLEASEREINPUT!
','$'
NDB?
BDB1
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
MAIN:
MOVAX,DATA
MOVDS,AX
CALLCLEAR
LOP:
MOVB,1
LEADX,I1
MOVAH,9
INT21H
MOVAH,1
INT21H
CMPAL,'Q'
JZQUIT
LEASI,BUF1
MOVN,7
MOVCL,3
CALLCLEAR
CMPAL,'3'
JZS
LEASI,BUF2
MOVN,10
MOVCL,4
CMPAL,'4'
JZS
LEASI,BUF3
MOVCL,5
MOVN,13
CMPAL,'5'
JZS
MOVAH,2
MOVDH,1
MOVDL,0
INT10H
LEADX,I2
MOVAH,9
INT21H
JMPLOP
S:
MOVBL,N
LEADI,DBUF
L:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
DECBL
JNEL
MOV[DI],BYTEPTR'$'
MOVAH,2
MOVDH,B
MOVDL,0
INT10H
LEADX,DBUF
MOVAH,9
INT21H
INCB
LOOPS
JMPLOP
QUIT:
MOVAH,4CH
INT21H
CLEARPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAH,6
MOVAL,0
MOVCH,0
MOVCL,0
MOVDH,24
MOVDL,79
MOVBH,7
INT10H
MOVAH,02H
MOVDH,0
MOVDL,0
INT10H
POPDX
POPCX
POPBX
POPAX
RET
CLEARENDP
CODEENDS
ENDMAIN
指导教师评语:
课程设计成绩:
指导教师签名:
年月日