1、汇编语言课程设计汇编语言课程设计报告( 2010 - 2011 年度第 2 学期)课题名称:实现加减乘除四则运算的计算器专业计算机科学与技术学生姓名班级B计算机092学号指导教师完成日期2011年6月24日实现加减乘除四则运算的计算器1 设计目的 本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。2 设计内容课题名称:实现加减乘除四则运算的计算器主要功能:能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如
2、下:C:tasmjs 3+253 实现方法3.1 系统目标本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是
3、要解决的问题。第一步,我要解决的是输入时是用INT 21H的10号功能调用还是用INT 21H的1号功能调用来进行输入。若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。第二步,设计程序进行判断
4、所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是+号、-号、*号、/号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。第三步,根据计算器程序所要实现的功能完成各个功能模块。设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。子模块中包含有:do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div除法运算模块,input输入模块等。最后还要对这个简易计算器进行功能完善。为了使程序符合我们使用者的操作习惯,
5、设计当用户根据提示信息输入一个算式后,按下enter键或是=符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算器。3.2程序流程图及说明此程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。程序流程图说明:通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为
6、Q或q,若是,则退出程序,不是则继续输入。还要判断输入的是否为0-9,+,-,*,/这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。图3-1程序流程图3.2 主体功能本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一
7、个基本功能完善,界面友好,操作简便易行的计算器为最终目的。通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。通过对各种指令的合理使用,熟悉并加深对各种指令的用法。学会使用汇编语言设计各个功能模块。当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。4程序调试4.1 运行界面分析将源程序输入编辑程序中,检查无误后经汇编、连接后装入系统运行界面如图4-1所示:图4-1 运行界面 程序的运行界面显示成功,屏幕上显示“input a suanshi(input q exit
8、):”提示用户输入一个算式。4.2 调试过程及分析对程序源代码进行功能调试和功能验证。程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进行分析。再者,要对当用户输入Q或q时,退出程序的功能进行检测。加法运算,计算1122+1658,如图4-2所示:图4-2 加法运算 减法运算,计算2345-2533,如图4-3所示:图4-3 减法运算乘法运算,计算1233*3000,如图4-4所示:图4-4 乘法运算除法运算,计算98/10,如图4-5所示:图4-5 除法运算当用户输入Q或q时,程序退出,如图4-6所示:图4-6 退出程序测试5 小 结本次课程设计我认为最需要改进的就是程序的健壮
9、性。通过这次课程设计,我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入数据非法,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名其妙的输出结果。一个正确可行的算法如果缺乏健壮性,那么这个程序也不能算真正的成功。汇编语言是本专业的一门重要的程序语言。在刚开始学习时,一直担心自己、也没把握自己能否学好,也曾担心过不了考试这一关。经过近大半学期老师您不厌其烦的教导,引导我们去学习。我对汇编语言语言有了一定的了解,但那绝对是远远不够的,还是要不断地把它应用到实践中去,融会贯通。经过为期一周的汇编语言课程设计,亲身感受体验敲、改写程序代码的乐趣,我对汇编语言有了较为深入的了解
10、,不仅巩固了以前在课本上学到的知识,还学会了很多其他东西。通过这次课程设计,我收获的不仅仅是课程上的知识得到实际应用,还有编程的基本习惯和开发系统时应注意的流程。作为一个程序编程人员,要保持清醒的头脑,以现实为依据,让自己的每一行代码都能实现自己的意义。参考文献1 温冬蝉、沈美明IBM PC汇编语言程序设计北京:清华大学出版社,2007.52 刘其明.汇编语言程序设计教程.徐州:中国矿业大学出版社,2010 3 钱晓捷.新版汇编语言程序设计.北京:电子工业出版社,20074 何小海,严华. 微机原理与接口技术.北京:科学出版社,2006附 录附录1 源程序清单B_PEQUBYTEPTRW_PE
11、QUWORDPTRD_PEQUDWORDPTRCODESEGMENTASSUMECS:CODE,DS:CODEORG100H;主程序开始NEWSTAR:JMPSTAREVENNUM1DW0,0NUM2DW0,0NUM3DW0,0JGV4DW0,0YSFLABELWORDYSF1DB0YSF2DB0JUVDB0UVDB0;使DS:SI指向第一有效字符OVERSLABELNEARCLDPUSHAXOVERS1:LODSBCMPAL,JZOVERS1CMPAL,9JZOVERS1DECSICMPAL,13POPAXRET;输出一个制表符TABLABELNEARMOVAL,9JMPSHORTDISP;
12、输出一个回车换行符CRLFLABELNEARMOVAL,13CALLDISPMOVAL,10;显示一个字符DISPLABELNEARPUSHAXPUSHDXMOVAH,2MOVDL,ALINT21HPOPDXPOPAXRET;检查是否为运算符ISYSFLABELNEARCLDLODSBCALLISJJJZISYSF1CALLISIIJZISYSF1DECSIISYSF1:RET;检查是否是加减运算ISJJLABELNEARCMPAL,+JZISYSF1CMPAL,-RET;检查是否为乘除运算ISIILABELNEARCMPAL,*JZISYSF1CMPAL,/JZISYSF1CMPAL,RET
13、;数据输出;CX=10十进制;CX=16十六进制DOUTLABELNEARPUSHAXPUSHBXPUSHDXPUSHBPXORBP,BPDOUT1:INCBPPUSHAXMOVAX,DXXORDX,DXDIVCXMOVBX,AXPOPAXDIVCXPUSHDXMOVDX,BXORBX,AXJNZDOUT1DOUT2:POPAXADDAL,0CMPAL,9JBEDOUT3ADDAL,A-9-1DOUT3:CALLDISPDECBPJNZDOUT2POPBPPOPDXPOPBXPOPAXRET;输入数据在DX:AX中返回;CX=0数据为10进制;CX#0数据为16进制DATELABELNEARP
14、USHBXPUSHBPPUSHDIXORAX,AXXORDX,DXDATE1:MOVDI,AXLODSBCMPAL,0JBDATE7CMPAL,9JADATE6DATE2:ANDAX,0FHSHLDI,1RCLDX,1MOVBX,DIMOVBP,DXSHLDI,1RCLDX,1SHLDI,1RCLDX,1JCXZDATE3SHLDI,1RCLDX,1JmpshortDATE4DATE3:ADDDI,BXADCDX,BPDATE4:ADDAX,DIADCDX,0JMPDATE1DATE5:ADDAL,9JMPDATE2DATE6:JCXZDATE7CMPAL,AJBDATE7CMPAL,FJBE
15、DATE5CMPAL,aJBDATE7CMPAL,fJBEDATE5DATE7:MOVAX,DIDECSIORDI,DXPOPDIPOPBPPOPBXRET;数据1与数据2根据YSF1进行加减运算JSJJLABELNEARMOVAX,NUM2MOVDX,NUM2+2CMPYSF1,+JZJSJJ1SUBNUM1,AXSBBNUM1+2,DXJMPSHORTJSJJ2JSJJ1:ADDNUM1,AXADCNUM1+2,DXJSJJ2:RET;数据1与数据2根据YSF1进行乘除运算JSII1LABELNEARMOVBX,OFFSETNUM1JMPSHORTJSII2_1;数据2与数据3根据YSF2
16、进行乘除运算JSII2LABELNEARMOVBX,OFFSETNUM2JSII2_1:DB66HMOVAX,BXDB66HMOVCX,BX+4CMPYSF2,*JNZJSII2_2DB66HIMULCXJMPSHORTJSII2_3JSII2_2:DB66HCWDDB66HIDIVCXCMPYSF2,/JZJSII2_3DB66HXCHGDX,AXJSII2_3:DB66HMOVBX,AXRET;显示结果XUJGLABELNEARMOVAX,JGV4MOVDX,JGV4+2MOVCX,10CMPUV,10JZXUJG0MOVCX,16XUJG0:TESTDX,8000HJZXUJG1CMPU
17、V,10JZXUJG2CALLDOUTXUJG2:NOTAXNOTDXADDAX,1ADCDX,0PUSHAXCMPUV,10JZXUJG3MOVAL,CALLDISPMOVAL,(CALLDISPXUJG3:MOVAL,-CALLDISPPOPAXCMPUV,10JZXUJG1CALLDOUTMOVAL,)CALLDISPRETXUJG1:CALLDOUTRET;计算结果放入DX:AX中JSJGLABELNEARCALLJSJJMOVAX,NUM1MOVDX,NUM1+2RET;从DS:SI处取一个数据LOADATELABELNEARLODSBCMPAL,(JZLOADATE1DECSIPU
18、SHCXXORCX,CXCMPUV,10JZLOADATE0INCCX;取16进制数LOADATE0:CALLDATE;取数据放入DX:AX中POPCXRETLOADATE1:PUSHNUM1;保存数据1数据2及运算符PUSHNUM1+2PUSHNUM2PUSHNUM2+2PUSHYSFINCJUVMOVJGV4,0;结果值清零MOVJGV4+2,0;进行四则运算SZYSLABELNEARCALLISYSF;首字符是运算符?JZSZYS2CALLLOADATE;不是,取数并保存MOVNUM1,AXMOVNUM1+2,DXSZYS1:XORAX,AX;数据2清零MOVNUM2,AXMOVNUM2
19、+2,AXCALLISYSF;下个是运算符?JZSZYS3JNZSZYS6SZYS2:PUSHAXMOVAX,JGV4;将结果作为数据1MOVNUM1,AXMOVAX,JGV4+2MOVNUM1+2,AXPOPAXSZYS3:MOVYSF1,ALMOVYSF2,ALCALLISJJ;是加减运算转JZSZYS4CALLLOADATE;取数据2MOVNUM2,AXMOVNUM2+2,DXCALLJSII1;数据1与数据2根据YSF1进行乘除运算JMPSZYS1;结果保存在数据1中SZYS4:CALLLOADATE;取数据2并保存MOVNUM2,AXMOVNUM2+2,DXSZYS4_1:CALLI
20、SYSFJNZSZYS6CALLISJJ;运算符2是加减运算?JNZSZYS5;不是转PUSHAXCALLJSJJ;数据1与数据2根据YSF1进行加减运算POPAX;结果保存在数据1中MOVYSF1,AL;保存新的运算符JMPSZYS4SZYS5:MOVYSF2,AL;保存运算符2CALLLOADATE;取数据3MOVNUM3,AXMOVNUM3+2,DXCALLJSII2;数据2与数据3根据YSF2进行乘除运算JMPSZYS4_1;结果保存在数据2中SZYS6:MOVCL,ALCMPAL,13JNZSZYS9SZYS7:CALLJSJGCMPJUV,0JZSZYS8DECJUVPOPYSFPOPNUM2+2POPNUM2POPNUM1+2POPNUM1RETSZYS8:CMPCL,)JZSZYS10MOVJGV4,AXMOVJGV4+2,DXJNZSZYS12SZYS9:CMPAL,)JNZSZYS11INCSIJMPSZYS7SZYS10:MOVNUM1,AXMOVNUM1+2,DXJMPSZYS1SZYS11:STC
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1