《汇编语言课程设计四则运算计算器...doc》由会员分享,可在线阅读,更多相关《汇编语言课程设计四则运算计算器...doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date汇编语言课程设计四则运算计算器.永磁同步电机( permanent magnet syn2汇编语言课程设计报告( 2012 - 2013 年度第 1 学期)实验名称:实现加减乘除四则运算的计算器专业生物医学工程学生姓名周炳威班级B100904学号B10090406指导教师乐洋-实现加减乘除四则运算的计算器1 实验目的 深化学习的汇编语言课程基本知识,进一步掌握汇编语言
2、程序设计方法,提高分析问题、解决问题的综合应用能力。通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用2 实验内容课题名称:实现加减乘除四则运算的计算器主要功能:实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。3 实现方法本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能
3、对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。第一步,用INT 21H的1号功能调用来进行输入。利用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,+,-,*,/这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。程序开始输入一个算式Q/q?0f+-*/?存储数据判断运算符号调用运算功能模块输入出错NYY 输出提示语句退出YNY按下Enter或=键显示结果 源程序清单B_PEQUBYTEPTRW_PEQUWORDPTRD_PEQUDWORDPTRCODESEGMENTASSUMECS:CODE,DS:CODEORG100H;主程序开始NEWSTAR:JMPSTAREVENNUM1DW0,
7、0NUM2DW0,0NUM3DW0,0JGV4DW0,0YSFLABELWORDYSF1DB0YSF2DB0JUVDB0UVDB0;使DS:SI指向第一有效字符OVERSLABELNEARCLDPUSHAXOVERS1:LODSBCMPAL,JZOVERS1CMPAL,9JZOVERS1DECSICMPAL,13POPAXRET;输出一个制表符TABLABELNEARMOVAL,9JMPSHORTDISP;输出一个回车换行符CRLFLABELNEARMOVAL,13CALLDISPMOVAL,10;显示一个字符DISPLABELNEARPUSHAXPUSHDXMOVAH,2MOVDL,ALIN
8、T21HPOPDXPOPAXRET;检查是否为运算符ISYSFLABELNEARCLDLODSBCALLISJJJZISYSF1CALLISIIJZISYSF1DECSIISYSF1:RET;检查是否是加减运算ISJJLABELNEARCMPAL,+JZISYSF1CMPAL,-RET;检查是否为乘除运算ISIILABELNEARCMPAL,*JZISYSF1CMPAL,/JZISYSF1CMPAL,RET;数据输出;CX=10十进制;CX=16十六进制DOUTLABELNEARPUSHAXPUSHBXPUSHDXPUSHBPXORBP,BPDOUT1:INCBPPUSHAXMOVAX,DXX
9、ORDX,DXDIVCXMOVBX,AXPOPAXDIVCXPUSHDXMOVDX,BXORBX,AXJNZDOUT1DOUT2:POPAXADDAL,0CMPAL,9JBEDOUT3ADDAL,A-9-1DOUT3:CALLDISPDECBPJNZDOUT2POPBPPOPDXPOPBXPOPAXRET;输入数据在DX:AX中返回;CX=0数据为10进制;CX#0数据为16进制DATELABELNEARPUSHBXPUSHBPPUSHDIXORAX,AXXORDX,DXDATE1:MOVDI,AXLODSBCMPAL,0JBDATE7CMPAL,9JADATE6DATE2:ANDAX,0FH
10、SHLDI,1RCLDX,1MOVBX,DIMOVBP,DXSHLDI,1RCLDX,1SHLDI,1RCLDX,1JCXZDATE3SHLDI,1RCLDX,1JmpshortDATE4DATE3:ADDDI,BXADCDX,BPDATE4:ADDAX,DIADCDX,0JMPDATE1DATE5:ADDAL,9JMPDATE2DATE6:JCXZDATE7CMPAL,AJBDATE7CMPAL,FJBEDATE5CMPAL,aJBDATE7CMPAL,fJBEDATE5DATE7:MOVAX,DIDECSIORDI,DXPOPDIPOPBPPOPBXRET;数据1与数据2根据YSF1进行加
11、减运算JSJJLABELNEARMOVAX,NUM2MOVDX,NUM2+2CMPYSF1,+JZJSJJ1SUBNUM1,AXSBBNUM1+2,DXJMPSHORTJSJJ2JSJJ1:ADDNUM1,AXADCNUM1+2,DXJSJJ2:RET;数据1与数据2根据YSF1进行乘除运算JSII1LABELNEARMOVBX,OFFSETNUM1JMPSHORTJSII2_1;数据2与数据3根据YSF2进行乘除运算JSII2LABELNEARMOVBX,OFFSETNUM2JSII2_1:DB66HMOVAX,BXDB66HMOVCX,BX+4CMPYSF2,*JNZJSII2_2DB66
12、HIMULCXJMPSHORTJSII2_3JSII2_2:DB66HCWDDB66HIDIVCXCMPYSF2,/JZJSII2_3DB66HXCHGDX,AXJSII2_3:DB66HMOVBX,AXRET;显示结果XUJGLABELNEARMOVAX,JGV4MOVDX,JGV4+2MOVCX,10CMPUV,10JZXUJG0MOVCX,16XUJG0:TESTDX,8000HJZXUJG1CMPUV,10JZXUJG2CALLDOUTXUJG2:NOTAXNOTDXADDAX,1ADCDX,0PUSHAXCMPUV,10JZXUJG3MOVAL,CALLDISPMOVAL,(CALL
13、DISPXUJG3:MOVAL,-CALLDISPPOPAXCMPUV,10JZXUJG1CALLDOUTMOVAL,)CALLDISPRETXUJG1:CALLDOUTRET;计算结果放入DX:AX中JSJGLABELNEARCALLJSJJMOVAX,NUM1MOVDX,NUM1+2RET;从DS:SI处取一个数据LOADATELABELNEARLODSBCMPAL,(JZLOADATE1DECSIPUSHCXXORCX,CXCMPUV,10JZLOADATE0INCCX;取16进制数LOADATE0:CALLDATE;取数据放入DX:AX中POPCXRETLOADATE1:PUSHNUM
14、1;保存数据1数据2及运算符PUSHNUM1+2PUSHNUM2PUSHNUM2+2PUSHYSFINCJUVMOVJGV4,0;结果值清零MOVJGV4+2,0;进行四则运算SZYSLABELNEARCALLISYSF;首字符是运算符?JZSZYS2CALLLOADATE;不是,取数并保存MOVNUM1,AXMOVNUM1+2,DXSZYS1:XORAX,AX;数据2清零MOVNUM2,AXMOVNUM2+2,AXCALLISYSF;下个是运算符?JZSZYS3JNZSZYS6SZYS2:PUSHAXMOVAX,JGV4;将结果作为数据1MOVNUM1,AXMOVAX,JGV4+2MOVNU
15、M1+2,AXPOPAXSZYS3:MOVYSF1,ALMOVYSF2,ALCALLISJJ;是加减运算转JZSZYS4CALLLOADATE;取数据2MOVNUM2,AXMOVNUM2+2,DXCALLJSII1;数据1与数据2根据YSF1进行乘除运算JMPSZYS1;结果保存在数据1中SZYS4:CALLLOADATE;取数据2并保存MOVNUM2,AXMOVNUM2+2,DXSZYS4_1:CALLISYSFJNZSZYS6CALLISJJ;运算符2是加减运算?JNZSZYS5;不是转PUSHAXCALLJSJJ;数据1与数据2根据YSF1进行加减运算POPAX;结果保存在数据1中MOV
16、YSF1,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:CMP
17、AL,)JNZSZYS11INCSIJMPSZYS7SZYS10:MOVNUM1,AXMOVNUM1+2,DXJMPSZYS1SZYS11:STCRETSZYS12:CLCRET;数制处理UVILLABELNEARPUSHSIUVIL1:LODSBCMPAL,JZUVIL2CMPAL,9JZUVIL2CMPAL,13JZUVIL4JNZUVIL1UVIL2:MOVBX,SICALLOVERSJZUVIL3LODSWCALLOVERSPOPSIJNZSZYS11CMPAX,01JNZSZYS11PUSHSIMOVUV,10UVIL3:MOVAL,13MOVBX-1,ALUVIL4:POPSICL
18、CRET;预置结果YVJGLABELNEARMOVAH,52HINT21HMOVAX,ES:BX-2MOVDS,AXMOVAX,DS:0CHMOVCS:JGV4,AXMOVAX,DS:0EHMOVCS:JGV4+2,AXPUSHCSPOPDSPUSHCSPOPESRET;保存结果BCJGLABELNEARMOVAH,52HINT21HMOVAX,ES:BX-2MOVDS,AXMOVAX,CS:JGV4MOVDS:0CH,AXMOVAX,CS:JGV4+2MOVDS:0EH,AXPUSHCSPOPDSPUSHCSPOPESRETSTAR:MOVSI,81HCLDCALLOVERSJNZSTAR1STAR0:MOVDX,OFFSETMESS1JMPSTAR4STAR1:CALLYVJGCALLUVILJBSTAR0MOVSAVESP,SPCALLSZYSMOVSP,SAVESPMOVDX,OFFSETMESS2JBSTAR4CALLCRLFCALLXUJGCALLBCJGMOVDX,OFFSETMESS3STAR4:MOVAH,9INT21HINT20HSAVESPDW0MESS1DB13,10,Syntax:,13,10DBJS10,13,10,$MESS2DBErrorinexpression!$MESS3DB13,10,$CODEENDSENDNEWSTAR