微机原理课程设计报告字符串分类统计.docx
- 文档编号:6796810
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:14
- 大小:80.32KB
微机原理课程设计报告字符串分类统计.docx
《微机原理课程设计报告字符串分类统计.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计报告字符串分类统计.docx(14页珍藏版)》请在冰豆网上搜索。
微机原理课程设计报告字符串分类统计
安徽新华学院
《微机原理与接口技术》
课程设计
字符串分类统计
组长:
成员:
指导教师:
班级:
2008年12月4日
目录
一、摘要……………………………………3
二、系统设计………………………………4
1、内容…………………………………4
2、思路…………………………………4
3、程序设计……………………………6
4、调试结果……………………………12
三、系统总结………………………………13
四、人员分工………………………………14
五、参考文献………………………………15
一、摘要
本程序主要用于,把输入的一串字符分类统计,分别统计出数字、大写字符、小写字符和其他字符的个数。
本程序采用汇编语言编程,定义了宏、比较判断、循环调用、统计等等,非常人性化的把统计的结果显示出来。
比如你输入一串数字“12345”,它会显示出你输入的这串数字,并显示数字的个数为5,同时显示其他相应类字符为空。
二、系统设计
1、内容
从键盘输入任意一个字符串,以回车作为结束符并显示,分别统计并显示出其中数字字符、大写字符、小写字符以及其它字符的个数。
2、思路
(1).首先定义两个宏,一个用于输出统计各字符的个数,另一个用于输出字符串。
(2).在数据段中定义各种字符提示信息以便程序清晰明白。
(3).定义数据缓冲区用于存放输入的字符串,定义NUM区用于存放统计的大写字符、小写字符、数字以及其它字符的个数。
定义OTHERCHAR、BIGCHAR、SMALLCHAR以及堆栈用于存放统计的相应字符保存,以便后来输出。
(4).首先调用DOS10号功能用DX指定BUF区,将输入的字符串保存到BUF区中。
(5).将BUF+1的内容取出来,判断是否为0,如果为0表示没有输入任何字符,则程序跳到NEXTLAP(输出提示信息Youdonotinputanystring!
),然后显示字符串(Doyouwanttoinputastringagain(Y/N)?
)然后调用DOS1号功能获取您从键盘输入的数,判断是否为Y或y如果是则将程序跳到刚开始处重新执行,如果不是这两个字符则程序结束。
(6).如果输入了字符串,则调用DOS2号功能将BUF里的内容输出来(2号功能可以输出$符号而9号功能遇到$符号就终止)。
(7).取字符出来进行比较统计,如果它比30H大且比39H小则为数字,如果比41H大且比5AH小则为大写字符,如果比61H大且比7AH小则为小写字符,如果不是这三种情况则为其它字符。
注:
DX存数字个数,BX存小写字母个数,DI存大写字母个数,BP存其它字符个数。
(8).将数字个数、大写字母个数、小写字母个数、其它字符个数依次放入NUM区。
(9).依次输出各字符:
a.判断数字个数是否为0,如果为0则输出提示没有此类数据,否则输出数字个数以及有哪些数字。
b.判断大写字符个数是否为0,如果为0则输出提示没有此类数据,否则输出大写字符的个数以及输入的哪些大写字符。
c.判断小写字符个数是否为0,如果为0则输出提示没有此类数据,否则输出小写字符的个数以及输入的哪些小写字符。
d.判断其它字符个数是否为0,如果为0则输出提示没有此类数据,否则输出其它字符的个数以及输入的哪些其它字符。
(10).然后将程序跳到NEXTLAP继续执行,依次下去。
流程图:
3、程序设计
shuchuMACRO;定义宏,用来输出统计其它字符、数字、大小写
个数
LOCALNEXT
MOVAH,0
MOVBL,10
DIVBL
MOVDL,AL
MOVBH,AH;将余数暂时存放在BH中
CMPAL,0
JZNEXT
ORDL,30h
MOVAH,2
INT21H
NEXT:
MOVDL,BH
ORDL,'0';输出余数
MOVAH,2
INT21H
dismsgCRLF;回车换行
ENDM
dismsgMACROmessage;输出字符串
LEADX,message
MOVAH,9
INT21H
ENDM
DATASSEGMENT
STRDB'Theinputstringis:
$'
STR1DB'Pleaseinputastring:
$'
STR2DB'Theintegeris:
$'
STR3DB'Thebigcharis:
$'
STR4DB'Thesmallcharis:
$'
STR5DB'Theothercharis:
$'
STR6DB'Thedateofintegerisnull!
$'
STR7DB'Thedateofothercharisnull!
$'
STR8DB'Thedataofbigcharisnull!
$'
STR9DB'Thedataofsmallcharisnull!
$'
NUM2DB'Thenumberofintegeris:
$'
NUM3DB'Thenumberofbigcharis:
$'
NUM4DB'Thenumberofsmallcharis:
$'
NUM5DB'Thenumberofothercharis:
$'
NUM6DB'Doyouwanttoinputastringagain?
(Y/N):
$'
NUM7DB'Youdonotinputanystring!
$'
NUM8DB'Pleaseinputcorrectcommand!
$'
BUFDB100;定义缓冲区用来存放输入的字符串
DB?
DB100DUP(24H)
CRLFDB0AH,0DH,'$'
NUMDB4DUP(?
)
BIGCHARDB100DUP(24H),0AH,0DH,'$'
SMALLCHARDB100DUP(24H),0AH,0DH,'$'
OTHERCHARDB100DUP(24H),0AH,0DH,'$'
TAILDB?
;用来存放其它字符的个数
DATASENDS
STACKSSEGMENT
STACK1DW100DUP(24H)
TOPLABELWORD
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
AGAIN1:
MOVAX,STACKS
MOVSS,AX
MOVSP,OFFSETTOP
MOVAX,DATAS
MOVDS,AX
MOVCX,100
AGAIN2:
LEASI,BIGCHAR
MOV[SI],24H
LEADI,SMALLCHAR
MOV[DI],24H
LEABX,OTHERCHAR
MOV[BX],24H
INCSI
INCDI
INCBX
LOOPAGAIN2
dismsgSTR1;显示输入提示信息
MOVAH,10;输入字符串
LEADX,BUF
INT21H
dismsgCRLF;回车换行
CMPBUF+1,0
JZNEXTLAP
dismsgSTR;提示输入字符串
MOVCL,BUF+1
LEASI,BUF+2
ABC:
MOVDL,[SI];用于输出缓冲区里的输入字符串
MOVAH,2
INT21H
INCSI
LOOPABC
dismsgCRLF;回车换行
MOVCL,BUF+1;将字符串的个数放入CL
LEASI,BUF+2;取字符串的首地址
MOVDX,0;DX统计数字个数
MOVBX,0;BX统计小写字母个数
MOVDI,0;DI统计大写字母个数
MOVBP,0;BP统计其他字符的个数
MOVAH,0
L1:
MOVAL,[SI]
CMPAL,30H
JLNEXT1
CMPAL,39H
JGL2
PUSHAX
INCDX;统计数字字符的个数
JMPNEXT
L2:
CMPAL,41H;统计大写字符的个数
JLNEXT1
CMPAL,5AH
JGL3
MOVBIGCHAR[DI],AL
INCDI
JMPNEXT
L3:
CMPAL,61H;统计小写字符的个数
JLNEXT1
CMPAL,7AH
JGNEXT1
MOVSMALLCHAR[BX],AL
INCBX
JMPNEXT
NEXT1:
MOVOTHERCHAR[BP],AL
INCBP;统计其它字符的个数
NEXT:
INCSI
DECCL
JNZL1
MOVNUM,DL;将统计的个数存放在NUM的存储区
MOVAX,DI;数字个数放在NUM,大写字符个数放在NUM+1
MOVNUM+1,AL;小写字符个数放在NUM+2,其他字符的个数放在NUM+3
MOVNUM+2,BL
MOVAX,BP
MOVTAIL,AL;将其它字符的个数送入TAIL保存,以便后来输出(否则9号功能输出遇$则退出)
MOVNUM+3,AL
CMPNUM,0;判断数字个数如果为0则输出提示符,否则循环输出
JZNNULL
dismsgSTR2;输出数字字符的提示符
MOVCL,NUM
MOVBP,OFFSETTOP
SUBBP,2
OK:
MOVDX,STACK1[BP]
MOVAH,2
INT21H
SUBBP,2
LOOPOK
dismsgCRLF
dismsgNUM2;输出数字字符数字的提示符
MOVAL,NUM;输出数字字符的个数
shuchu
JMPNNULL1
NNULL:
dismsgSTR6
NNULL1:
dismsgCRLF
CMPNUM+1,0;判断大写字符的个数如果为0则输出提示符,否则以字符串形式输出
JZBNULL
dismsgSTR3;输出大写字符的提示符
dismsgBIGCHAR
dismsgCRLF
dismsgNUM3;输出大写字符数字个数提示符
MOVAL,NUM+1;输出大写字符的个数
shuchu
JMPBNULL1
BNULL:
dismsgSTR8
BNULL1:
dismsgCRLF
CMPNUM+2,0;判断小写个数,如果为0则输出提示符,否则以字符串形式输出
JZSNULL
dismsgSTR4;输出小写字符的提示符
dismsgSMALLCHAR
dismsgCRLF
dismsgNUM4;输出小写字符数字个数的提示符
MOVAL,NUM+2;输出小写字符的个数
shuchu
JMPSNULL1
SNULL:
dismsgSTR9
SNULL1:
dismsgCRLF
CMPTAIL,0;判断其他字符的个数如果为0则输出提示符,否则循环输出
JZONULL
dismsgSTR5;输出其它字符的提示符
MOVCL,TAIL
MOVSI,OFFSETOTHERCHAR
L4:
;输出其它字符
MOVDL,[SI]
MOVAH,2
INT21H
INCSI
LOOPL4
dismsgCRLF
dismsgNUM5;输出其它字符个数的提示符
MOVAL,NUM+3;输出其它字符的个数
shuchu
JMPAGAIN
ONULL:
dismsgSTR7
JMPAGAIN
NEXTLAP:
dismsgNUM7
AGAIN:
dismsgCRLF
dismsgNUM6
MOVAH,01H
INT21H
MOVBL,AL
dismsgCRLF
CMPBL,'Y'
JZAGAIN1
CMPBL,'y'
JZAGAIN1
CMPBL,'N'
JZONULL2
CMPBL,'n'
JZONULL2
dismsgNUM8
JMPAGAIN
ONULL2:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
调试结果:
1)所有字符都有的时候:
2)其中有字符类型缺少的时候:
3)什么字符都不输入的时候:
三、系统总结
刚抽到这个题目时,老师就说我们的题目是所有题目中最简单的,于是非常庆幸。
但是当我们真正去做它的时候却发现并不是那么回事。
在写程序的时候首先要考虑很多问题,如何判断、如何显示、遇到$要怎么处理等等。
尤其当我们将四种字符依次保存起来以便后来输出的时候用,就遇见了一个比较大的麻烦,当时能用的四种可以用于地址的寄存器都用上了,但是感觉缺少一个,怎么办呢?
最后还是用堆栈解决了。
可是一开始输出的时候就遇见了错误,就是用堆栈保存的那个输不出来。
到底是哪里错了呢?
最后发现在存储器中堆栈存储是从高地址往低地址存的,每次取的时候应该是地址减2而不是加2。
所以通过这次课程设计也使我们对存储器的堆栈存储有了一个比较大概的了解。
最终,在大家的共同努力下,程序完成了,我们心里的一块石头放下了。
但是事情总有不如意,在老师说要准备验证程序的那个星期,我们回来重新运行了程序,当时一想我们输入的时候都是几种类型的字符都输入,那么如果缺少其中一种呢?
再次运行时少输入了一种类型的字符,这时问题出现了,出现了乱码。
当时我们就慌了,于是大家凑到一起赶紧修改。
大家你一言我一句纷纷发表自己的看法,东改改西改改,最终大功告成。
这次缺少其中一种两种它都会输出相应的字符类型为空,这次大家都放心了。
我说过,事情总有不如意。
程序又出现了问题。
过了几天我们又想到一个问题,输入缺少一种两种可以了,那么不输入字符会怎么样呢?
于是再次把程序运行,这次什么也不输入直接回车结束。
果然,这次又出现了乱码。
这次大家没有慌,因为有了上一次的经验,于是稍微把程序改改,跟之前的类似,问题还是很轻松的被解决了。
通过这一次两次的发现问题,解决问题,我们很清楚的认识到了一点。
想一件事情得到完善,不在于已经知道的问题,知道什么问题只要去努力,去探讨,最终还是可以解决的;关键是能不能发现问题所在,只有发现了才有可能去解决。
如果连问题是什么都不知道,那么还谈什么解决呢。
同时我们也看到了集体的力量,我们集体合作,各抒己见,把不同的思维结合起来,然后每个人从不同角度去发现问题,再通力合作去解决问题,最终完成我们的杰作。
虽然程序是完成了,但是程序当中依然还存在可以完善的部分,但是由于我们的能力有限,以我们目前的能力水平只能做到这种地步了。
我们的这个程序的优、缺点如下:
优点:
a.不管你输入什么字符我们都能将其回显出来。
b.不管你输入的字符全不全面,我们都能统计出来。
c.对于那些你没有输入的类型,我们将提示此类型无数据,这样可以一目了然。
d.程序结束时提醒你要不要继续输入字符串,可以循环输入。
缺点:
程序中用到了大量的JMP语句,这样会影响程序的运行速度。
四、人员分工
与其说分工还不如说合作,我们其实没有什么明确的分工,大概介绍下我们的流程。
开始在组长的安排下,我们每个人的任务是带着目标将课本上相关例题看懂,汲取相关思想。
考虑到我们的题不是太难也不是很复杂,每个人试着做出部分的程序,然后一起讨论一下怎么改进和融合。
再由施文军和陈远涛先将流程图制作出来,每个人轮流做相应讲解。
让每个人不仅明白自己写的部分,还要明白别人的部分。
最后组长孙长城将大家在编写过程遇到的困难和解决方案及实验感想做个总结。
五、参考文献
【1】楼顺天、周佳设.《微机原理与接口技术》.第一版.科技出版社,2006
【2】钱晓捷.《新版汇编语言程序设计》.电子工业出版社.2008
【3】葛洪伟、姜浩伟、赵雅群、黄蓓.《Intel汇编语言程序设计》.第一版.中国电力出版社,2007
【4】张雪兰.《Windows汇编语言程序设计教程》.电子工业出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 报告 字符串 分类 统计