汇编语言课程设计报告——实现加减乘除四则运算的计算器汇总【范本模板】

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言课程设计报告( 2011 -- 2012 年度第2 学期)
实现加减乘除四则运算的计算器
专业计算机科学与技术
学生姓名
班级
学号
指导教师
完成日期
目录
目录 (1)
1概述 0
1.1 设计目的 0
1.2 设计内容 0
2系统需求分析 0
2。

1 系统目标 0
2.2 主体功能 0
2.3 开发环境 0
3 系统概要设计 (1)
3。

1 系统的功能模块划分 (1)
3.2 系统流程图 (2)
4系统详细设计 (2)
5测试 (3)
5.1 测试方案 (3)
5.2 测试结果 (3)
6小结 (4)
参考文献 (5)
附录 (6)
附录源程序清单 (6)
实现加减乘除四则运算的计算器
1 概述
1。

1 设计目的
本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力.
1。

2 设计内容
能实现加、减、乘、除的计算;该程序接受的是16进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:
c:\tasm〉js 3+2
5
2 系统需求分析
2。

1 系统目标
本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。

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

此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题.
2.2 主体功能
系统分析主要包括设计的功能分析和系统的流程,功能分析放在首位,每一个软件都要能满足一定的功能才有使用价值。

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

本设计的功能如下:
1、输入2个数,先判断是加减运算还是乘除运算,再进行计算
2、判断符号是否为运算符
3、回车为换行符
4、用十进制或十六进制输出运算结果
2。

3 开发环境
TASM5.0集成环境
汇编语言设计课程设计
3 系统概要设计
3.1 系统的功能模块划分
本题目实现的模块图如图3—1所示
图3-1 概要模块
(1)界面设置
主要实现确定界面样式的功能,以菜单形式显示。

(2)选择算法设置
用于选择加、减、乘、除法来进行运算。

(3)十进制转换设置
应用十进制的转换算法来处理加、减、乘、除法四则运算。

1
实现加减乘除四则运算的计算器
3.2 系统流程图
图3。

2。

1四则运算计算器执行过程流程图
4系统详细设计
4.1 界面设置
通过定义数据段,利用09H显示出功能列表。

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

4。

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

加法:先输入第一个小于4位十六进制数存入SI中,在输入第二个小于4位十六进制数存入BX中,然后显示BX 和[SI]
2
汇编语言设计课程设计
中的内容相加存在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 计算结果
3
实现加减乘除四则运算的计算器
测试结束后,退出程序,如下图所示:
图5。

2。

2 退出程序
6 小结
程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分。

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

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

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

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

4
汇编语言设计课程设计
参考文献
[1]刘其明.汇编语言程序设计教程。

徐州:中国矿业大学出版社, 2010。

11
5
实现加减乘除四则运算的计算器
附录
附录源程序清单
IN16 MACRO ;完成从键盘接受二个数并转换为十六制数,第一个数由SI指向,第二个数存放在BX中
LEA DX,PR ;DX指向PR换行
CALL OUTPUT ;
LEA DX,INPUT1 ;DX指向INPUT1,提示输入第一个数
CALL OUTPUT
CALL INPUT ;把输入的数存放在BX中
LEA SI,RESULT ;SI指向RESULT
MOV [SI],BX ;把第一个十六制数存入RESULT的第一个位置
LEA DX,PR ;DX指向PR,换行
CALL OUTPUT
LEA DX,INPUT2 ;DX指向INPUT2,提示输入第一个数
CALL OUTPUT
CALL INPUT ;把输入的数存放在BX中
ENDM ;宏结束
DATA SEGMENT ;数据段
BUF DB ' ’,0DH,0AH
DB ’*----——- WELCOME TO CALCULATOR 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 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=$'
6
汇编语言设计课程设计
PR5 DB ’。

....。

$'
PR6 DB 'Are you sure exit?(Y/N)$'
DATA ENDS ;数据段落定义结束
CODE SEGMENT
MAIN PROC FAR ;主函数
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,BUF ;DX指向BUF换行
CALL OUTPUT ;调用显示字符串函数换行
SUB AX,AX ;AX清零
CALL CHOOSE ;调用选择函数
JMP START ;跳转到START
RET
MAIN ENDP
INPUT PROC NEAR ;定义INPUT函数,就是将从键盘输入的数按原十六进制数存放在BX

