数字统计程序设计微机原理课设Word文件下载.docx
《数字统计程序设计微机原理课设Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字统计程序设计微机原理课设Word文件下载.docx(20页珍藏版)》请在冰点文库上搜索。
BUFFDB1,9,0,-3,-5,3,7,0
DATAENDS
方式二:
现在数据段定义一段空的数据空间,然后调用中断的方式从键盘输入随意的数据,然后再调用中断的方式将键盘输入的数据存入预先定义好的数据段中。
这种方式可以随意输入数据的数值和数据的个数(在要求的范围内)。
模块程序:
BUFFDB100DUP(?
);
定义一个数组
POSIDB?
;
正数个数
NEGTDB?
负数个数
ZERODB?
零个数
ERROR_MESSDB'
Inputerror,pleaseinputagain!
Becareful!
'
0AH,0DH,'
$'
错误提示
POSICHARDB'
Positive:
$'
NEGTCHARDB'
Negtive:
ZEROCHARDB'
Zero:
CRDB0DH,0AH,'
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBP,0
MOVCL,0
MOVSI,OFFSETBUFF;
将SI指向BUFF
----------------------开始输入数据
INPUT:
MOVAH,01H;
1号中断调用,单个字符输入并显示
INT21H
CMPAL,0DH;
数组是否结束
JELOP
CMPAL,'
'
数据与数据用空格分隔
JEINPUT
-'
是否为负数
JEFU
CMPAL,30H;
输入是否为阿拉伯数字
JLERROR;
输出错误提示
CMPAL,39H
JGERROR
ZHISHU:
给数组置数
MOVBUFF[BP],AL;
基址寻址
INCBP;
基址加一
INCCL;
统计数组中数据个数
JMPINPUT
FU:
是负数
CMPAL,30H
提示错误输入
NEGAL;
对负数取补
JMPZHISHU
经过分析,方案一实现起来简单,程序简短,但是其数据的数值和个数都是固定的,不能随意地更换,体现不出程序对要求,可能程序有偶然性,方式二的灵活性好,弥补了方式一的局限性,很好的体现了程序的要求的满足。
虽然源程序更多,但是对于现在PC机的配置而言,我们学生写的程序及时加大一百倍也对CPU的影响不大,因为现在那些大型的软件,游戏等程序都是巨大的,所以我们编程时其实不用考虑会不会很大占用CPU资源的。
再加上考虑到课设时间比较充裕,适当的增加一些难度也是对自己的一种考验。
所以选择了方式二来实现。
2.2.2模块二:
统计正数、负数和零的个数
这个模块式该程序的重要功能,整个程序就是为了实现该功能而设置,但是就其复杂程度而言,该功能实现起来并没有比前面一个模块更难。
总体思路是:
将内存中的数据一个一个地取出来,然后再和0作比较(这里需要注意的是由于从键盘上输入的数字在计算机内是以其对应的ASCLL码的形式存在的,所以和0比较是也需要和0对应的ASC11码30H比较),大于的是正数,等于是零,小于的是负数,然后再将各自计算值赋值到对应的变量中。
实现该功能有两种比较常用的方式。
方式一:
用顺序结构来实现,这个方式就是来实现统计个数,这种方式的优点就是明了易懂,但是当数组内容很多时候,用该种方法就是不太方便,甚至是及其麻烦,还有就是当数组的内容不确定的时候,用这种方法也是不行的。
所以放弃这种方式。
(这里就不把程序罗列出来了)
用循环的结构来实现。
通过控制循环条件,来逐一的对数组数据的判断。
这种方式实现起来方便,简单,而且不管数据时很多还是不确定个数,都可以通过控制相应的控制循环条件来实现。
所以就采用了此种方法。
--------------------统计数组中数据
LOP:
CMPCL,0H;
判断循环条件
JESHOW
MOVBL,[SI]
INCSI
DECCL
CMPBL,30H;
和零的Ascll比较
JGISPOSI;
是正数跳转
JEISZERO;
是零跳转
JLISNEGT;
是负数跳转.
统计正数、负数、零个数
ISPOSI:
INCPOSI
JMPLOP
ISZERO:
INCZERO
JMPLOP
ISNEGT:
INCNEGT
JMPLOP
2.2.3模块三:
调用DOS界面显示信息
这个模块要实现的功能就是调用各种中断来在DOS界面显示相关的信息。
所以要掌握各种中断的调用。
对于之前没有接触过汇编语言的我来说,只是学习了一个学期的微机原理课本内容,要熟练的掌握并能想出几种不同的方式来时实现这个模块的内容,我确实承认我不行。
所以我只能到图书馆借书,上网查阅资料来编写这个模块,所以这个模块没有想出多余的方法,仅有的一种方式也是刚刚看书写的。
--------------------错误信息提示
ERROR:
MOVAH,2H;
设置光标位置
MOVBH,0H;
页号为0
MOVDX,0200H;
行号为02,列号为00
INT10H
MOVAH,09H;
在指定光标位置显示错误提示
MOVDX,OFFSETERROR_MESS
JMPSTART;
重新输入
----------------显示正数,负数,零个数
SHOW:
MOVBH,0H
MOVDX,0600H
显示统计结果
;
正数显示
调用9号中断,输出字符串
MOVDX,OFFSETPOSICHAR
INT21H
MOVAH,02H;
调用2号中断,输出单个字符
MOVDL,POSI
ADDDL,30H
MOVDX,OFFSETCR
MOVAH,09H
负数显示
MOVAH,09H
MOVDX,OFFSETNEGTCHAR
MOVAH,02H
MOVDL,NEGT
;
零显示
MOVDX,OFFSETZEROCHAR
MOVDL,ZERO
------------------退出
STOP:
MOVAH,08H;
调用8号中断,输入单个字符单不显示
Q'
是Q或者q则退出DOS界面
JEEXIT
q'
JMPSTOP
3系统原理
3.1整体原理
系统的原理其实不是很难,因为整个程序实现的功能不是很难。
大致原理:
先调用中断,从键盘输入一个数,进行第一轮循环,判断是否为回车(回车为数组输入结果标志),接着判断是否为空格(空格是一个数据输入完的标志),在判断是否为“-”,是负就再输入负数符号后面的数字,不是负号就将该值赋值为定义的数组第一个位置,然后进行第二轮的判断……一直持续到从键盘输入回车,然后输入结束,跳转到数据统计的模块中。
进入另外一个循环程序,每次取数组中一个数据,然后和0的ASC11码做比较,大于则是正数,等于则是零,小于则是零,再将各自个数统计变量加一,然后进行下一轮循环……直到判断CL为0,即数组所以输入数据判断完则跳转到显示信息模块。
这个模块也是调用各种中断,再DOS界面显示提示语及变量的只。
最后按键盘的Q或者q退出程序。
整个程序就执行完了。
3.2模块原理
模块一:
给内存数据区输入数据
该模块式是给数据区里输入随机的若干数据,通过调用中断来从键盘输入数据,然后判断是否是按照常规的数字输入,(将输入的字符的ASC11码和一些特定的ASC11码来比较,如和回车、空格,“-”等比较,在和数字对应的ASC11码范围比较,即判断是否在30H—39H,)如果是的,就将该值付给定义的数据段,正数和零就直接赋值,如果是负数,就先用取补指令NEG来取补后赋值;
如果不是就按照跳转跳到相应的地方继续执行。
直到调试者输入完成为止。
模块二:
统计正数、负数和零个数
该模块要实现的功能就是将模块一输入的数组内容拿出来处理,统计出正数、负数和零个数,然后将统计的结果放在定义好的对应变量中。
因为该数据的内容在编写程序的时候不知道调试者输入的个数,所以选用循环结构来。
就是每次将内存中的数据取出来放在寄存器中,然后利用指令CMP来和零对应的ASC11码30H做比较,大于则跳转到正数变量加一的程序段,等于就跳转到零变量加一的程序段,小于则跳转到负数加一的程序段。
模块三:
调用系统功能在DOS界面显示信息
调用系统功能其实比较简单,只要掌握了相应的规则就好了。
根据要求,需要用到的功能号有01号、02号、08号、09号等。
调用格式参照附录二,来编写程序。
首先在输入数据的时候调用01号输入单个自费并在屏幕显示出来,如果输入有错误信息需要显示错误提示的话,就需要调用09号功能调用,在屏幕上输出字符串。
后来显示结果的时候就是调用09号,先显示提示字符串,然后再调用02号,将一个字符输出到屏幕。
程序最后就是按Q或者q退出,这里用了08号功能调用,即输入一个字符但是不显示。
大致显示就是用这些和中断21H来实现。
对于设置光标位置,就用02号功能调用,在结合10H中断就可以设置光标位置。
4.软件设计
系统流程图:
图4-1系统流程图
编写程序:
根据系统的流程图,然后一步一步的实现每个流程图的功能,然后拼接起来,就可以实现整个程序。
5调试记录及结果分析
5.1调试步骤
1)运行MF2KP汇编软件,在里面编辑源程序,编辑完成之后,生成.asm文件,保存该该文件。
2)接着仍用上面的软件进行汇汇编,连接,运行生成.EXE文件;
3)下次运行所生成的.exe文件即可产生所需要的结果。
5.2运行结果
从键盘输入数据:
图5-1 数据输入
图5-2 数据输入
结果运行结果显示:
图5-3 运行结果
当第一次输入错误后,显示提示信息,然后重新输入,运行:
图5-4 错误输入后重新输入、运行
5.3结果分析
图5-1和图5-2显示的输入数据是按照规定的输入,就是每输入完一个一位的阿拉伯数字(从-9到9),然后按空格和下一位数分开,输入完毕后以回车键结果,则运行后按照程序输出结果,如图5-3示。
图5-4显示的是没有按照程序规定的输入方式,比较输入的不是阿拉伯数字,是字母或者其他的键,则显示错误输入提示,并等待重新输入,直到正确输入后就显示运行结果。
心得体会
这次课程设计从开始无从下手,到最后课设报告打印完,前前后后遇到了很多的大大小小挫折,有无从下手时的受挫心里,也有调试成功后的激动和喜悦,百感交集,只能说喜忧参半,收获良多。
开始拿到题目,初略一看,这个题目并不难,学完了《微机原理与接口技术》,如果在考场上编写一个这个程序,不需要调试,并不是很困难的事情。
当时心里觉得还是挺轻松的。
后来开始自己编写程序了,问题也不断的冒出来,各种问题像雨后春笋一样的破图而出。
开始的时候,编写了一个简单一些的程序,就是将数据直接在数据段定义,(就是我前面说的方式一),统计的还好,到了要调用中断在DOS界面显示的时候,我就碰到钉子了,没有像我想象中一样的简单,可以直接查阅资料就写出来,由于教材上对中断这一块在第九章介绍详细了,至于如何运用中断在第四章内容就没有那么详细了(尤其一些中断没有介绍),所以只要到图书馆去借了几本书回来。
经过一段时间的充电,总算把中断调用的搞定了,当时心里还是有那么一点点高兴。
后来兴趣来了,觉得应该像高级语言比如C语言一样,从键盘上输入来定义数组才有一点意思。
于是决定采用我前面介绍的方式二的方法来实现。
当时以为汇编语言也是像高级语言语言一样,简单的用循环和一些语句就可以实现从键盘输入数据。
但是往往考虑事情总比实际的要美好。
如何输入负数这个问题上我就碰到一个大钉子了,因为一起拿碰到的例子大部分都是从键盘上输入一个字符,但是字符是以其对应的ASC11码来表示的,如果输入一个符号再加一个字符,也是对应的ASC11码为正值。
像我这样接触汇编语言不久,没有什么经验的菜鸟来说,当时真是一点思路也没有,后来就上网查,看看能不能碰到哪位高手帮忙。
但是查了挺久的,没有发现有什么突破的,最后在一个论坛里看到一句算是“指点迷津”的提示话语吧。
原话大概是“从键盘上输入的字符都是正数,负数只是一个符号而已,”后来想了也不知道多久,才有那么一点明白,要输入一个负数,可以通过判断输入的是否有“-”这个字符,如果有的话,那接下里的字符就是负数的绝对值,只要将其取补,就算是一个负数了。
有了这个思路后,开始慢慢的琢磨,一边写程序,一边调试,调试过程总是各种不尽如人意,各种意想不到的结果出现,只能一点点的改进。
整整熬夜了一个晚上的时间才总算书调试出比较满意的结果。
那个早上,算是最有成就感的时候吧,带着一身的疲惫和小小的成就感上床睡觉去了
中午醒来以后,开机准备继续完善自己的任务,结果一不小心把昨天的成果全部误删了,当时有点傻了,严重受挫心里算是出现在那个时候吧。
后来想用软件来恢复删除的内容,但是安装了又要买,破解的也不行,哎,当时只有自认倒霉了。
不过不幸中的万幸,这个程序不是很长(相对于一些同学的程序来说,虽然我知道他们的那么长的程序是怎么来的),对于自己的写的程序,重新写一遍也不是很难,后来花了一段时间总算是把程序搞定了,还在昨天晚上版本的基础上完善了一些细节。
心里又了来劲了,哈哈……
关于写程序的那一块经过大概是这样的吧,但是我总是觉得现在程序输入还不是很完善,但是又苦于自己那么菜,哎……懂了那句“书到用时方恨少”了
后来的就是写报告了,这个也是一个很大的任务,整整敲了一天键盘,才搞出一个比较满意的报告来,哎,不说了。
这次总结写的有些罗嗦了,其实我也不想,只是这个过程却是让自己体会了很多,也学会了很多。
以后会更加努力的学习知识的,不管是哪方面的知识。
编程这类很实用的技能要好好掌握,其他方面的知识也是和重要的。
这些大概就是我这次做微机原理课设的心得体会吧。
写的挺啰嗦的,辛苦老师看这些了。
参考文献
[1]朱定华著.微机原理、汇编与接口技术[M].北京:
清华大学出版社.2007年
[2]马春燕.微机原理接口技术实验与学习辅导[M].北京:
电子工业出版社.2007年
[3]周佩玲、彭虎、傅忠谦编著.微机原理与接口技术[M].北京:
[4]沈美明、温冬婵著.IBM-PC汇编语言程序设计[M].北京:
电子科技大学出版社.2006年
[5]张雪兰、谭毓安、李元章著.汇编语言程序设计——从DOS到WINDOWS[M].北京:
清华大学出版社.2006年
[6]余朝琨著.IBM-PC机汇编语言程序设计[M].厦门:
厦门大学出版社.2001年
附录一
程序源代码及注释
BUFFDB100DUP(?
POSIDB?
NEGTDB?
ZERODB?
ERROR_MESSDB'
POSICHARDB'
正数提示
NEGTCHARDB'
负数提示
ZEROCHARDB'
零提示
CRDB0DH,0AH,'
MOVDX,OFFS