《汇编语言课程设计报告——实现加减乘除四则运算的计算器11104.pdf》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告——实现加减乘除四则运算的计算器11104.pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-.-.可修编-汇编语言课程设计报告(2011-2012 年度第 2 学期)实现加减乘除四则运算的计算器 专业 计算机科学与技术 学生 班级 *指导教师 完成日期 -.-.可修编-目 录 目录 2 1 概述 1 1.1 设计目的 1 1.2 设计容 1 2 系统需求分析 1 2.1 系统目标 1 2.2 主体功能 1 2.3 开发环境 1 3 系统概要设计 2 3.1 系统的功能模块划分 2 3.2 系统流程图 3 4 系统详细设计 3 5 测试 4 5.1 测试方案 4 5.2 测试结果 4 6 小结 4 参考文献 5 附录 6 附录源程序清单 6.实现加减乘除四则运算的计算器 1 概 述
2、1.1 设计目的 本课程设计是在学完教学大纲规定的全部容、完成所有实践环节的根底上,旨在深化学生学习的汇编语言课程根本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。1.2 设计容 能实现加、减、乘、除的计算;该程序承受的是 16 进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:c:tasmjs 3+2 5 2 系统需求分析 2.1 系统目标 本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比方,十进制数的加减乘除四则运算。我们曾经学习过两个
3、具体数字进展加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进展运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进展输出,如何实现清屏等也是要解决的问题。2.2 主体功能 系统分析主要包括设计的功能分析和系统的流程,功能分析放在首位,每一个软件都要能满足一定的功能才有使用价值。根据功能需求来创立应用程序。本设计的功能如下:1、输入 2 个数,先判断是加减运算还是乘除运算,
4、再进展计算 2、判断符号是否为运算符 3、回车为换行符 4、用十进制或十六进制输出运算结果 2.3 开发环境 TASM5.0 集成环境-.-.可修编-3 系统概要设计 3.1 系统的功能模块划分 此题目实现的模块图如图 3-1 所示 图 3-1 概要模块(1)界面设置 主要实现确定界面样式的功能,以菜单形式显示。(2)选择算法设置 用于选择加、减、乘、除法来进展运算。(3)十进制转换设置 应用十进制的转换算法来处理加、减、乘、除法四则运算。四则运算计算器程序设计 界面设置 选择算法设置 十进制转换设置.3.2 系统流程图 图 3.2.1 四则运算计算器执行过程流程图 4 系统详细设计 4.1
5、界面设置 通过定义数据段,利用 09H 显示出功能列表。通过定义数据段,以字符串的形式输入每个提示信息,利用 09H 键盘输入并回显命令显示每一个功能提示,是计算器的功能列表有序清晰的显示在屏幕上。4.2 选择算法设置 首先选择要进展的四则运算,假设选择 1,则进展加法;假设选择 2,则进展减法;假设选择 3,则进展乘法;假设选择 4,则进展除法。加法:先输入第一个小于 4 位十六进制数存入 SI 中,在输入第二个小于 4 位十六进制数存入 B*中,然后显示 B*和SI中的容相加存在 B*中。减法:先输入第一个小于 4 位十六进制数输入选择键*=1*=2*=3*=4 十六进制加法 十六进制减法
6、 十六进制乘法 十六进制除法 提示出错!*=0是 是 是 否 是 否 否 否 否*=Y/y?否 是 是 开 始 结 束-.-.可修编-存入 SI 中,在输入第二个小于 4 位十六进制数存入 B*中,然后显示 B*和SI中的容相减存在 B*中,然后用 NEG 来求反,即为第一个数减去第二个数的差,显示B*的容即为差。乘法:先输入第一个小于 4 位十六进制数存入 SI 中,在输入第二个小于 4 位十六进制数存入 B*中,把 B*的值给 A*,然后让 A*乘以SI,然后再分别将 D*,A*中的容赋给 B*,接着依次显示 D*,A*的容,即为积。除法:先输入第一个小于 4 位十六进制数存入 SI 中,
7、在输入第二个小于 4 位十六进制数存入 B*中,将SI赋给 A*作被除数,让 B*作除数,得到的商存放在 A*中,余数放在 D*中,然后依次赋给 B*,将其依次显示即为商。4.3 十进制转换设置 要完成十进制转换成十六,一般采用除十六取余法来完成,其大致过程如下:将待转换的数除以 16 得到第一个商和余数,此第一个余数就是所求的十六进制数的各位,再用第一个商除以 16,得到第二个商和余数,此第二个余数就是所求十六进制数的十位,重复这一过程直至商为 0,此时的余数就是所求十六进制数的最高位。在存中分配一缓冲区,用来存放以上别离出来的使十进制数的每一位,然后再逐个转换成 ASCII 码,转换成 A
8、SCII 码的过程很简单,就是给每个十六进制位加上30H 即可,最后送显示器输出。5 测试 5.1 测试方案 对程序源代码进展功能调试和功能验证。程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进展分析。当用户选择 0 时,输入 Y 或 N 决定是否退出程序。5.2 测试结果 输入数字进展加减乘除运算,计算结果如下列图所示:图 5.2.1 计算结果 测试完毕后,退出程序,如下列图所示:图 5.2.2 退出程序 6 小结 程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个局部。本程序根本实现了四则运算的功能,但还没能实现带有括
9、号的四则运算,还有在除法运算中不能运算较大的数,会产生溢出现象。一开场的时候自己编出来的程序有很多问题,尤其是在循环程序上,因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行。由于能力有限,程序还是有不完美的地方。这次的综合实验让我对汇编有了更深刻的认识,对各种指令有了进一步的理解。.参考文献 1其明.汇编语言程序设计教程.:中国矿业大学,2010.11-.-.可修编-附 录 附录 源程序清单 IN16 MACRO ;完成从键盘承受二个数并转换为十六制数,第一个数由 SI 指向,第二个数存放在 B*中 LEA D*,PR ;D*指向 PR 换行 CALL OUTPUT ;L
10、EA D*,INPUT1 ;D*指向 INPUT1,提示输入第一个数 CALL OUTPUT CALL INPUT ;把输入的数存放在 B*中 LEA SI,RESULT ;SI 指向 RESULT MOV SI,B*;把第一个十六制数存入 RESULT 的第一个位置 LEA D*,PR ;D*指向 PR,换行 CALL OUTPUT LEA D*,INPUT2 ;D*指向 INPUT2,提示输入第一个数 CALL OUTPUT CALL INPUT ;把输入的数存放在 B*中 ENDM ;宏完毕 DATA SEGMENT ;数据段 BUF DB ,0DH,0AH DB*-WELE TO CA
11、LCULATOR SYSTEM-*,0DH,0AH DB*-1:ADD-2:SUB-3:MUL-4:DIV-0:QUIT-*,0DH,0AH DB*-2011*6*21-*,0DH,0AH DB 0DH,0AH,Please input the choose number:,$INPUT1 DB Please input the first number*iao yu 4 wei:,$INPUT2 DB Please input the second number*iao yu 4 wei:,$RESULT DW,;存放键盘输入的两个十六制数 WRO DB You input the numb
12、er is wrong,please input again:,0DH,0AH,$;PR DB 0DH,0AH,$;将光标移到下一行起始位置 PR1 DB A+B=$PR2 DB A-B=$PR3 DB A*B=$PR4 DB A/B=$.PR5 DB.$PR6 DB Are you sure e*it(Y/N)$DATA ENDS ;数据段落定义完毕 CODE SEGMENT MAIN PROC FAR ;主函数 ASSUME CS:CODE,DS:DATA START:MOV A*,DATA MOV DS,A*LEA D*,BUF ;D*指向 BUF 换行 CALL OUTPUT ;调用显
13、示字符串函数换行 SUB A*,A*;A*清零 CALL CHOOSE ;调用选择函数 JMP START ;跳转到 START RET MAIN ENDP INPUT PROC NEAR ;定义 INPUT 函数,就是将从键盘输入的数按原十六进制数存放在 B*中 MOV B*,0 ;B*清零 NEWCHAR:MOV AH,1 INT 21H ;承受键盘输入一个字符 CMP AL,0DH ;输入的字符与回车比拟 JE E*IT ;是回车就完毕 CMP AL,A ;与 A 比拟 JAE H0 ;大于等于就跳转到 H0 CMP AL,0 ;与 0 比拟 JAE H1 ;大于等于就跳转到 H1 H0
14、:SUB AL,37H ;由于 41-A=37,完成把字母字符转换成对应的十六进制数 JMP ADDTO ;跳转到 ADDTO H1:SUB AL,30H ;把 0 到 9 的字符转换成对应的十六进制数 JMP ADDTO ;跳转到 ADDTO ADDTO:MOV CL,4 ;相当于让 B*乘以 16 SHL B*,CL ;将 B*逻辑左移-.-.可修编-MOV AH,0 ;将 A*清零 ADD B*,A*;A*+B*送到 B*JMP NEWCHAR ;跳转到 NEWCHAR,把第二个输入的字符存放到 B*的第二位 E*IT:RET INPUT ENDP OUTPUT PROC NEAR ;显
15、示字符串函数 MOV AH,09H INT 21H RET OUTPUT ENDP CHOOSE PROC NEAR ;选择函数 MOV AH,1 ;从键盘承受一个数 INT 21H CMP AL,1 ;与 1 比拟 JE YES1 ;等于 1 就跳转到 YES1,进展加法 CMP AL,2 ;与 1 比拟 JE YES2 ;等于 2 就跳转到 YES2,进展减法 CMP AL,3 ;与 1 比拟 JE YES3 ;等于 3 就跳转到 YES2,进展乘法 CMP AL,4 ;与 1 比拟 JE YES4 ;等于 4 就跳转到 YES2,进展除法 CMP AL,0 ;与 0 比拟 JE E*IT
16、1 ;等于 4 就跳转到 E*IT1,完毕程序 CALL WRONG ;如果不是 0 到 4 之间的数就提示出错 E*IT1:LEA D*,PR ;D*指向 PR 换行 CALL OUTPUT LEA D*,PR6 ;D*指向 PR6,确认是否退出 CALL OUTPUT MOV AH,1 ;从键盘承受一个数 INT 21H CMP AL,Y ;与 Y 比拟 JE E*IT0 ;不是 Y 就看是否为 y CMP AL,y ;与 y 比拟 JNE START ;不是 y 就跳转到 START.E*IT0:MOV AH,4CH ;完毕本程序 INT 21H YES1:CALL JIA ;调用 JI
17、A 函数 JMP START ;调用完之后跳转到 START YES2:CALL JIAN ;调用 JIAN 函数 JMP START ;调用完之后跳转到 START YES3:CALL CHENG ;调用 CHENG 函数 JMP START ;调用完之后跳转到 START YES4:CALL CHU ;调用 CHU 函数 RET CHOOSE ENDP ;选择函数完毕 WRONG PROC NEAR ;报错函数 LEA D*,PR ;D*指向 PR 换行 LEA D*,WRO ;D*指向 WRO,提示输入有错,请重新输入 JMP START ;跳转到 START RET WRONG END
18、P ;报错函数完毕 JIA PROC NEAR ;加法函数 IN16 ;调用宏,承受键盘输入的两个十六进制数,第一个数由 SI 指向,第二个数存放在 B*中 ADD B*,SI ;把第一个数加第二个数存放到 B*中 LEA D*,PR ;D*指向 PR,换行 CALL OUTPUT LEA D*,PR1 ;D*指向 PR1,显示A+B=CALL OUTPUT CALL OUTB*;调用显示 B*存放器的容函数 RET JIA ENDP ;加法完毕 JIAN PROC NEAR ;减法函数 IN16 ;调用宏,承受键盘输入的两个十六进制数,第一个数由 SI 指向,第二个数存放在 B*中 SUB
19、B*,SI ;第二个数减第一个数,结果存放到 B*中 NEG B*;对结果取反后才是 A-B 的值,才是第一个数减去第二个数 LEA D*,PR ;D*指向 PR,换行-.-.可修编-CALL OUTPUT LEA D*,PR2 ;D*指向 PR2,显示A-B=CALL OUTPUT CALL OUTB*;调用显示 B*存放器的容 RET JIAN ENDP ;加法函数完毕 CHENG PROC NEAR ;乘法函数 IN16 ;调用宏,承受键盘输入的两个十六进制数,第一个数由 SI 指向,第二个数存放在 B*中 MOV D*,0 ;把 D*清零 MOV A*,B*;把第二个数赋给 A*MUL
20、 WORD PTRSI ;A*乘SI并把结果存放到 D*,A*中,是字的操作 MOV B*,A*;将 A*赋给 B*PUSH B*;将 B*压栈,显示下面 D*的容时要将 D*的值赋给 B*PUSH D*;将 D*压栈,因为下面要换行输出,会改变 D*的值 LEA D*,PR ;D*指向 PR,换行输出 CALL OUTPUT LEA D*,PR3 ;D*指向 PR3,显示A*B=CALL OUTPUT POP D*;将 D*出栈,要将做乘法后 D*的容显示出来 MOV B*,D*;把 D*给 B*CALL OUTB*;显示 D*的容 POP B*;将 B*出栈 CALL OUTB*;显示 A
21、*的容 RET CHENG ENDP ;乘法函数完毕 CHU PROC NEAR ;除法函数 IN16 ;调用宏,承受键盘输入的两个十六进制数,第一个数 SI 指向,第二个数存放在 B*中 MOV A*,SI ;将第一个数赋给 A*MOV D*,0 ;将 D*清零 DIV B*;A*除 B*,结果存放到 D*,A*,D*存放余数,A*存放商 PUSH D*;压栈 D*PUSH A*;压栈 A*.LEA D*,PR ;D*指向 PR,换行 CALL OUTPUT LEA D*,PR4 ;D*指向 PR4,显示A/B=CALL OUTPUT POP A*;出栈 A*MOV B*,A*;将 A*赋给
22、 B*,将商给 B*CALL OUTB*;显示 A*存放器的容,即显示商 LEA D*,PR5 ;D*指向 PR5,显示省略号 CALL OUTPUT POP D*;出栈 D*MOV B*,D*;将 D*赋给 B*,即将余数赋给 B*,CALL OUTB*;显示 D*存放器的容,显示余数 RET CHU ENDP ;除法函数完毕 OUTB*PROC NEAR ;显示 B*存放器的容函数 MOV CH,4 ;CH 等于 4 ROTATE:MOV CL,4 ;CL 等于 4 ROL B*,CL ;将 B*循环左移 4 位 MOV AL,BL ;将 BL 赋给 AL AND AL,0FH ;将 AL 的高位置 0 ADD AL,30H ;AL+30H 可将 AL 变为对应的 ASCII 的值 CMP AL,3AH ;判断是否是 0-9 之间 JL PRINTIT ;是则跳转到 PRINTIT ADD AL,7H ;是 A-F 再加上 7H PRINTIT:MOV DL,AL ;将 AL 赋给 DL MOV AH,2 INT 21H ;显示 AL DEC CH ;CH-1 再赋给 CH JNZ ROTATE ;CH!=0 则跳转到 ROTATE RET ;CH=0 则完毕 OUTB*ENDP ;显示存放器 B*容函数完毕 CODE ENDS END MAIN