MOV BX,0 ;BX清零
NEWCHAR:
MOV AH,1
INT 21H ;接受键盘输入一个字符
CMP AL,0DH ;输入的字符与回车比较
JE EXIT ;是回车就结束
CMP AL,’A' ;与A比较
JAE H0 ;大于等于就跳转到H0
CMP AL,'0’ ;与0比较
JAE H1 ;大于等于就跳转到H1
H0:SUB AL,37H ;由于41—A=37,完成把字母字符转换成对应的十六进制数
JMP ADDTO ;跳转到ADDTO
H1:SUB AL,30H ;把0到9的字符转换成对应的十六进制数
JMP ADDTO ;跳转到ADDTO
ADDTO:
MOV CL,4 ;相当于让BX乘以16
7
SHL BX,CL ;将BX逻辑左移
MOV AH,0 ;将AX清零
ADD BX,AX ;AX+BX送到BX
JMP NEWCHAR ;跳转到NEWCHAR,把第二个输入的字符存放到BX的第二位EXIT: RET
INPUT ENDP
OUTPUT PROC NEAR ;显示字符串函数
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 EXIT1 ;等于4就跳转到EXIT1,结束程序
CALL WRONG ;如果不是0到4之间的数就提示出错
EXIT1: LEA DX,PR ;DX指向PR换行
CALL OUTPUT
LEA DX,PR6 ;DX指向PR6,确认是否退出
CALL OUTPUT
MOV AH,1 ;从键盘接受一个数
INT 21H
CMP AL,’Y’ ;与Y比较
JE EXIT0 ;不是Y就看是否为y
CMP AL,’y' ;与y比较
JNE START ;不是y就跳转到START
EXIT0:MOV AH,4CH ;结束本程序
INT 21H
YES1:CALL JIA ;调用JIA函数
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 DX,PR ;DX指向PR换行
LEA DX,WRO ;DX指向WRO,提示输入有错,请重新输入
JMP START ;跳转到START
RET
WRONG ENDP ;报错函数结束
JIA PROC NEAR ;加法函数
IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数由SI指向,第二个
数存放在BX中
ADD BX,[SI];把第一个数加第二个数存放到BX中
LEA DX,PR ;DX指向PR,换行
CALL OUTPUT
LEA DX,PR1 ;DX指向PR1,显示‘A + B='
CALL OUTPUT
CALL OUTBX ;调用显示BX寄存器的内容函数
RET
JIA ENDP ;加法结束
JIAN PROC NEAR ;减法函数
IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数由SI指向,第二
个数存放在BX中
SUB BX,[SI] ;第二个数减第一个数,结果存放到BX中
NEG BX ;对结果取反后才是A—B的值,才是第一个数减去第二个数
LEA DX,PR ;DX指向PR,换行
CALL OUTPUT
LEA DX,PR2 ;DX指向PR2,显示‘A - B='
CALL OUTPUT
CALL OUTBX ;调用显示BX寄存器的内容
RET
JIAN ENDP ;加法函数结束
CHENG PROC NEAR ;乘法函数
IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数由SI指向,第二个
数存放在BX中
MOV DX,0 ;把DX清零
MOV AX,BX ;把第二个数赋给AX
MUL WORD PTR[SI] ;AX乘[SI]并把结果存放到DX,AX中,是字的操作
MOV BX,AX ;将AX赋给BX
PUSH BX ;将BX压栈,显示下面DX的内容时要将DX的值赋给BX
PUSH DX ;将DX压栈,因为下面要换行输出,会改变DX的值
LEA DX,PR ;DX指向PR,换行输出
CALL OUTPUT
LEA DX,PR3 ;DX指向PR3,显示‘A * B='
CALL OUTPUT
POP DX ;将DX出栈,要将做乘法后DX的内容显示出来
MOV BX,DX ;把DX给BX
CALL OUTBX ;显示DX的内容
POP BX ;将BX出栈
CALL OUTBX ;显示AX的内容
RET
CHENG ENDP ;乘法函数结束
CHU PROC NEAR ;除法函数
IN16 ;调用宏,接受键盘输入的两个十六进制数,第一个数SI指向,第二个
数存放在BX中
MOV AX,[SI] ;将第一个数赋给AX
MOV DX,0 ;将DX清零
DIV BX ;AX除BX,结果存放到DX,AX,DX存放余数,AX存放商
PUSH DX ;压栈DX
PUSH AX ;压栈AX
LEA DX,PR ;DX指向PR,换行
CALL OUTPUT
LEA DX,PR4 ;DX指向PR4,显示‘A / B=’
CALL OUTPUT
POP AX ;出栈AX
MOV BX,AX ;将AX赋给BX,将商给BX
CALL OUTBX ;显示AX寄存器的内容,即显示商
LEA DX,PR5 ;DX指向PR5,显示省略号
CALL OUTPUT
POP DX ;出栈DX
MOV BX,DX ;将DX赋给BX,即将余数赋给BX,CALL OUTBX ;显示DX寄存器的内容,显示余数
RET
CHU ENDP ;除法函数结束
OUTBX PROC NEAR ;显示BX寄存器的内容函数
MOV CH,4 ;CH等于4
ROTATE:MOV CL,4 ;CL等于4
ROL BX,CL ;将BX循环左移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则结束
OUTBX ENDP ;显示寄存器BX内容函数结束
CODE ENDS
END MAIN。

相关文档
最新文档