汇编语言程序设计————计算器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程设计说明书题目:表达式计算器学号:班级:计算机创新实验班姓名:廖福轩目录一.设计内容.............................................2二.设计方案.............................错误!未定义书签。1.主程序模块..........................错误!未定义书签。2.赋权值模块..........................错误!未定义书签。3.加减乘除运算子程序模块..............错误!未定义书签。4.调用赋权宏子程序模块................错误!未定义书签。5.回车换行宏模块......................错误!未定义书签。号功能显示字符串宏模块................................2三.设计框图.............................................3四.程序代码.............................................4五.运行结果.............................错误!未定义书签。六.设计总结.............................错误!未定义书签。计算器汇编语言程序设计一.设计内容从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。并要求程序能反复执行直道对“还要继续吗(y/n)”之类的提示回答“n”或“N”为止。四则运算主要包括以下几个模块:(1)主程序模块.(2)赋权宏模块.(3)加减乘除运算子程序模块.(4)调用赋权宏子程序模块.(5)回车换行宏模块.(6)9号功能显示字符串宏模块.二.设计方案1.主程序模块.主程序初始化数据段,调用显示宏show显示界面,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.2.赋权宏模块.通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.3.加减乘除运算子程序模块.运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.4.调用赋权宏子程序模块.该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.5.回车换行宏模块.通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.号功能显示字符串宏模块.通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。三.设计框图四.程序代码DATASSEGMENTSTR1DB0AH,0DH,'*******************************************$'开始加载数据段附加段显示界面input输入数字或字符输入的是=,数字,符号SIGN1=0保存数字显示错误=数字符号SIGN2=0ny下移2位将SIGN1赋0设优先级,并判断是何符号ny根据符号决定运算,将值存入numbOutput通过2号功能显示结果是否继续结束ynDi+2取number,operator的偏移地址STR2DB13,10,'*12345*$'STR3DB13,10,'*67890*$'STR4DB13,10,'*+-*/=*$'STR5DB0AH,0DH,'*******************************************$'STR6DB13,10,'PLEASEINPUTAFORMULA:$'STR7DB'CONTINUE(Y/N)$'SIGN1DW0;值为0代表输入的不是数字,为1代表输入的是数字SIGN2DW0;值为0代表输入的符号是匹配的,为1输入的符号不匹配NUMBERDW20DUP(0);保存输入的数值OPERATORDB'$';判断输入的运算符是否为空DB10DUP(0);保存该运算符对应的权值ERRORDB'WRONG!$'DATASENDSSHOWMACROSTR;宏定义,显示字符串LEADX,STRMOVAH,9INT21HENDMFQMACROASCII,A,B;宏定义,给运算符赋权值CMPAL,ASCIIJNES&AMOVCH,BJMPS7ENDMHCHHMACRO;宏定义,回车换行MOVAH,2MOVDL,0DHINT21HMOVAH,2MOVDL,0AHINT21HENDMCODESSEGMENTMAINPROCFARASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEADI,NUMBERLEASI,OPERATORSHOWSTR1SHOWSTR2SHOWSTR3SHOWSTR4SHOWSTR5SHOWSTR6MOVAX,0MOVBX,0MOVCX,0MOVDX,0START1:HCHHINPUT:MOVAH,1INT21HCMPAL,'='JELET0CMPAL,28H;第二种情况,第一次输入的与28H也就是‘(’比较JBINPUT;小于28H=(则重新输入CMPAL,39HJAINPUT;大于39H=9则重新输入CMPAL,2FH;判断是数字还是符号JBELET1;是符号转入响应操作INCWORDPTRSIGN1;是数字的话将数字标志位加1SUBAL,30HMOVAH,0XCHGAX,[DI]MULBXMOVBX,10XCHGAX,[DI]ADD[DI],AXJMPINPUTCALLFUNRETMAINENDPFUNPROCNEAR;***********************************************************LET0:CMPWORDPTRSIGN2,0;判断配对标志位JELET1;经过左括号和右括号抵消为0则跳转JMPLET8;否则跳转到BC显示输入错误LET1:CMPWORDPTRSIGN1,0JELET2ADDDI,2;MOVWORDPTRSIGN1,0;将数字标志位复0LET2:CALLDYFQ;设定优先级CMPCH,5;判断输入的符号是否是左括号JNELET3;不是则判断输入的是否是右括号INCWORDPTRSIGN2;是左括号,括号标志位加1LET3:CMPCH,1;判断输入的是否是右括号JNELET4DECWORDPTRSIGN2;是右括号,括号标志位减1LET4:CMPBYTEPTR[SI],'$';判断运算符存储区是否为空JELET6CMPCH,[SI];[SI]的内容为前一个符号或其权值JALET6CMPBYTEPTR[SI],'('JNELET5DECSIJMPINPUTLET5:DECSIMOVCL,[SI]CALLYS;判断是什么运算符并进行相应的计算JMPLET4LET6:CMPCH,0;判断是否是等号JEOUTPUTCMPCH,1JEINPUT;“)”不保存,输入下一个数INCSIMOV[SI],AL;保存符号INCSICMPCH,5;判断是否是左括号JNELET7MOVCH,2;改变(的权值LET7:MOV[SI],CH;紧跟着保存符号的权值JMPINPUTLET8:LEADX,ERRORMOVAH,9INT21HJMPEXITRETFUNENDP;**********************************************************************DYFQPROC;子程序DYFQ调用宏FQ,判断优先级FQ28H,1,5;调用宏FQ为(赋权值S1:FQ29H,2,1;调用宏FQ为)赋权值S2:FQ2AH,3,4;调用宏FQ为*赋权值S3:FQ2FH,4,4;调用宏FQ为/赋权值S4:FQ2BH,5,3;调用宏FQ为+赋权值S5:FQ2DH,6,3;调用宏FQ为-赋权值S6:FQ3DH,7,0;调用宏FQ为=赋权值S7:RETDYFQENDP;*********************************************OUTPUT:;输出运算结果SUBDI,2CMPWORDPTR[DI],0JGEK1NEGWORDPTR[DI];求负数的绝对值MOVDL,'-'MOVAH,2INT21HK1:MOVBX,10000MOVCX,5MOVSI,0K2:MOVAX,[DI]CWDDIVBXMOV[DI],DXCMPAL,0JNEK3CMPSI,0JNEK3CMPCX,1JEK3JMPK4K3:MOVDL,ALADDDL,30HMOVAH,2INT21HMOVSI,1K4:MOVAX,BX;实现将10000变为1000,100,10MOVDX,0MOVBX,10DIVBXMOVBX,AXLOOPK2HCHHSHOWSTR7MOVAH,1INT21HCMPAL,'n';判断是否继续输入,输入n则结束操作JEEXITCMPAL,'N'JEEXITMOVWORDPTR[DI+2],0LEADI,NUMBERLEASI,OPERATORJMPSTART1EXIT:MOVAH,4CHINT21HYSPROCNEAR;子程序,进行相应的运算PUSHAXMOVAX,0MOVBX,0CMPCL,2AH;乘法运算JNECHUSUBDI,2XCHGBX,[DI]SUBDI,2XCHGAX,[DI]IMULBXMOV[DI],AXADDDI,2JMPFINISHCHU:CMPCL,2FH;除法运算JNEJIASUBDI,2XCHGBX,[DI]SUBDI,2XCHGAX,[DI]CWDIDIVBXMOV[DI],AXADDDI,2JMPFINISHJIA:CMPCL,2BH;加法运算JNEJIANSUBDI,2XCHGBX,[DI]SUBDI,2ADD[DI],BXADDDI,2JMPFINISHJIAN:CMPCL,2DH;减法运算JNEFINISHSUBDI,2XCHGBX,[DI]SUBDI,2SUB[DI],BXADDDI,2FINISH:POPAXRETYSENDP;**************************************************************CODESENDSENDSTART五.运行结果六.设计总结本次设计让我学到了很多关于汇编的知识,首先,本次设计是以四则运算为主题,通过在课堂上学习的基本知识和基本方法以及平时积累的知识和方法来实现对带符号数的加减乘除运算,在设计过程中,对我已有的知识进行了巩固,对我之前不太了解的知识有了一定的了解,通过亲身去编写程序,使得自己的实际动手能力得以增强。其次,通过本次设计,使我对模块化,结构化的程序设计方法掌握的更加透彻,再者,就是对于宏的定义,调用以及子程序的定义,调用的方法掌握的更加熟练。本次设计是要实现对有符号数的加减乘除等四则运算,程序开始先定义了显示界面的诸多字符串,经过显示界面,接下来,定义了判断数字和判断运算符的存储区,通过这两个存储区来判断当前位置输入的是数字还是运算符,然后,定义了保存数字和保存运算符的存储区,提示错误的字符串,显示宏,赋权宏,回车换行宏等,通过主程序对各个宏及子程序的调用,判断出输入的是数字还是运算符,若是运算符又是运算符中的哪类运算符,然后,进行加减乘除运算,最后将运算结果存入保存数

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功