您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > 微机设计报告(四则运算器)
学院:班级:姓名:学号:课程设计题目:四则运算计算器课程名称:汇编语言与微机原理评阅成绩:评阅意见:成绩评定教师签名:日期:年月目录概述................................................................................................................................1一、设计要求................................................................................................................1二、设计思想................................................................................................................1三、程序工作原理........................................................................................................2四、程序流程图及说明................................................................................................3五、程序源代码............................................................................................................7六、程序运行示例......................................................................................................18七、设计过程中遇到的问题及解决方法..................................................................18八、设计心得..............................................................................................................19九、参考文献..............................................................................................................191四则运算计算器概述此计算器,可以实现从键盘输入一个十进制的四则运算表达式,如:-3+4*(5-6)-8/2,编程计算表达式的值,输出十进制结果。表达式和结果可以是三位或四位十进制,也可以是带负数的十进制数,并且+-*/()位置任意摆放(只要符合数学上的运算逻辑)。一、设计要求用汇编语言设计一个程序,用来实现计算器的四则运算功能。需要实现在屏幕要显示输入的表达式,以及运算结果。例如:-3+4*(5-6)-8/2计算表达式的结果,并将该表达式及结果显示出来;设计要求如下:(1)由键盘作为输入部分。(2)能进行四则混合运算,并且能计算带括号和负数的数学表达式。(3)按ESC键则退出计算器菜单界面并返回dos系统,否则继续输入表达式,求得对应的结果。二、设计思想根据题目的要求,可以把整个源程序大致划分六大步骤。(1)首先键盘输入合法中缀算术表达式,并将其存储到S1中。(2)然后调用子程序CHANGE将中缀式转化为后缀式。(3)调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中。(4)POPAX,AX-STORAGE,即用STORAGE存放最终运算结果。(5)调用子程序OUTPUT将运算结果输出。(6)通过用键盘输入ESC退出DOS程序。2三、程序工作原理步骤一的原理:此处用系统功能1号调用,每次从键盘输入一个字符,就将其存入到数组S1中,然后在判断此字符是否为回车,如果不是,则循环,继续输入字符,否则,程序往下执行。步骤二的原理:此处最核心的就是中缀表达式转化为后缀表达式的算法。具体思路为:用一个栈来存储与运算符号.先将字符’@’压入栈中,并假设其优先级为0.然后遍历S1中的字符,遇到数字直接存入S2中并且输完数字后向S2中输入一空格以备计算结果时用。遇到运算符则先判断其与栈顶运算符的优先级谁大。如果S1中运算符号优先级大,则此运算符号直接入栈;否则栈顶符号先出栈到S2,待栈顶符号优先级小于S1中符号时,S1中元素入栈。步骤三的原理:遍历S2中的字符,遇到空格,则将前面数字字符串转换成的数据压入栈中。遇到加号,从栈中弹出两个数据进行加法运算,并将运算结果压入栈中。遇到减号,从栈中弹出两个数据进行减法运算,并将运算结果压入栈中。遇到乘号,从栈中弹出两个数据进行乘法运算,并将运算结果压入栈中。遇到除号,从栈中弹出两个数据进行除法运算,并将运算结果压入栈中。整个字符串遍历完后,最终计算结果就保存在栈中。步骤四的原理:将栈中保存的最后运算结果弹出,并保存到STORAGE中。步骤五的原理:先判断运算结果是否为负数,如果是,将‘-‘存入数组N中,并对运算结果求补。然后判断数据所在范围,小于32767大于一万则将运算结果除以一万,并将商赋给数组N;然后将余数除以一千将商赋给数组N;再将余数除以一百并将商赋给数组N;再将余数除以十并将商赋给数组N;最终将余数赋给数组N。如果数据更小,也是如此实现,只是步骤更少些。步骤六的原理:通过RETOUTPUT语句跳转到CALLOUTPUT语句的下一条指令,执行NEXT1模块(判断键盘输入是否为ESC),若为ESC的话跳转到EXIT模块从而退出程序。3四、程序流程图及说明程序总流程图:(二)调用子程序CHANGE将中缀式转化为后缀式(三)调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中(四)POPAX,AX-》STORAGE即用STORAGE存存放最终运算结果(五)调用子程序OUTPUT将运算结果输出结束开始(一)、从键盘输入合法中缀算术表达式并将其存储到S1中以回车符号作为结束符号每个数后放置一格按位从高位到低位一位一位的输出遇到空格则将之前的数据压入栈中,遇到运算符则从栈中弹出两数据进行运算4中缀表达式转化为后缀表达式的流程图:开始0-SI;0-DI;0-AHPUSHDIS1[SI]-ALAL=’(‘PUSHAX再将0放入栈中,如果之后的第一个字符为‘-’,则将0放入S2[DI]中AL=0DH如果第一个字符为‘-’,则要先将0存入S2[DI]中在进行其他处理AL=‘)’将栈中运算符逐一出栈到S2[DI]中,遇到左括号停止,并将其弹出AL=’0'直接将其存入S2[DI]中,遇到ASCCI小于‘0’时则将空格放入S2[DI]中AL=‘+’用01与栈顶数值比较,大于则入栈,否则栈中算符出栈到S2[DI]中,直到大于时再入栈,,最后将01压入栈中AL=‘-’用01与栈顶数值比较,大于则入栈,否则栈中算符出栈到S2[DI]中,直到大于时再入栈,,最后将01压入栈中AL=‘*’用02与栈顶数值比较,大于则入栈,否则栈中算符出栈到S2[DI]中,直到大于时再入栈,,最后将02压入栈中AL=‘/’用02与栈顶数值比较,大于则入栈,否则栈中算符出栈到S2[DI]中,直到大于时再入栈,,最后将02压入栈中YYNYNYNYN结束YNYNYNN其每次向S2中输入一个字符,DI就会加1。当压入‘(’后,再压入0作为运算符优先级的判断;当压入‘+’或‘-’后,再压入01作为运算符优先级的判断;当压入‘*’或‘/’后,再压入02作为运算符优先级的判断。5计算后缀表达式数值的流程图:开始0-DI;0-AH;S2[DI]-AL;AL=0DHAL=’‘AL=‘+’将前面的一连串数字字符转化为相应的数值并将最终结果压入栈中AL=‘-’AL=‘*’AL=‘/’栈中弹出两个数据进行加运算,并将最终结果压入栈中栈中弹出两个数据进行减运算,并将最终结果压入栈中栈中弹出两个数据进行乘运算,并将最终结果压入栈中栈中弹出两个数据进行除运算,并将最终结果压入栈中结束NYNYNYNYNYYN当遇到数字字符时,将其转为相应的数值,若其后字符的ASCII值不小于‘0’,则前面数值乘10再加上这个字符对应的数值,直到遇到空格为止6输出运算结果程序的流程图:开始0-SI;STORAGE-AX;0-DXAX0NEGAX;‘-’-N[SI]AX10000AX1000AX=100AX=10AX=0DX、AX除以10000;AX-N[SI];DX-AXDX、AX除以1000;AX-N[SI];DX-AXDX、AX除以100;AX-N[SI];DX-AXDX、AX除以100;AX-N[SI];DX-AXAX-N[SI];结束YNYYNYYNAX=10000AX=1000AX=100AX-N[SI]AX-N[SI]AX-N[SI]NYYNNYNNYN7五、程序源代码DATASEGMENTS1DB60DUP(?),'$';存储输入的中缀表达式子S2DB60DUP(?),'$';存储后缀表达式子NDB10DUP(?),'$';存储要输出的数字字符串STORAGEDW?,'$';存储运算结果BUF0DB0dh,0ahDB'**************************************************',0dh,0ahDB'****',0dh,0ahDB'**Fourarithmeticoperationcalculator**',0dh,0ahDB'**Thisprogramisdesignedby**',0dh,0ahDB'**Wangyuli200941843302**',0dH,0ahDB'****',0dh,0ahDB'**************************************************',0dh,0ahDB'Pleaseinput+,-,*,/,()expression',0dh,0ah,'$';BUF1DB0AH,0DH,'***Expressionerror!***$'DATAENDSSTACKSEGMENTSTACKDB40DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETBUF0;输出字符串MOVAH,9;BUF0,提示输入表达式INT21HMOVSI,0;输入的第一个数为负数的处理方法MOVAH,1INT21H8CMPAL,'-'JNELL;如果AL不等于-号则跳转到LLMOVS1[SI],'0'INCSILL:MOVS1[SI],AL;将AL的内容传送到偏移地址为SI+S1(相对基址变址寻址)的储存单元INCSILLL:MOVAH,1;循环输入表达式INT21HMOVS1[SI],ALINCSICMPAL,0DHJNELLLMOVDL,0AHMOVAH,2INT21HCALLCHANGE;调用中缀转后缀子程序CALLCALCULATE;调用计算后缀表达式子程序EXIT:MOVAH,4CHINT21HERROR:MOVDX,OFFSETBUF1;输出字符串MOVAH,9;BUF1,提示输入表达错误INT21HJMPNEXT1NEXT:POPAX;从AX中弹出一个数据CMPAX,'@';比较这个数据是否为@JENEXT1;是@则跳转到NEXT1MOVSTORAGE,AX;把AX赋给
本文标题:微机设计报告(四则运算器)
链接地址:https://www.777doc.com/doc-4553368 .html