当前位置:文档之家› 汇编语言课程设计报告_实现加减乘除四则运算的计算器

汇编语言课程设计报告_实现加减乘除四则运算的计算器

汇编语言课程设计报告( 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小结 (5)参考文献 (6)附录 (7)附录源程序清单 (7)实现加减乘除四则运算的计算器1 概述1.1 设计目的本课程设计是在学完教学大纲规定的全部容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。

1.2 设计容能实现加、减、乘、除的计算;该程序接受的是16进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:c:\tasm>js 3+252 系统需求分析2.1 系统目标本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。

比如,十进制数的加减乘除四则运算。

我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。

此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。

2.2 主体功能系统分析主要包括设计的功能分析和系统的流程,功能分析放在首位,每一个软件都要能满足一定的功能才有使用价值。

根据功能需求来创建应用程序。

本设计的功能如下:1、输入2个数,先判断是加减运算还是乘除运算,再进行计算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 界面设置通过定义数据段,利用09H显示出功能列表。

通过定义数据段,以字符串的形式输入每个提示信息,利用09H键盘输入并回显命令显示每一个功能提示,是计算器的功能列表有序清晰的显示在屏幕上。

4.2 选择算法设置首先选择要进行的四则运算,若选择1,则进行加法;若选择2,则进行减法;若选择3,则进行乘法;若选择4,则进行除法。

加法:先输入第一个小于4位十六进制数存入SI中,在输入第二个小于4位十六进制数存入BX中,然后显示BX 和[SI]中的容相加存在BX中。

减法:先输入第一个小于4位十六进制数存入SI中,在输入第二个小于4位十六进制数存入BX中,然后显示BX 和[SI]中的容相减存在BX中,然后用NEG来求反,即为第一个数减去第二个数的差,显示BX的容即为差。

乘法:先输入第一个小于4位十六进制数存入SI中,在输入第二个小于4位十六进制数存入BX中,把BX的值给AX,然后让AX乘以[SI],然后再分别将DX,AX中的容赋给BX,接着依次显示DX,AX的容,即为积。

除法:先输入第一个小于4位十六进制数存入SI中,在输入第二个小于4位十六进制数存入BX中,将[SI]赋给AX作被除数,让BX作除数,得到的商存放在AX中,余数放在DX中,然后依次赋给BX,将其依次显示即为商。

4.3 十进制转换设置要完成十进制转换成十六,一般采用除十六取余法来完成,其大致过程如下:将待转换的数除以16得到第一个商和余数,此第一个余数就是所求的十六进制数的各位,再用第一个商除以16,得到第二个商和余数,此第二个余数就是所求十六进制数的十位,重复这一过程直至商为0,此时的余数就是所求十六进制数的最高位。

在存中分配一缓冲区,用来存放以上分离出来的使十进制数的每一位,然后再逐个转换成ASCII码,转换成ASCII码的过程很简单,就是给每个十六进制位加上30H即可,最后送显示器输出。

5 测试5.1 测试方案对程序源代码进行功能调试和功能验证。

程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进行分析。

当用户选择0时,输入Y或N决定是否退出程序。

5.2 测试结果输入数字进行加减乘除运算,计算结果如下图所示:图5.2.1 计算结果测试结束后,退出程序,如下图所示:图5.2.2 退出程序6 小结程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分。

本程序基本实现了四则运算的功能,但还没能实现带有括号的四则运算,还有在除法运算中不能运算较大的数,会产生溢出现象。

一开始的时候自己编出来的程序有很多问题,尤其是在循环程序上,因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行。

由于能力有限,程序还是有不完美的地方。

这次的综合实验让我对汇编有了更深刻的认识,对各种指令有了进一步的理解。

参考文献[1]其明.汇编语言程序设计教程. :中国矿业大学, 2010.11附录附录源程序清单IN16 MACRO ;完成从键盘接受二个数并转换为十六制数,第一个数由SI指向,第二个数存放在BX中LEA DX,PR ;DX指向PR换行CALL OUTPUT ;LEA DX,INPUT1 ;DX指向INPUT1,提示输入第一个数CALL OUTPUTCALL INPUT ;把输入的数存放在BX中LEA SI,RESULT ;SI指向RESULTMOV [SI],BX ;把第一个十六制数存入RESULT的第一个位置LEA DX,PR ;DX指向PR,换行CALL OUTPUTLEA DX,INPUT2 ;DX指向INPUT2,提示输入第一个数CALL OUTPUTCALL INPUT ;把输入的数存放在BX中ENDM ;宏结束DATA SEGMENT ;数据段BUF DB ' ',0DH,0AHDB '*------- WELCOME TO CALCULATOR SYSTEM ---------*',0DH,0AHDB '*---1:ADD--2:SUB--3:MUL--4:DIV--0:QUIT---------*',0DH,0AHDB '*---------- 2011*6*21---------------*',0DH,0AHDB 0DH,0AH,'Please input the choose number:','$'INPUT1 DB 'Please input the first number xiao yu 4 wei:','$'INPUT2 DB 'Please input the second number xiao yu 4 wei:','$'RESULT DW ?,? ;存放键盘输入的两个十六制数WRO DB 'You input the number 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 exit?(Y/N)$'DATA ENDS ;数据段落定义结束CODE SEGMENTMAIN PROC FAR ;主函数ASSUME CS:CODE ,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,BUF ;DX指向BUF换行CALL OUTPUT ;调用显示字符串函数换行SUB AX,AX ;AX清零CALL CHOOSE ;调用选择函数JMP START ;跳转到STARTRETMAIN ENDPINPUT PROC NEAR ;定义INPUT函数,就是将从键盘输入的数按原十六进制数存放在BX中MOV BX,0 ;BX清零NEWCHAR:MOV AH,1INT 21H ;接受键盘输入一个字符CMP AL,0DH ;输入的字符与回车比较JE EXIT ;是回车就结束CMP AL,'A' ;与A比较JAE H0 ;大于等于就跳转到H0CMP AL,'0' ;与0比较JAE H1 ;大于等于就跳转到H1H0:SUB AL,37H ;由于41-A=37,完成把字母字符转换成对应的十六进制数JMP ADDTO ;跳转到ADDTOH1:SUB AL,30H ;把0到9的字符转换成对应的十六进制数JMP ADDTO ;跳转到ADDTOADDTO:MOV CL,4 ;相当于让BX乘以16SHL BX,CL ;将BX逻辑左移MOV AH,0 ;将AX清零ADD BX,AX ;AX+BX送到BXJMP NEWCHAR ;跳转到NEWCHAR,把第二个输入的字符存放到BX的第二位EXIT: RETINPUT ENDPOUTPUT PROC NEAR ;显示字符串函数MOV AH,09HINT 21HRETOUTPUT ENDPCHOOSE PROC NEAR ;选择函数MOV AH,1 ;从键盘接受一个数INT 21HCMP 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 EXIT1 ;等于4就跳转到EXIT1,结束程序CALL WRONG ;如果不是0到4之间的数就提示出错EXIT1: LEA DX,PR ;DX指向PR换行CALL OUTPUTLEA DX,PR6 ;DX指向PR6,确认是否退出CALL OUTPUTMOV AH,1 ;从键盘接受一个数INT 21HCMP AL,'Y' ;与Y比较JE EXIT0 ;不是Y就看是否为yCMP AL,'y' ;与y比较JNE START ;不是y就跳转到STARTEXIT0:MOV AH,4CH ;结束本程序INT 21HYES1:CALL JIA ;调用JIA函数JMP START ;调用完之后跳转到STARTYES2:CALL JIAN ;调用JIAN函数JMP START ;调用完之后跳转到STARTYES3:CALL CHENG ;调用CHENG函数JMP START ;调用完之后跳转到STARTYES4:CALL CHU ;调用CHU函数RETCHOOSE ENDP ;选择函数结束WRONG PROC NEAR ;报错函数LEA DX,PR ;DX指向PR换行LEA DX,WRO ;DX指向WRO,提示输入有错,请重新输入JMP START ;跳转到STARTRETWRONG ENDP ;报错函数结束JIA PROC NEAR ;加法函数IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数由SI指向,第二个数存放在BX中ADD BX,[SI] ;把第一个数加第二个数存放到BX中LEA DX,PR ;DX指向PR,换行CALL OUTPUTLEA DX,PR1 ;DX指向PR1,显示‘A + B=’CALL OUTPUTCALL OUTBX ;调用显示BX寄存器的容函数RETJIA ENDP ;加法结束JIAN PROC NEAR ;减法函数IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数由SI指向,第二个数存放在BX中SUB BX,[SI] ;第二个数减第一个数,结果存放到BX中NEG BX ;对结果取反后才是A-B的值,才是第一个数减去第二个数LEA DX,PR ;DX指向PR,换行CALL OUTPUTLEA DX,PR2 ;DX指向PR2,显示‘A - B=’CALL OUTPUTCALL OUTBX ;调用显示BX寄存器的容RETJIAN ENDP ;加法函数结束CHENG PROC NEAR ;乘法函数IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数由SI指向,第二个数存放在BX中MOV DX,0 ;把DX清零MOV AX,BX ;把第二个数赋给AXMUL WORD PTR[SI] ;AX乘[SI]并把结果存放到DX,AX中,是字的操作MOV BX,AX ;将AX赋给BXPUSH BX ;将BX压栈,显示下面DX的容时要将DX的值赋给BXPUSH DX ;将DX压栈,因为下面要换行输出,会改变DX的值LEA DX,PR ;DX指向PR,换行输出CALL OUTPUTLEA DX,PR3 ;DX指向PR3,显示‘A * B=’CALL OUTPUTPOP DX ;将DX出栈,要将做乘法后DX的容显示出来MOV BX,DX ;把DX给BXCALL OUTBX ;显示DX的容POP BX ;将BX出栈CALL OUTBX ;显示AX的容RETCHENG ENDP ;乘法函数结束CHU PROC NEAR ;除法函数IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数SI指向,第二个数存放在BX中MOV AX,[SI] ;将第一个数赋给AXMOV DX,0 ;将DX清零DIV BX ;AX除BX,结果存放到DX,AX,DX存放余数,AX存放商PUSH DX ;压栈DXPUSH AX ;压栈AXLEA DX,PR ;DX指向PR,换行CALL OUTPUTLEA DX,PR4 ;DX指向PR4,显示‘A / B=’CALL OUTPUTPOP AX ;出栈AXMOV BX,AX ;将AX赋给BX,将商给BXCALL OUTBX ;显示AX寄存器的容,即显示商LEA DX,PR5 ;DX指向PR5,显示省略号CALL OUTPUTPOP DX ;出栈DXMOV BX,DX ;将DX赋给BX,即将余数赋给BX,CALL OUTBX ;显示DX寄存器的容,显示余数RETCHU ENDP ;除法函数结束OUTBX PROC NEAR ;显示BX寄存器的容函数MOV CH,4 ;CH等于4ROTATE:MOV CL,4 ;CL等于4ROL BX,CL ;将BX循环左移4位MOV AL,BL ;将BL赋给ALAND AL,0FH ;将AL的高位置0ADD AL,30H ;AL+30H可将AL变为对应的ASCII的值CMP AL,3AH ;判断是否是0-9之间JL PRINTIT ;是则跳转到PRINTITADD AL,7H ;是A-F再加上7HPRINTIT:MOV DL,AL ;将AL赋给DLMOV AH,2INT 21H ;显示ALDEC CH ;CH-1再赋给CHJNZ ROTATE ;CH!=0则跳转到ROTATERET ;CH=0则结束OUTBX ENDP ;显示寄存器BX容函数结束CODE ENDSEND MAIN。

相关主题