微机设计报告(四则运算器).doc

上传人:仙人指路1688 文档编号:2882049 上传时间:2023-03-01 格式:DOC 页数:21 大小:841.50KB
返回 下载 相关 举报
微机设计报告(四则运算器).doc_第1页
第1页 / 共21页
微机设计报告(四则运算器).doc_第2页
第2页 / 共21页
微机设计报告(四则运算器).doc_第3页
第3页 / 共21页
微机设计报告(四则运算器).doc_第4页
第4页 / 共21页
微机设计报告(四则运算器).doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《微机设计报告(四则运算器).doc》由会员分享,可在线阅读,更多相关《微机设计报告(四则运算器).doc(21页珍藏版)》请在三一办公上搜索。

1、 学 院: 班 级: 姓 名: 学 号: 课程设计题目:四则运算计算器课程名称:汇编语言与微机原理评阅成绩:评阅意见:成绩评定教师签名:日期: 年 月 目 录概述1一、设计要求1二、设计思想1三、程序工作原理2四、程序流程图及说明3五、程序源代码7六、程序运行示例18七、设计过程中遇到的问题及解决方法18八、设计心得19九、参考文献19四则运算计算器概述此计算器,可以实现从键盘输入一个十进制的四则运算表达式,如:-3+4*(5-6)-8/2,编程计算表达式的值,输出十进制结果。表达式和结果可以是三位或四位十进制,也可以是带负数的十进制数,并且*/()位置任意摆放(只要符合数学上的运算逻辑)。一

2、、设计要求用汇编语言设计一个程序,用来实现计算器的四则运算功能。需要实现在屏幕要显示输入的表达式,以及运算结果。例如:-3+4*(5-6)-8/2计算表达式的结果,并将该表达式及结果显示出来; 设计要求如下:(1)由键盘作为输入部分。(2)能进行四则混合运算,并且能计算带括号和负数的数学表达式。(3)按 ESC 键则退出计算器菜单界面并返回 dos 系统,否则继续输入表达式,求得对应的结果。二、设计思想根据题目的要求,可以把整个源程序大致划分六大步骤。(1) 首先键盘输入合法中缀算术表达式,并将其存储到S1中。(2) 然后调用子程序CHANGE将中缀式转化为后缀式。(3) 调用子程序CALCU

3、LATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中。(4) POP AX,AX-STORAGE,即用STORAGE 存放最终运算结果。(5) 调用子程序OUTPUT将运算结果输出。(6) 通过用键盘输入ESC退出DOS程序。三、程序工作原理步骤一的原理:此处用系统功能1号调用,每次从键盘输入一个字符,就将其存入到数组S1中,然后在判断此字符是否为回车,如果不是,则循环,继续输入字符,否则,程序往下执行。步骤二的原理:此处最核心的就是中缀表达式转化为后缀表达式的算法。具体思路为:用一个栈来存储与运算符号.先将字符压入栈中,并假设其优先级为0.然后遍历S1中的字符,遇到数字直接存入S2

4、中并且输完数字后向S2中输入一空格以备计算结果时用。遇到运算符则先判断其与栈顶运算符的优先级谁大。如果S1中运算符号优先级大,则此运算符号直接入栈;否则栈顶符号先出栈到S2,待栈顶符号优先级小于S1中符号时,S1中元素入栈。步骤三的原理:遍历S2中的字符,遇到空格,则将前面数字字符串转换成的数据压入栈中。遇到加号,从栈中弹出两个数据进行加法运算,并将运算结果压入栈中。遇到减号,从栈中弹出两个数据进行减法运算,并将运算结果压入栈中。遇到乘号,从栈中弹出两个数据进行乘法运算,并将运算结果压入栈中。遇到除号,从栈中弹出两个数据进行除法运算,并将运算结果压入栈中。整个字符串遍历完后,最终计算结果就保存

