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

上传人:大张伟 文档编号:5696528 上传时间:2020-07-23 格式:DOC 页数:12 大小:58KB
返回 下载 相关 举报
汇编语言程序设计————计算器.doc_第1页
第1页 / 共12页
汇编语言程序设计————计算器.doc_第2页
第2页 / 共12页
汇编语言程序设计————计算器.doc_第3页
第3页 / 共12页
汇编语言程序设计————计算器.doc_第4页
第4页 / 共12页
汇编语言程序设计————计算器.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《汇编语言程序设计————计算器.doc》由会员分享,可在线阅读,更多相关《汇编语言程序设计————计算器.doc(12页珍藏版)》请在三一文库上搜索。

1、课程设计说明书题目: 表达式计算器 学号:41212241班级: 计算机创新实验班姓名:廖福轩 目录一设计内容2二设计方案21.主程序模块.22.赋权值模块.23.加减乘除运算子程序模块.24.调用赋权宏子程序模块.25.回车换行宏模块.26.9号功能显示字符串宏模块.2三设计框图3四程序代码4五运行结果9六设计总结9计算器汇编语言程序设计一设计内容从键盘输入一个十进制两位数的四则运算表达式,如23*56(8*19)/6678,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),*/位置任意。并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。四则

2、运算主要包括以下几个模块:(1) 主程序模块.(2) 赋权宏模块.(3) 加减乘除运算子程序模块.(4) 调用赋权宏子程序模块.(5) 回车换行宏模块.(6) 9号功能显示字符串宏模块.二设计方案1.主程序模块.主程序初始化数据段,调用显示宏show显示界面,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.2.赋权宏模块.通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入

3、ch中.3.加减乘除运算子程序模块.运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.4.调用赋权宏子程序模块.该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.5.回车换行宏模块.通过2号功能的输出功能,将0d

4、h赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.6.9号功能显示字符串宏模块.通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。三设计框图开始加载数据段附加段显示界面input输入数字或字符输入的是=,数字,符号?SIGN1=0?保存数字显示错误=数字符号SIGN2=0?ny下移2位将SIGN1赋0设优先级,并判断是何符号ny根据符号决定运算,将值存入numbOutput通过2号功能显示结果是否继续?结束ynDi+2取number,operator的偏移地址四程序代码DATAS SEGMENT STR1 DB 0AH,0DH,*$ STR2 DB

5、13,10, * 1 2 3 4 5 *$ STR3 DB 13,10, * 6 7 8 9 0 *$ STR4 DB 13,10, * + - * / = *$ STR5 DB 0AH,0DH,*$ STR6 DB 13,10, PLEASE INPUT A FORMULA: $ STR7 DB CONTINUE(Y/N)?$ SIGN1 DW 0 ;值为0代表输入的不是数字,为1代表输入的是数字 SIGN2 DW 0 ;值为0代表输入的符号是匹配的,为1输入的符号不匹配 NUMBER DW 20 DUP(0) ;保存输入的数值 OPERATOR DB $ ;判断输入的运算符是否为空 DB

6、10 DUP(0) ;保存该运算符对应的权值 ERROR DB WRONG!$ DATAS ENDSSHOW MACRO STR ;宏定义,显示字符串 LEA DX,STR MOV AH,9 INT 21H ENDMFQ MACRO ASCII,A,B ;宏定义,给运算符赋权值 CMP AL,ASCII JNE S&A MOV CH,B JMP S7 ENDMHCHH MACRO ;宏定义,回车换行 MOV AH,2 MOV DL,0DH INT 21H MOV AH,2 MOV DL,0AH INT 21H ENDM CODES SEGMENT MAIN PROC FAR ASSUME CS

