统计字符串中某个字符出现次数Word格式.docx
- 文档编号:17735731
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:14
- 大小:117.77KB
统计字符串中某个字符出现次数Word格式.docx
《统计字符串中某个字符出现次数Word格式.docx》由会员分享,可在线阅读,更多相关《统计字符串中某个字符出现次数Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
(2)从键盘输入查询字符ch,并保存在寄存器al中;
(3)从寄存器中循环取出字符串string中的字符,依次与字符ch进行比较,并记录相同的次数,存入寄存器中;
(4)从寄存器中取出结果,转换成字符输出到屏幕上。
方案注意事项
根据程序设计要求,设计方案中需要注意的有以下几点:
(1)提示语句。
需要在屏幕上显示提示输入字符和字符串及输出结果的提示语句;
(2)回车结束。
需要在输入字符和字符串之后按Enter键才结束输入,输出结果后按Enter键才退出程序;
(3)程序使用范围。
需要考虑程序能处理的字符串的最大长度;
(4)结果输出形式。
由于在寄存器中存入的为二进制数,在输出的时候需要显示十进制的数;
(5)结果输出转换。
二进制数据从寄存器不能直接输出到屏幕上;
具体方案论证
根据总体方案思路,程序的核心是取字符串中的字符与查询字符ch循环比较。
根据输出结果需要为十进制这一要求,以下有两种方案可以实现这一功能。
方案一
方案一:
将寄存器中的二进制数据转换成BCD码输出
具体步骤:
(1)在进行字符比较的同时把统计结果存入寄存器中;
(2)统计结束之后,取出统计结果,并判断是否需要转换成BCD码进行转换;
(3)把结果转换成字符输出。
论证:
该方案有以下优点:
(1)由于统计结果最大为254,只需要使用一个8位寄存器来存放数据,调用方便;
(2)数据连续,占用储存空间小;
(3)设计思路简单,简化程序的循环部分。
但该方案有以下缺点:
(1)输出程序段复杂,需要外加判断子程序;
(2)转换复杂,判断部分随着位数增多而变得复杂;
(3)统计结果受限制。
如果输出三位数,由于转换复杂,输出变得难以实现;
方案二
方案二:
将三位数的输出结果分离成三个0到9的字符逐个输出
(1)在统计次数的过程中限制统计结果中每位上的数不大于9;
(2)把三位数各存放到三个8位寄存器中;
(3)输出时按顺序转换成字符逐个输出。
此方案有以下优点:
(1)输出段程序简单,不需要外加判断子程序;
(2)转换方便,循环比较时直接限制;
(3)位数由可以调用的8位寄存器个数决定,可以简单实现三位数的输出。
(1)需要用三个8位寄存器,调用不方便;
(2)存放结果的每个8位寄存器只用到4位,浪费存储空间;
(3)循环比较部分复杂,数据储存不方便。
方案论证
方案一与方案二相比,循环比较时统计结果简单,但输出结果为三位数时,方案一编程复杂,难以实现;
而方案二使用三个8位寄存器,理论上可以统计0至999的统计次数的输出,满足最大统计结果254个字节,而且编程简单。
就本程序而言,8个8位寄存器可以满足方案二中寄存器个数的要求。
因此选用方案二。
4流程图设计及说明
流程图
按照总体方案设计流程图。
流程图如下:
图程序流程图
设计说明
按照总体方案,先设置缓冲区放置数据。
再输入字符串,并把字符串长度即循环次数传到dl。
然后输入查询字符ch。
取字符串第一个字符与查询字符比较,相同时统计结果加1,不相同时跳过加1步骤。
循环次数减1,当减至0时,输出统计结果。
5软件设计关键问题和相应程序段
关键问题说明
在程序设计过程中遇到以下问题:
(1)回车结束程序问题
调用DOS功能多字符输入0ah时输入的最后一个字符为回车。
但是在输入查询字符和输出结果的时候,如果不加回车结束程序,程序会在输入查询字符的瞬间输出结果并退出程序,导致无法确认结果;
(2)程序使用范围问题
题目当中没有限定字符串的长度,但是这里用到的DOS功能调用多字符输入0ah所能输入的缓冲区中用于存放字符的区域最多只能存放255个字符(最后一个字节留给回车符),加上缓冲区第1个字节存放预定字符个数,第2个字节保留用于调用返回时存放实际输入的字符个数,实际中缓冲区最大的使用空间为257个字节,存放字符串最大长度为254个字节,需要编程进行限定。
(3)结果分离储存问题
由于DOS功能调用多字符输入0ah所能输入的缓冲区中一个字符在该字符串中最多重复出现的次数为254。
那么在输出的时候需要输出三位数。
在具体方案论证中已经确定使用把结果的三位数分离成三个0到9的字符的方法。
需要考虑如何实现这一功能。
(4)结果输出转换问题
由于在寄存器中存入的为二进制数,在输出的时候需要显示十进制的数。
但二进制数据从寄存器不能直接输出到屏幕上,要经过转换并调用多字符输出9号功能进行输出。
需要考虑9号功能的使用方法和如何正确地输出字符。
还应该对输出结果进行优化。
问题解决方法
对于以上的问题,经过考虑和尝试之后,得到以下解决方案:
受到DOS功能调用多字符输入0ah输入字符最后结束的时候要输入回车符的启发,设置一个只有一个字节的区域,然后用DOS功能调用多字符输入0ah调用这个区域。
该缓冲区只能输入一个字符,而要结束输入要输入回车符,因此只有输入回车的时候才会结束0ah的调用,到下一步或退出程序,而输入其他的字符无效。
将此段程序加到查询字符输入和输出结果之后,可以实现按回车结束的功能。
但是要注意的是,由于需要调用0ah,则dx与ah寄存器不能在调用前存放数据,不然会被覆盖。
需要用其他寄存器代替来存储统计次数。
(2)程序适用范围问题
划分缓冲区的时候,定义变量时用DB定义为8位字节型数据,每一字节可以存放一个字符。
DOS功能调用多字符输入0ah最多输入255个字符,因此在调用伪指令dup时,重复次数的设置不能超过255。
若超过255,则在微机原理实验集成环境MF2KP中运行时会产生“无法生成obj文件”错误。
预定三个8位寄存器分别存放三位数的个、十、百位,并清零。
注意这三个寄存器不能是al、cx。
al存放查询字符,cl存放循环次数。
ch没有使用,但是由于cl在循环比较时自动减1,为0时会向ch借位,会影响ch中的数据,也会造成循环次数不正确,因此ch应清零。
在进行字符比较的时候,若字符相同则个位的寄存器上的数加1,然后个位与0ah比较,若相等,则个位清零,存放十位的寄存器的数加1;
当达到10,即0ah时,个位不会存0ah,而是清零。
如此类推,设置十位和百位。
这就保证了各位上的数是0至9,而且分别存在三个8位寄存器中。
使用DOS功能调用多字符输出9号输出字符时是读取字符的ASCII码。
在ASCII码表中,字符0~9对应的ASCII码为30h~39h而在三个寄存器中的储存的数为01h~09h。
因此在输出之前,寄存器中的储存的统计结果要加上30h转换成ASCII码。
输出还可以优化。
输出时按照百位、十位、个位的顺序输出。
当百位为0时,用转移指令跳过百位的输出;
当百位和十位同时为0时,跳过百位和十位的输出。
相应程序段
(1)回车结束程序段
overdb1,,1dup();
设置只能储存一个字节的缓冲区
…
leadx,buff;
输入ENTER结束
movah,0ah
int21h
(2)范围设置程序段
buffdb255,,255dup();
字符个数不能超过255
(3)分离储存程序段
again:
cmpal,[si];
取字符串的字符与查询字符循环比较
jnznext
incdl;
查询结果个位放在DL
cmpdl,0ah
incdh;
查询结果十位放在DH
xordl,dl
cmpdh,0ah
jnznext
incbh;
查询结果百位放在BH
xordh,dh
next:
incsi
loopagain
(4)输出转换程序段
xorcl,cl
cmpch,cl
jzliangwei;
若输出结果为两位数,则不显示百位的0
movdl,ch
adddl,30h;
百位转换成ASCII码
movah,2;
输出百位
int21h
jnzsanwei;
若输出结果为三位数,则当十位为0时显示十位
liangwei:
cmpbh,cl;
若输出结果为一位数,则不显示十位的0
jzyiwei
sanwei:
movdl,bh
adddl,30h;
十位转换成ASCII码
movah,2;
输出十位
yiwei:
movdl,bl
个位转换成ASCII码
输出个位
int21h
6程序调试
程序见附录
调试步骤
(1)输入单字字符作为字符串,并输入不同查询字符;
(2)输入单字字符作为字符串,并输入相同查询字符;
(3)输入十个以上相同的字符作为字符串,并输入相同查询字符;
(4)输入一百个以上相同的字符作为字符串,并输入相同查询字符;
(5)输入相同字符直到不能输入为止,并输入相同查询字符;
(6)输入一串任意字符作为字符串,并输入查询字符;
调试中出现的问题
(1)程序完整输入之后,连接运行。
但是无论输入什么样的字符,输出的结果都为零;
(2)解决了问题
(1)之后,当结果为100~109时,结果显示为10~19.
问题原因及解决方法
问题
(1):
原因:
在输入查询字符之后,直接接入了回车结束程序段,导致查询字符被覆盖,在循环比较的时候字符串中没有字符与查询字符一致,统计结果输出为0。
解决方法:
把回车结束程序段接到循环比较部分之后。
注意如果存储统计结果的三个8位寄存器用到al、dx或dl的话,要先转移数据。
问题
(2):
在输出的时候,原本当结果的百位为0时,跳过百位的输出,当百位和十位同时为0时,跳过百位和十位的输出。
但是由于设置成当百位为0时,跳过百位的输出,十位同时为0时,跳过十位的输出,导致当百位为1,十位为0时,十位输出被跳过。
所以结果为100~109时,结果显示为10~19。
增加转移指令,使得当百位为1时,全部输出。
7结果记录及分析
调试步骤
(1)输入单字字符a作为字符串,并输入查询字符b时,输出结果为0;
调试步骤
(2)输入单字字符a作为字符串,并输入查询字符a时,输出结果为1。
证明个位输出正确,而且输出把百位和十位的0屏蔽,运行正常。
图调试步骤
(1)结果
图调试步骤
(2)结果
调试步骤(3)输入14个相同的字符“aaaaaaaaaaaaaa”作为字符串,并输入查询字符a,输出结果为14。
证明十位输出正确,而且输出把百位的0屏蔽,运行正常。
图调试步骤(3)结果
调试步骤(4)输入105个相同的字符“aaaa……aaaa”作为字符串,并输入查询字符a,输出结果为105。
图调试步骤(4)结果
调试步骤(5)输入相同字符“aaaa……aaaa”直到不能输入为止,并输入查询字符a,输出结果为254。
证明本程序最大可统计重复次数为254。
图调试步骤(5)结果
调试步骤(6)输入一串任意字符“asdasd”作为字符串,并输入查询字符a,输出结果为2。
证明本程序可查询任意字符,并运行正常。
图调试步骤(6)结果
综上所述,程序功能完整,能够正常运行,符合要求课程设计要求。
8课程设计收获及心得体会
通过本次课程设计,我更加了解微机原理与接口技术课程的基本原理,熟悉运用汇编语言编程,进一步了解汇编语言中各种程序指令。
在这次课程设计中,我对于微机原理中DOS功能调用的运用更加熟练,编程能力进一步提高。
我拿到的课程设计题目是编写程序来实现统计字符串中某个字符出现次数这一功能。
刚开始觉得这个题目很简单,在平时微机课的课本和作业里也有出现过类似的题目。
当我把程序编好并输入电脑,运行的时候,出现了意想不到的事:
输出结果一闪而过,程序迅速退出。
程序是可以正确的,但是没有设置停顿。
这让我懂得,在书本和作业上的程序都是理想化的,在实际的操作中需要进行优化,从而更加符合人的需求。
这个课程设计题目中对程序的统计次数没有要求。
对于这个题目我原本的方案可以实现程序的功能,但是对统计次数有限制。
于是我更改方案,使得统计次数没有要求。
虽然在对程序优化的过程中很辛苦,但是当自己的想法可以实现的时候,还是觉得收获很大。
在完成这次课程设计的时候,我提高了自己的编程能力,并知道了自己之前学习微机原理课的时候的不足,让我更加深入的研究和掌握这一门课程。
9参考文献
[1]彭虎等编著.微机原理与接口技术(第二版).北京:
电子工业出版社,2008
[2]沈美明,温东禅.IBM-PC汇编语句程序设计(第2版).北京:
清华大学出版社,2001
[3]任向明,卢惠林.汇编语言程序设计实用教程.北京:
清华大学出版社,2009
[4]马力妮.80x86汇编语言程序设计.北京:
机械工业出版社,2004
[5]曹加恒,苏光奎,许先斌.新一代汇编语言程序设计.北京:
高等教育出版社,2003
10附录
具体程序如下:
datasegment
inf1db0dh,0ah,'
Pleaseinputstring:
$'
inf2db0dh,0ah,0dh,0ah,'
Pleaseinputaword:
inf3db0dh,0ah,0dh,0ah,'
Result:
buffdb255,,255dup()
overdb1,,1dup()
dataends
codesegment
assumeds:
data,cs:
code
begin:
movax,data
movds,ax
leadx,inf1;
提示输入字符串
movah,9
leadx,buff;
从键盘输入字符串,按enter结束
int21h
leadx,inf2;
提示输入查询字符
movah,1;
从键盘输入查询字符
movcl,buff+1;
字符总数
xorch,ch
leasi,buff+2;
字符串首地址
xordh,dh
xorbx,bx
cmpal,[si];
jnznext
incbl;
查询结果个位放在BL
cmpbl,0ah
jnznext
incbh;
查询结果十位放在BH
xorbl,bl
cmpbh,0ah
incdh;
查询结果百位放在DH
xorbh,bh
incsi
loopagain
movch,dh
leadx,over;
按ENTER结束查询字符的输入
leadx,inf3;
提示输出结果
xorcl,cl
cmpch,cl
jzer;
movdl,ch
adddl,30h;
movah,2;
jnzsan;
er:
cmpbh,cl
jzyi;
san:
movdl,bh
yi:
按ENTER继续
movah,4ch;
退出程序
codeends
endbegin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 统计 字符串 某个 字符 出现 次数