课程设计说明书课程名称:微机原理课程设计题目:查找字符串中的指定字符院系:数学与大数据学院专业班级:应用物理学号:学生姓名:指导教师:2017年6月16日安徽理工大学课程设计(论文)任务书数学与大数据院系信计教研室学号学生姓名专业(班级)应用物理设计题目查找字符串中的指定字符设计技术参数1.程序算法框图的设计2.程序代码的编写3.程序调试4.课程设计说明书的书写设计要求1.设计报告要求文字通顺,语言流畅,无错别字,统一用A4纸打印,不少于12页;2.设计报告中图表、附注、参考文献、公式一律采用阿拉伯数字连续(或分章)编号。3.图序及图名置于图的下方居中;表序及表名置于表的上方居中。工作量查阅相关材料,完成设计,完成设计报告工作计划1.综合论证,确定设计方案。2.查阅资料,完成设计。3.完成设计报告。参考资料[1]李伯成.微型计算机原理及应用[M].西安电子科技大学出版社,1998[2]陈忠强.现代微机原理与接口技术[M].冶金工业出版社.2006[3]郭兰英.微机原理与接口技术[M].清华大学出版社.2006[4]周明德.微型计算机系统原理及应用[M].北京:清华大学出版社[5]楼顺天,周社佳.微机原理与接口技术[M]·北京:科学出版社,2006...指导教师签字教研室主任签字年月日安徽理工大学课程设计(论文)成绩评定表学生姓名:学号:专业班级:应用物理课程设计题目:查找字符串中的指定字符指导教师评语:成绩:指导教师:年月日I目录一、背景及研究意义·····················1二、设计思路························2三、程序设计························23.1程序中用到的dos调用················23.2程序中主要汇编指令·················33.3程序设计框图····················4四、程序主要代码分析····················64.1数据段代码·····················64.2显示提示字符代码段·················64.3字符段输入代码段···················64.4字符比较代码段···················74.5结果输出代码段···················8五、程序调试与结果分析···················95.1运行结果······················95.2问题分析······················10六、总结与心得体会·····················11参考文献··························12附录····························131一、背景及目的研究意义汇编语言是面向机器的程序设计语言。在计算机发展的初期,人们是用机器指令码(二进制编码)来编写程序的,这就称为机器语言。但是机器语言无明显的特征,不好理解和记忆,也不便于学习,在编制程序时极易出错。所以,人们就用助记符代替操作码,用符号来代替地址,这就是汇编语言阶段。在汇编语言中,用助记符代替操作码,用地址符号代替操作码。这样的符号代替机器语言的二进制码,就把机器语言变成汇编语言。于是汇编语言又被叫做符号语言。使用汇编语言编写的程序,机器不能直接识别,要通过一种程序将汇编语言翻译成机器语言,这种其翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。高级汇编程序如MASM、TASM等为我们在编写汇编程序提供了很多类似高级语言的特征,比如结构化、抽象等。在这种环境下编写的程序,有很大一部分是伪指令,已经跟高级语言很像了,即使全部用汇编语言来编写windows程序也是可行的。汇编语言作为面向机器的语言,通过对该语言的学习,能够加深对计算机内部器件原理以及工作方式的理解。学习汇编语言时也需要懂得每句代码运行后,CPU的寄存器和储存器的内容变更,理解芯片如何运行每个指令的,从而加深对计算机硬件的理解。而本次课程设计的课题,查找字符串中指定字符将运用到汇编语言中的基本指令以及分支和循环语句。本次课程设计不仅可以更加熟练的掌握汇编的语句和指令,还可以把课堂上学习到的理论知识和实践结合起来,提高个人的动手能力和独立思考的能力。通过设计过程,要熟悉并且掌握微机系统的软件设计方法、设计步骤,以及学会在程序编写过成中发现问题,分析问题与解决问题的能力。还要加深对汇编语言的理解,在以后的应用中更加的熟练。2二、设计思路首先按照课程设计要求在字符和字符串输入前要显示一串提示符,然后输入一个字符串,显示在窗口上,再次提示输入一个字符。比较字符串中字符与这个字符是否相同,并记相同的个数。其中代码核心部分就是比较与输出,这部分代码的设计思路如下:1.首先利用循环程序输入一个字符串,判断是否有回车输入,有则跳出字符串的输入程序,并且保存到数据段中。2.然后输入字符,然后保存到数据段中。3.利用循环程序逐个比较,如相同,则计数加1,直到比较完,记录相同字符的个数,并换行输出。图2-1设计思路输入字符串存入数据段输入字符存入数据段取数据比较输出结果循环输入相同,则计数器+13三、程序设计3.1程序中用到的dos调用3.1.1、键盘输入并显示(1号功能调用)格式:MOVAH,01HINT21H功能:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符。如果按下的是Ctrl+Break组合键,则终止程序执行。1号功能调用无须入口参数,出口参数在AL中。3.1.2、屏幕显示格式:MOVDX,字符串的偏移地址MOVAH,09HINT21H功能:在屏幕上显示字符串。在使用9号功能调用时,应当注意以下问题。①待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。②应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。3.1.3、字符串输入功能调用(0AH号功能调用)格式:MOVDX,已定义缓冲区的偏移地址MOVAH,0AHINT21H功能:从键盘接收字符,并存放到内存缓冲区。在使用0AH号功能调用时,应当注意以下问题:①执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,字符个数应包括回车符0DH在内,不能为“0”值。第二个字节保留,在执行程序完毕后存入输入的实际字符个数。从第三个字节开始存入从键盘上接收字符的ASCII码。②应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。3.1.4、返回DOS操作系统(4CH号功能调用)格式:MOVAH,4CHINT21H功能:终止当前程序的运行,并把控制权交给调用的程序,即返回DOS系统,屏幕出现DOS提示符,如“C:\”,等待DOS命令。43.2、汇编指令3.2.1、CMP比较指令比较指令完成两个操作数相减,使结果反映在标志位上,但两操作数不变。格式:CMPAX,BX具体的说,比较指令可使累加器与立即数、任一通用寄存器或任一内存操作数相比较;也可以使任一通用寄存器与立即数、其他寄存器或任一内存操作数相比较;也可以使内存操作数与立即数或任一寄存器相比较。在比较指令之后,根据ZF标志即可判断两者是否相等,若两者相等,相减以后结果为0,则ZF标志为1;否则为0。3.2.2、根据ZF标志位形成的的条件转移指令格式:JNZLabel这是当ZF标志等于0时,能转移到目标地址(Label)的条件转移指令。3.2.3、LEA加载有效地址计算源操作数的有效地址(即段内偏移量)并存储至目标操作数。源操作数是一个内存单元(可用各种寻址方式),目标操作数是一个通用寄存器。3.2.4、XOR执行按位逻辑异或格式:XORDOPD,SOPD这条指令对两个指定的操作数进行“异或”运算,当进行“异或”的两位不相同时(即一个为1,一个为0),“异或”的结果为1;否则为0.异或运算的结果送回一个操作数。在本课题中用此条命令对AX寄存器清零操作。53.3程序设计框图3.3.1字符串输入框图图3-1字符串输入框图开始显示提示符1输入字符串是否输入回车输入字符数小于9?incdiincsiinccx在字符串末端加入“$”字符结束NYNY63.3.2比较与输出框图图3-2比较与输出框图开始输出提示符2,并输入比较字符与字符串中字符相等?INCDIBL+1输入提示符3输出形同字符个数结束YN7四、主要代码分析4.1数据段代码datasegmenttip1dbpleaseinputastring:,0dh,0ah,$tip2dbpleaseinputaword:,0dh,0ah,$tip3db0dh,0ah,Theresultis:,$str1db256dup(?)str2db256dup(?)countdb?dataends4.2显示提示符代码段start:movax,datamovds,axmovcx,0leadx,tip1movah,09h;显示提示符1int21h将伪地址段装入段寄存器中,并且输出第一条提示语句。4.3字符串输入段代码input:cmpcx,09hjznextmovah,01h;输入字符串int21hmov[di],almov[si],alincdiincsi8inccxcmpal,0dhjnzinputnext:moval,$mov[si],al键盘输入字符,并且在每次输入之后判断是否为回车,若是,结束输入并插入结尾标志“$”,若不是回车,则循环继续输入,并在窗口显示输入的字符串。4.4字符比较代码段xorax,ax;将ax寄存器清零leadx,tip2;显示提示符2movah,09hint21hmovah,01h;输入比较字符int21hleasi,countmov[si],almovbl,30hleadi,str2cmp2:cmpal,[di]jnzcmp1incblcmp1:incdiloopcmp2movdl,0ah9首先,需要对AX寄存器进行清零操作,因为AX寄存器若不为0,对接下来的两个字符的比较会产生较大影响。之后输出第二条提示语句,提示输入要进行比较的字符。用bl寄存器来计字符相同的个数。在cmp2程序段中比较,若不同,直接调到cmp1中取下一个字符比较,若相同则bl+1在进入cmp1中取下一个字符进行比较。4.5结果输出程序段leadx,tip3movah,09hint21hmovah,02hint21hmovdl,blint21h10五、程序调试与结果分析5.1运行结果程序运行开始界面图5-1输出结果1输入一个字符串后的界面图5-2输出结果211输入一个字符后立即出结果界面图5-3输出结果5.2问题分析问题1:程序运行时,当执行查找功能时出现乱码。问题2:当输入10个及以上相同的字符时,再查找该字符,程序会出现错误。通过对这些问题的分析、查找资料以及讨论后的一些方案如下:问题1:原因是系统不能确定是否结束输出,所以会出现乱码。设计程序时设置按回车结束输出,或者在输入字符后加“$”符号。问题2:原因是9的ASCII码后面一位不是10而是“:”所以结果为10时会输出0:而不是10。在输入代码段加入跳转代码,当输入字符数到达10个时自动结束输入。12六、总结与心得体会通过对这程序的制作,使我对汇编语言的基本知识的使用更加熟练,同时也增加了我对汇编语言的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。通过查阅以下资料也学到了一些课本上没有的东西,拓宽了自己的知识面,增加了学好汇编语言的信心。当然,在程序的编写与设计的过程中也发现了一些问题,比如说出现乱码的问题。当时不太清楚这段乱码出现的原因,但是去网上搜索这问题,发现也有些人和我一样的粗心大意,并且有人给出了很好的方法解决了这个问题。还有问题2是问了一个同学,他跟我解释了这个输出ASCII问题。但是我用了一个比较笨的方法解决了这个问题。这让我觉得团队合作的重要性以及搜索知识的能力的锻炼。通过这次课程设计使我懂得了理论与实际相结