7、:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX LEA DI,NUMBER LEA SI,OPERATOR SHOW STR1 SHOW STR2 SHOW STR3 SHOW STR4 SHOW STR5 SHOW STR6 MOV AX,0 MOV BX,0 MOV CX,0 MOV DX,0 START1: HCHHINPUT: MOV AH,1 INT 21H CMP AL,= JE LET0 CMP AL,28H ;第二种情况,第一次输入的与28H也就是(比较 JB INPUT ;小于28H=(则重新输入 CMP AL,39H JA INPU

8、T ;大于39H=9则重新输入 CMP AL,2FH ;判断是数字还是符号 JBE LET1 ;是符号转入响应操作 INC WORD PTR SIGN1 ;是数字的话将数字标志位加1 SUB AL,30H MOV AH,0 XCHG AX,DI MUL BX MOV BX,10 XCHG AX,DI ADD DI,AX JMP INPUT CALL FUNRETMAIN ENDP FUN PROC NEAR;*LET0: CMP WORD PTR SIGN2,0;判断配对标志位 JE LET1 ;经过左括号和右括号抵消为0则跳转 JMP LET8 ;否则跳转到BC显示输入错误LET1:CMP

9、WORD PTR SIGN1,0 JE LET2 ADD DI,2 ; MOV WORD PTR SIGN1,0 ;将数字标志位复0LET2:CALL DYFQ ;设定优先级 CMP CH,5 ;判断输入的符号是否是左括号 JNE LET3 ;不是则判断输入的是否是右括号 INC WORD PTR SIGN2 ;是左括号,括号标志位加1LET3: CMP CH,1 ;判断输入的是否是右括号 JNE LET4 DEC WORD PTR SIGN2 ;是右括号,括号标志位减1 LET4: CMP BYTE PTRSI,$ ;判断运算符存储区是否为空 JE LET6 CMP CH,SI ;SI的内容

10、为前一个符号或其权值 JA LET6 CMP BYTE PTRSI,( JNE LET5 DEC SI JMP INPUTLET5: DEC SI MOV CL,SI CALL YS ;判断是什么运算符并进行相应的计算 JMP LET4 LET6: CMP CH,0 ;判断是否是等号 JE OUTPUT CMP CH,1 JE INPUT ;“)”不保存,输入下一个数 INC SI MOV SI,AL ;保存符号 INC SI CMP CH,5 ;判断是否是左括号 JNE LET7 MOV CH,2 ;改变(的权值LET7: MOV SI,CH ;紧跟着保存符号的权值 JMP INPUT LE

11、T8: LEA DX,ERROR MOV AH,9 INT 21H JMP EXIT RETFUN ENDP;*DYFQ PROC ;子程序DYFQ调用宏FQ,判断优先级 FQ 28H,1,5 ;调用宏FQ为(赋权值S1:FQ 29H,2,1 ;调用宏FQ为)赋权值S2:FQ 2AH,3,4 ;调用宏FQ为*赋权值S3:FQ 2FH,4,4 ;调用宏FQ为/赋权值S4:FQ 2BH,5,3 ;调用宏FQ为+赋权值S5:FQ 2DH,6,3 ;调用宏FQ为-赋权值S6:FQ 3DH,7,0 ;调用宏FQ为=赋权值S7:RETDYFQ ENDP;* OUTPUT: ;输出运算结果 SUB DI,2

12、 CMP WORD PTRDI,0 JGE K1 NEG WORD PTRDI ;求负数的绝对值 MOV DL,- MOV AH,2 INT 21HK1: MOV BX,10000 MOV CX,5 MOV SI,0K2: MOV AX,DI CWD DIV BX MOV DI,DX CMP AL,0 JNE K3 CMP SI,0 JNE K3 CMP CX,1 JE K3 JMP K4K3: MOV DL,AL ADD DL,30H MOV AH,2 INT 21H MOV SI,1K4: MOV AX,BX ;实现将10000变为1000,100,10 MOV DX,0 MOV BX,1

13、0 DIV BX MOV BX,AX LOOP K2 HCHH SHOW STR7 MOV AH,1 INT 21H CMP AL,n ;判断是否继续输入,输入n则结束操作 JE EXIT CMP AL,N JE EXIT MOV WORD PTRDI+2,0 LEA DI,NUMBER LEA SI,OPERATOR JMP START1EXIT: MOV AH,4CH INT 21HYS PROC NEAR ;子程序,进行相应的运算 PUSH AX MOV AX,0 MOV BX,0 CMP CL,2AH ;乘法运算 JNE CHU SUB DI,2 XCHG BX,DI SUB DI,2

14、 XCHG AX,DI IMUL BX MOV DI,AX ADD DI,2 JMP FINISHCHU: CMP CL,2FH ;除法运算 JNE JIA SUB DI,2 XCHG BX,DI SUB DI,2 XCHG AX,DI CWD IDIV BX MOV DI,AX ADD DI,2 JMP FINISHJIA: CMP CL,2BH ;加法运算 JNE JIAN SUB DI,2 XCHG BX,DI SUB DI,2 ADD DI,BX ADD DI,2 JMP FINISHJIAN: CMP CL,2DH ;减法运算 JNE FINISH SUB DI,2 XCHG BX,

15、DI SUB DI,2 SUB DI,BX ADD DI,2FINISH: POP AX RETYS ENDP;*CODES ENDS END START五运行结果六设计总结 本次设计让我学到了很多关于汇编的知识,首先,本次设计是以四则运算为主题,通过在课堂上学习的基本知识和基本方法以及平时积累的知识和方法来实现对带符号数的加减乘除运算,在设计过程中,对我已有的知识进行了巩固,对我之前不太了解的知识有了一定的了解,通过亲身去编写程序,使得自己的实际动手能力得以增强。其次,通过本次设计,使我对模块化,结构化的程序设计方法掌握的更加透彻,再者,就是对于宏的定义,调用以及子程序的定义,调用的方法掌握

16、的更加熟练。本次设计是要实现对有符号数的加减乘除等四则运算,程序开始先定义了显示界面的诸多字符串,经过显示界面,接下来,定义了判断数字和判断运算符的存储区,通过这两个存储区来判断当前位置输入的是数字还是运算符,然后,定义了保存数字和保存运算符的存储区,提示错误的字符串,显示宏,赋权宏,回车换行宏等,通过主程序对各个宏及子程序的调用,判断出输入的是数字还是运算符,若是运算符又是运算符中的哪类运算符,然后,进行加减乘除运算,最后将运算结果存入保存数字的存储区中,运用到显示输出模块将最后的运算结果显示出来,从而实现了对带符号数的四则运算功能。通过这次设计,我在汇编语言方面收获了很多东西,具体而言,在宏定义,宏调用和子程序定义,调用方面我学到了比以前更多的知识,尤其是通过子程序调用宏这种嵌套模式可以简化许多复杂的程序,让程序更加简洁易懂,此外,这次设计让我认识到了上课认真听讲的必要性,老师在课堂上讲解的许多知识都很重要,在本次设计中就充分体现了这一点,所以学好课堂老师讲解的知识是很有必要的。

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1