5、在栈中。步骤四的原理:将栈中保存的最后运算结果弹出,并保存到STORAGE中。步骤五的原理:先判断运算结果是否为负数,如果是,将-存入数组N中,并对运算结果求补。然后判断数据所在范围,小于32767大于一万则将运算结果除以一万,并将商赋给数组N;然后将余数除以一千将商赋给数组N;再将余数除以一百并将商赋给数组N;再将余数除以十并将商赋给数组N;最终将余数赋给数组N。如果数据更小,也是如此实现,只是步骤更少些。步骤六的原理:通过RET OUTPUT语句跳转到CALL OUTPUT语句的下一条指令,执行NEXT1模块(判断键盘输入是否为ESC),若为ESC的话跳转到EXIT模块从而退出程序。四、程

6、序流程图及说明程序总流程图:中缀表达式转化为后缀表达式的流程图: 其每次向S2中输入一个字符,DI就会加1。当压入 (后,再压入0作为运算符优先级的判断;当压入+或-后,再压入01作为运算符优先级的判断;当压入*或/后,再压入02作为运算符优先级的判断。计算后缀表达式数值的流程图:输出运算结果程序的流程图:五、程序源代码DATA SEGMENTS1 DB 60 DUP(?),$ ;存储输入的中缀表达式子S2 DB 60 DUP(?),$ ;存储后缀表达式子N DB 10 DUP(?),$ ;存储要输出的数字字符串STORAGE DW ?,$ ;存储运算结果BUF0 DB 0dh,0ahDB*,

7、0dh,0ahDB* *,0dh,0ahDB* Four arithmetic operation calculator *,0dh,0ahDB* This program is designed by *,0dh,0ahDB* Wangyuli 200941843302 *,0dH,0ahDB* *,0dh,0ahDB*,0dh,0ah DB Please input +,-,*,/,() expression,0dh,0ah,$;BUF1 DB 0AH,0DH,*Expression error!*$DATA ENDSSTACK SEGMENT STACK DB 40 DUP(?)STAC

8、K ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF0 ;输出字符串 MOV AH,9 ;BUF0,提示输入表达式 INT 21H MOV SI,0 ;输入的第一个数为负数的处理方法 MOV AH,1 INT 21H CMP AL,- JNE LL ;如果AL不等于-号则跳转到LL MOV S1SI,0 INC SI LL: MOV S1SI,AL ;将AL的内容传送到偏移地址为SI+S1(相对基址变址寻址)的储存单元 INC SI LLL: MOV AH

9、,1 ;循环输入表达式 INT 21H MOV S1SI,AL INC SI CMP AL,0DH JNE LLL MOV DL,0AH MOV AH,2 INT 21H CALL CHANGE ;调用中缀转后缀子程序 CALL CALCULATE ;调用计算后缀表达式子程序EXIT: MOV AH,4CH INT 21H ERROR:MOV DX,OFFSET BUF1 ;输出字符串 MOV AH,9 ;BUF1,提示输入表达错误 INT 21H JMP NEXT1 NEXT : POP AX ;从AX中弹出一个数据 CMP AX, ;比较这个数据是否为 JE NEXT1 ;是则跳转到NEX

10、T1 MOV STORAGE,AX ;把AX赋给STORAGE CALL OUTPUT ;调用输出运算结果子程序NEXT1: MOV AH,7 ;从键盘输入一个字符不回显 INT 21H CMP AL,1BH ;判断这个字符是否为ESC JE EXIT CHANGE PROC NEAR ;中缀表达式转换为 MOV AH,0 ;后缀表达式的子程序 MOV DH,0 MOV SI,0 MOV DI,0 PUSH DI CHA: MOV AL,S1SI ;数组元素的个数读入AL中 INC SI CMP AL,0DH JE a CMP AL,( JE L1 ;AL等于(跳转到L1 CMP AL,+ J

11、E L2 CMP AL,- JE L3 CMP AL,* JE L4 CMP AL,/ JE L5 CMP AL,) JE b CMP AL,0 JGE c ;AL大于或等于0转移到c JMP ERROR ;跳转到ERROR模块 L1: PUSH AX ;对左括号的处理 MOV AX,0 PUSH AX CMP S1SI,- JNE CHA MOV S2DI,0 INC DI MOV S2DI, INC DIL2: MOV BP,SP ;对加法的处理 MOV DL,BP CMP DL,01H JGE L21 PUSH AX MOV DX,0101H PUSH DX JMP CHAL21: PO

12、P DX POP BX MOV S2DI,BL INC DI JMP L2 e: JE NEXTL3: MOV BP,SP ;对减法的处理 MOV DX,BP CMP DL,01H JGE L31 PUSH AX MOV DX,0201H PUSH DX JMP CHAL31: POP DX POP BX MOV S2DI,BL INC DI ;DI自加1 JMP L3b: JE L6a:JE L8L4: MOV BP,SP ;对乘法的处理 MOV DX,BP CMP DL,02H JGE L41 PUSH AX MOV DX,0302H PUSH DX JMP CHAL41: POP DX

13、POP BX MOV S2DI,BL INC DI JMP L4c:JGE L7 L5: MOV BP,SP ;对除法的处理 MOV DX,BP CMP DL,02H JGE L51 PUSH AX MOV DX,0402H PUSH DX JMP CHAL51: POP DX POP BX MOV DS:S2DI,BL INC DI JMP L5d: JE eL6: MOV BP,SP ;对右括号的处理 CMP BYTE PTR BP,0 JNE L61 POP DX POP AX JMP CHAL61: POP DX POP BX MOV S2DI,BL INC DI JMP L6 L7:

14、 CMP AL,9 ;对数字的处理 JLE L71L71: MOV S2DI,AL INC DI CMP BYTE PTR S1SI,0 JGE L72 MOV AL, MOV S2DI,AL INC DI JMP CHA L72:CMP BYTE PTR S1SI,9 JLE L73 ;S1SI小于等于9跳转到L73L73: MOV AL,SI INC SI JMP L71 L8: MOV BP,SP CMP BYTE PTR BP,0 JG L81 POP AX JMP L9L81: POP DX POP BX MOV S2DI,BL INC DI JMP L8 L9: MOV S2DI,

15、0DH RETCHANGE ENDPCALCULATE PROC NEAR ;计算后缀表达式子程序 MOV SI,0 MOV DI,0 MOV AH,0 MOV BX, PUSH BXCAL: MOV AL,S2DI INC DI CMP AL,0DH JE d CMP AL, JE CAL CMP AL,+ JE F1 CMP AL,- JE F2 CMP AL,* JE F3 CMP AL,/ JE F4 CMP AL,0 JGE F5 JMP ERRORF5: CMP AL,9 JLE F51F51: MOV DL,AL AND DL,0FH MOV BL,10 MOV AL,0F52:

16、IMUL BL ADD AL,DL CMP BYTE PTR S2DI, JNE F53 PUSH AX JMP CALF53:MOV DL,S2DI INC DI AND DL,0FH JMP F52 F4: POP DX ;除法运算 POP AX IDIV DL AND AX,000FH PUSH AX JMP CALF3: POP DX ;乘法运算 POP AX IMUL DL PUSH AX JMP CALF2: POP DX ;减法运算 POP AX SUB AX,DX PUSH AX JMP CALF1: POP AX ;加法运算 POP DX ADD AX,DX PUSH AX

17、JMP CAL RETCALCULATE ENDPOUTPUT PROC NEAR ;输出运算结果子程序 MOV SI,0 MOV AX,STORAGE CMP AX,0 JGE C1 NEG AX ;取AX的补码 MOV NSI,- ;将-存入数组N中 INC SIC1: CMP AX,10000 ;大于等于一万则跳转到C11 JGE C11 CMP AX,1000 ;大于等于1000则跳转到C12 JGE C12 CMP AX,100 ;大于等于100则跳转到C2 JGE C2 CMP AX,10 ;大于等于10则跳转到C3 JGE C3 CMP AX,0 JGE C4C11: MOV D

18、X,0 MOV BX,10000 IDIV BX ;运算结果除以一万,并将商赋给数组N ADD AL,30H MOV DS:NSI,AL INC SI MOV AX,DX JMP C1C12: MOV DX,0 MOV BX,1000 ;运算结果除以一千,并将商赋给数组N IDIV BX ADD AL,30H MOV DS:NSI,AL INC SI MOV AX,DX JMP C1C2: MOV CL,100 ;运算结果除以一百,并将商赋给数组N IDIV CL ADD AL,30H MOV DS:NSI,AL INC SI MOV AL,AH MOV AH,0 JMP C1C3: MOV

19、CL,10 ;运算结果除以一十,并将商赋给数组N IDIV CL ADD AL,30H MOV DS:NSI,AL INC SI MOV AL,AH MOV AH,0 JMP C1C4: ADD AL,30H MOV NSI,AL INC SI JMP C0C0:LEA DX,N MOV AH,9 INT 21HRET ;返回到CALL OUTPUT后的下一条指令OUTPUT ENDP CODE ENDSEND START六、程序运行示例以下是输入一个带括号的四则混合运算表达式输出的结果:以下是输入一个带负数的四则混合运算表达式输出的结果:以下是输入高位十进制的四则混合运算表达式的输出结果:以

20、下是输入错误符号后报错,然后按ESC退出的结果:七、设计过程中遇到的问题及解决方法(1)在这次设计过程中用到的工具是MASM5,在这个编程环境下使用JE,JMP,JGE之类的语句不能跳转太长,很容易超出范围。所以只有在中途设置个跳转中转函数。例如设置中转函数为a,要跳到L8,先JMP 到a,然后a在JMP到L8。(2)在设计中缀表达式怎么转换成后缀表达式遇到了算术符号优先权的问题,后面通过一个栈来存放运算符,然后给每种运算符设定一个优先级别,例如,+、-为01,*、/为02。然后通过与S1中的字符串比较优先权,根据优先权的大小弹出响应的运算符参与数据运算。(3)考虑到计算器怎么才能实现带负数的

21、运算,先判断运算结果是否为负数,如果是,将-存入数组N中,并对运算结果求补。(4)最后碰到了怎么实现通过按ESC键退出程序,因为程序已经编译完成,应该怎么加入ESC退出语句?我在程序末尾用了一个RET OUTPUT指令,程序运行完成输入结果后自动跳转到调用CALL OUTPUT这条语句的下一条指令,然后在这条语句下面编写了验证是否从键盘输入ESC的NEXT1模块,再从NEXT1模块跳转到EXIT退出模块。八、设计心得在做此课程设计之前我用数据结构将中缀表达式转换为后缀表达式,并用后缀表达式计算出表达式结果,那容易,但要转化为汇编语言确实遇到些困难:首先遇到的问题是如何判断运算符号的优先级;其次

22、遇到的问题是如何输出一个负数;再一个就是该如何输入一个负数;还有就是如何输出两位及两位以上的数据。但一切困难在经过努力思考后都解决了。只是每解决一个大问题耗去了我非常多的时间与精力。在中缀表达式转为后缀表达式及对后缀表达式子进行计算时用了很多标号,之前我想都不敢想。虽然当时总体思路有,但想到要用这么多标号,又有些怀疑自己。现在看来,编程时有想法就要大胆的尝试,不要怕麻烦,尤其是对于汇编语言。我这次编程是先搞需求分析,将程序分成几个功能模块,然后将功能一个一个地实现,这是一种比较好也比较快的编程方法,我感受到了分模块编程的的好处。编程时也要能够坚持,有时候一个功能在很短的时间内就能实现,但有的一天也弄不出来。在编程不顺意的时候,坚持、不浮躁将让我们的付出得到最好的回报。九、参考文献1、严蔚敏、吴伟民,数据结构辅(C语言版),清华大学出版社,19972、杨居义,微机原理与接口技术项目教程,清华大学出版社,20103、卜艳萍、周伟,汇编语言程序设计教程(第二版),清华大学出版社,2007

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号