统计字符串中某个字符出现次数.docx_第1页
统计字符串中某个字符出现次数.docx_第2页
统计字符串中某个字符出现次数.docx_第3页
统计字符串中某个字符出现次数.docx_第4页
统计字符串中某个字符出现次数.docx_第5页
已阅读5页,还剩12页未读, 继续免费阅读

下载本文档

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

文档简介

武汉理工大学微机原理与接口技术课程设计说明书目录摘要11课程设计目的22设计条件及要求22.1程序设计条件22.2程序设计要求23总体方案论证23.1总体方案思路23.2方案注意事项33.3具体方案论证33.3.1方案一33.3.2方案二43.3.3方案论证44流程图设计及说明54.1流程图54.2设计说明55软件设计关键问题和相应程序段65.1关键问题说明65.2问题解决方法65.3相应程序段76程序调试97结果记录及分析108课程设计收获及心得体会129参考文献1310附录14摘要微机原理与接口技术作为计算机科学领域的基础知识,尽管计算机科学高速发展,但基本原理依然不变,即是遵循冯诺依曼基本思想的。学习并能掌握好微机原理与接口技术这门知识是非常重要的,通过对这门知识的了解可以简单的编写一些日常中经典的控制程序。本文通过汇编语言编写程序,完成统计字符串中某个字符出现次数这一基本功能。下面会介绍该程序的编程思路,并对程序设计中遇到的问题进行深入的研究。关键字:微机 统计 编程统计字符串中某个字符出现次数汇编语言程序设计1课程设计目的通过本次课程设计,熟悉微机原理与接口技术的基本理论,使学生能够进一步了解微型计算机工作原理, 微型计算机的硬件结构及微型计算机软件编程,掌握使用汇编语言编写程序的方法,并进一步提高编程设计能力。2设计条件及要求本次微机原理与接口技术课程设计的题目为统计字符串中某个字符出现的次数,为汇编程序设计。2.1程序设计条件采用16位微处理器 8086 CPU以及86系列微型计算机的指令系统;软件设计平台为多功能微型计算机实验软件MFS中的微机原理实验集成环境MF2KP。2.2程序设计要求设计汇编语言程序,实现统计字符串中某个字符出现次数的功能,具体功能要求如下:(1)提示输入字符串;输入任意字符串string ,点击Enter结束输入;(2)提示输入字符;输入任意字符ch,点击Enter 结束输入;(3)输出字符串string 中字符ch的出现次数。点击Enter程序退出。3总体方案论证3.1总体方案思路要使用汇编语言实现统计字符串中某个字符出现次数的功能,总体的思路为:取出字符串string中的字符,依次与字符ch进行比较,同时统计该字符与字符ch相同的次数,最后输出结果到屏幕步骤大体分为以下几点:(1) 从键盘输入字符串string,同时得到字符串中的字符总数,并保存在寄存器中;(2) 从键盘输入查询字符ch,并保存在寄存器al中;(3) 从寄存器中循环取出字符串string中的字符,依次与字符ch进行比较,并记录相同的次数,存入寄存器中;(4) 从寄存器中取出结果,转换成字符输出到屏幕上。3.2方案注意事项根据程序设计要求,设计方案中需要注意的有以下几点:(1) 提示语句。需要在屏幕上显示提示输入字符和字符串及输出结果的提示语句;(2) 回车结束。需要在输入字符和字符串之后按Enter键才结束输入,输出结果后按Enter键才退出程序;(3) 程序使用范围。需要考虑程序能处理的字符串的最大长度;(4) 结果输出形式。由于在寄存器中存入的为二进制数,在输出的时候需要显示十进制的数;(5) 结果输出转换。二进制数据从寄存器不能直接输出到屏幕上;3.3具体方案论证根据总体方案思路,程序的核心是取字符串中的字符与查询字符ch循环比较。根据输出结果需要为十进制这一要求,以下有两种方案可以实现这一功能。3.3.1方案一方案一:将寄存器中的二进制数据转换成BCD码输出具体步骤:(1) 在进行字符比较的同时把统计结果存入寄存器中;(2) 统计结束之后,取出统计结果,并判断是否需要转换成BCD码进行转换;(3) 把结果转换成字符输出。论证:该方案有以下优点:(1) 由于统计结果最大为254,只需要使用一个8位寄存器来存放数据,调用方便;(2) 数据连续,占用储存空间小;(3) 设计思路简单,简化程序的循环部分。但该方案有以下缺点:(1) 输出程序段复杂,需要外加判断子程序;(2) 转换复杂,判断部分随着位数增多而变得复杂;(3) 统计结果受限制。如果输出三位数,由于转换复杂,输出变得难以实现;3.3.2方案二方案二:将三位数的输出结果分离成三个0到9的字符逐个输出具体步骤:(1) 在统计次数的过程中限制统计结果中每位上的数不大于9;(2) 把三位数各存放到三个8位寄存器中;(3) 输出时按顺序转换成字符逐个输出。论证:此方案有以下优点:(1) 输出段程序简单,不需要外加判断子程序;(2) 转换方便,循环比较时直接限制;(3) 位数由可以调用的8位寄存器个数决定,可以简单实现三位数的输出。但该方案有以下缺点:(1) 需要用三个8位寄存器,调用不方便;(2) 存放结果的每个8位寄存器只用到4位,浪费存储空间;(3) 循环比较部分复杂,数据储存不方便。3.3.3方案论证方案一与方案二相比,循环比较时统计结果简单,但输出结果为三位数时,方案一编程复杂,难以实现;而方案二使用三个8位寄存器,理论上可以统计0至999的统计次数的输出,满足最大统计结果254个字节,而且编程简单。就本程序而言,8个8位寄存器可以满足方案二中寄存器个数的要求。因此选用方案二。4流程图设计及说明4.1流程图按照总体方案设计流程图。流程图如下:图4.1程序流程图4.2设计说明按照总体方案,先设置缓冲区放置数据。再输入字符串,并把字符串长度即循环次数传到dl。然后输入查询字符ch。取字符串第一个字符与查询字符比较,相同时统计结果加1,不相同时跳过加1步骤。循环次数减1,当减至0时,输出统计结果。5软件设计关键问题和相应程序段5.1关键问题说明在程序设计过程中遇到以下问题:(1)回车结束程序问题调用DOS功能多字符输入0ah时输入的最后一个字符为回车。但是在输入查询字符和输出结果的时候,如果不加回车结束程序,程序会在输入查询字符的瞬间输出结果并退出程序,导致无法确认结果;(2)程序使用范围问题题目当中没有限定字符串的长度,但是这里用到的DOS功能调用多字符输入0ah所能输入的缓冲区中用于存放字符的区域最多只能存放255个字符(最后一个字节留给回车符),加上缓冲区第1个字节存放预定字符个数,第2个字节保留用于调用返回时存放实际输入的字符个数,实际中缓冲区最大的使用空间为257个字节,存放字符串最大长度为254个字节,需要编程进行限定。(3)结果分离储存问题由于DOS功能调用多字符输入0ah所能输入的缓冲区中一个字符在该字符串中最多重复出现的次数为254。那么在输出的时候需要输出三位数。在具体方案论证中已经确定使用把结果的三位数分离成三个0到9的字符的方法。需要考虑如何实现这一功能。(4)结果输出转换问题由于在寄存器中存入的为二进制数,在输出的时候需要显示十进制的数。但二进制数据从寄存器不能直接输出到屏幕上,要经过转换并调用多字符输出9号功能进行输出。需要考虑9号功能的使用方法和如何正确地输出字符。还应该对输出结果进行优化。5.2问题解决方法对于以上的问题,经过考虑和尝试之后,得到以下解决方案:(1)回车结束程序问题受到DOS功能调用多字符输入0ah输入字符最后结束的时候要输入回车符的启发,设置一个只有一个字节的区域,然后用DOS功能调用多字符输入0ah调用这个区域。该缓冲区只能输入一个字符,而要结束输入要输入回车符,因此只有输入回车的时候才会结束0ah的调用,到下一步或退出程序,而输入其他的字符无效。将此段程序加到查询字符输入和输出结果之后,可以实现按回车结束的功能。但是要注意的是,由于需要调用0ah,则dx与ah寄存器不能在调用前存放数据,不然会被覆盖。需要用其他寄存器代替来存储统计次数。(2)程序适用范围问题划分缓冲区的时候,定义变量时用DB定义为8位字节型数据,每一字节可以存放一个字符。DOS功能调用多字符输入0ah最多输入255个字符,因此在调用伪指令dup时,重复次数的设置不能超过255。若超过255,则在微机原理实验集成环境MF2KP中运行时会产生“无法生成obj文件”错误。(3)结果分离储存问题预定三个8位寄存器分别存放三位数的个、十、百位,并清零。注意这三个寄存器不能是al、cx。al存放查询字符,cl存放循环次数。ch没有使用,但是由于cl在循环比较时自动减1,为0时会向ch借位,会影响ch中的数据,也会造成循环次数不正确,因此ch应清零。在进行字符比较的时候,若字符相同则个位的寄存器上的数加1,然后个位与0ah比较,若相等,则个位清零,存放十位的寄存器的数加1;当达到10,即0ah时,个位不会存0ah,而是清零。如此类推,设置十位和百位。这就保证了各位上的数是0至9,而且分别存在三个8位寄存器中。(4)结果输出转换问题使用DOS功能调用多字符输出9号输出字符时是读取字符的ASCII码。在ASCII码表中,字符09对应的ASCII码为30h39h而在三个寄存器中的储存的数为01h09h。因此在输出之前,寄存器中的储存的统计结果要加上30h转换成ASCII码。输出还可以优化。输出时按照百位、十位、个位的顺序输出。当百位为0时,用转移指令跳过百位的输出;当百位和十位同时为0时,跳过百位和十位的输出。5.3相应程序段(1)回车结束程序段over db 1,?,1 dup(?) ;设置只能储存一个字节的缓冲区lea dx,buff ;输入ENTER结束mov ah,0ah int 21h(2)范围设置程序段buff db 255,?,255 dup(?) ;字符个数不能超过255(3)分离储存程序段again:cmp al,si ;取字符串的字符与查询字符循环比较jnz next inc dl ;查询结果个位放在DLcmp dl,0ahjnz next inc dh ; 查询结果十位放在DHxor dl,dlcmp dh,0ahjnz nextinc bh ;查询结果百位放在BHxor dh,dhnext: inc si loop again(4) 输出转换程序段xor cl,clcmp ch,cl jz liangwei ;若输出结果为两位数,则不显示百位的0mov dl,chadd dl,30h ;百位转换成ASCII码mov ah,2 ;输出百位int 21h jnz sanwei ;若输出结果为三位数,则当十位为0时显示十位liangwei:cmp bh,cl ;若输出结果为一位数,则不显示十位的0jz yiweisanwei:mov dl,bh add dl,30h;十位转换成ASCII码mov ah,2 ;输出十位int 21h yiwei: mov dl,bl add dl,30h;个位转换成ASCII码mov ah,2 ;输出个位int 21h6程序调试程序见附录6.1调试步骤(1)输入单字字符作为字符串,并输入不同查询字符;(2)输入单字字符作为字符串,并输入相同查询字符;(3)输入十个以上相同的字符作为字符串,并输入相同查询字符;(4)输入一百个以上相同的字符作为字符串,并输入相同查询字符;(5)输入相同字符直到不能输入为止,并输入相同查询字符;(6)输入一串任意字符作为字符串,并输入查询字符;6.2调试中出现的问题(1)程序完整输入之后,连接运行。但是无论输入什么样的字符,输出的结果都为零;(2)解决了问题(1)之后,当结果为100109时,结果显示为1019.6.3问题原因及解决方法问题(1):原因:在输入查询字符之后,直接接入了回车结束程序段,导致查询字符被覆盖,在循环比较的时候字符串中没有字符与查询字符一致,统计结果输出为0。解决方法:把回车结束程序段接到循环比较部分之后。注意如果存储统计结果的三个8位寄存器用到al、dx或dl的话,要先转移数据。问题(2):原因:在输出的时候,原本当结果的百位为0时,跳过百位的输出,当百位和十位同时为0时,跳过百位和十位的输出。但是由于设置成当百位为0时,跳过百位的输出,十位同时为0时,跳过十位的输出,导致当百位为1,十位为0时,十位输出被跳过。所以结果为100109时,结果显示为1019。解决方法:增加转移指令,使得当百位为1时,全部输出。7结果记录及分析调试步骤(1)输入单字字符a作为字符串,并输入查询字符b时,输出结果为0;调试步骤(2)输入单字字符a作为字符串,并输入查询字符a时,输出结果为1。证明个位输出正确,而且输出把百位和十位的0屏蔽,运行正常。图7.1调试步骤(1)结果图7.2调试步骤(2)结果调试步骤(3)输入14个相同的字符“aaaaaaaaaaaaaa”作为字符串,并输入查询字符a,输出结果为14。证明十位输出正确,而且输出把百位的0屏蔽,运行正常。图7.3调试步骤(3)结果调试步骤(4)输入105个相同的字符“aaaaaaaa”作为字符串,并输入查询字符a,输出结果为105。证明十位输出正确,而且输出把百位的0屏蔽,运行正常。图7.4调试步骤(4)结果调试步骤(5)输入相同字符“aaaaaaaa”直到不能输入为止,并输入查询字符a,输出结果为254。证明本程序最大可统计重复次数为254。图7.5调试步骤(5)结果调试步骤(6)输入一串任意字符“asdasd”作为字符串,并输入查询字符a,输出结果为2。证明本程序可查询任意字符,并运行正常。图7.6调试步骤(6)结果综上所述,程序功能完整,能够正常运行,符合要求课程设计要求。8课程设计收获及心得体会通过本次课程设计,我更加了解微机原理与接口技术课程的基本原理,熟悉运用汇编语言编程,进一步了解汇编语言中各种程序指令。在这次课程设计中,我对于微机原理中DOS功能调用的运用更加熟练,编程能力进一步提高。我拿到的课程设计题目是编写程序来实现统计字符串中某个字符出现次数这一功能。刚开始觉得这个题目很简单,在平时微机课的课本和作业里也有出现过类似的题目。当我把程序编好并输入电脑,运行的时候,出现了意想不到的事:输出结果一闪而过,程序迅速退出。程序是可以正确的,但是没有设置停顿。这让我懂得,在书本和作业上的程序都是理想化的,在实际的操作中需要进行优化,从而更加符合人的需求。这个课程设计题目中对程序的统计次数没有要求。对于这个题目我原本的方案可以实现程序的功能,但是对统计次数有限制。于是我更改方案,使得统计次数没有要求。虽然在对程序优化的过程中很辛苦,但是当自己的想法可以实现的时候,还是觉得收获很大。在完成这次课程设计的时候,我提高了自己的编程能力,并知道了自己之前学习微机原理课的时候的不足,让我更加深入的研究和掌握这一门课程。9参考文献 1彭虎等编著微机原理与接口技术(第二版)北京:电子工业出版社,2008 2沈美明,温东禅IBM-PC汇编语句程序设计(第2版)北京:清华大学出版社,2001 3任向明,卢惠林汇编语言程序设计实用教程北京:清华大学出版社,2009 4马力妮80x86汇编语言程序设计北京:机械工业出版社,2004 5曹加恒,苏光奎,许先斌新一代汇编语言程序设计北京:高等教育出版社,2003 10附录具体程序如下:data segment inf1 db 0dh,0ah,Please input string: $inf2 db 0dh,0ah,0dh,0ah,Please input a word: $inf3 db 0dh,0ah,0dh,0ah,Result: $buff db 255,?,255 dup(?) over db 1,?,1 dup(?)data ends code segment assume ds:data,cs:code begin:mov ax,data mov ds,ax lea dx,inf1 ;提示输入字符串mov ah,9int 21hlea dx,buff ;从键盘输入字符串,按enter结束mov ah,0ah int 21h lea dx,inf2 ;提示输入查询字符mov ah,9int

温馨提示

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

评论

0/150

提交评论