qdu汇编计算器程序.docx
- 文档编号:5383427
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:15
- 大小:127.54KB
qdu汇编计算器程序.docx
《qdu汇编计算器程序.docx》由会员分享,可在线阅读,更多相关《qdu汇编计算器程序.docx(15页珍藏版)》请在冰豆网上搜索。
qdu汇编计算器程序
课程设计说明书
题目:
简单计算器
院系:
qdu
专业班级:
学号:
2012020243
学生姓名:
指导教师:
2012年12月31日
课程设计(论文)任务书
计算机科学与工程学院硬件教研室
学号
学生姓名
专业(班级)
设
计
题
目
题目一:
判断闰年
题目二:
简单计算器√
题目三:
代码转换程序
题目四:
字符图形程序
题目五:
学生成绩管理
题目六:
打字练习
设
计
技
术
参
数
1.熟悉汇编指令、宏汇编语言的编程方法
2.BIOS中断调用、系统功能中断调用方法
3.磁盘文件、及文件内容操作
设
计
要
求
题目的选择是根据汇编语言的特点主要针对系统内部的一些中断调用、系统功能调用、系统数据处理、文件数据处理而设计的,是对所学课程知识较为系统的应用。
由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的功能实现上,不要太在意程序的结构和显示界面的设计。
不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善的程序。
另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目。
工
作
量
1.完成所选题目的软件设计;
2.课程设计说明书1000字(不包括程序源代码)左右。
工
作
计
划
第1次熟悉软件环境。
第2次绘制程序流程图。
第3次用编写程序。
第4次用调试运行程序。
第5次编写课程设计说明书
参
考
资
料
[1]李敬兆.8086/8088和基于ARM核汇编语言程序设计.合肥:
中国科技大学出版社,2008
[2]洪志全,罗省贤.汇编语言程序设计教程.北京:
电子工业出版社,2004
指导教师签字
教研室主任签字
2010年12月17日
安徽理工大学课程设计(论文)成绩评定表
指导教师评语:
成绩:
指导教师:
年月日
摘要
本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:
编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
想要用汇编语言实现简单的计算器,就必须通过对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识进行运用,以实现一个基本功能完善,界面友好,操作简便易行的计算器。
用汇编语言实现简单计算器还涉及到输入输出模块的设计,加减乘除运算的判断以及退出程序的判断的设计。
通过对各种指令的合理使用,设计各个功能模块。
当实现各个程序模块后,通过程序的调用最终实现一个简单的计算器。
关键词:
计算器,汇编语言,四则运算,功能模块,调用
目录
1设计目的1
2概要设计2
2.1系统总体分析2
2.2程序流程图及说明3
3详细设计5
3.1主模块及子模块说明5
3.2各模块详细设计7
4程序调试11
4.1运行界面分析11
4.2调试过程及分析11
5心得体会13
5.1设计体会13
5.2系统改进13
参考文献15
1设计目的
汇编语言是计算机能够提供给用户使用的最快而又最有效的语言。
同时,汇编语言也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
因而,对程序的空间和时间要求很高的场合,汇编语言的应用是必不可少的。
至于很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。
由于汇编语言如此地接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。
用汇编语言编写的程序速度通常要比高级语言快几倍、几十倍、甚至成百上千倍,解释语言其程序速度更无法与汇编语言程序同日而语。
本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:
编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。
本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。
通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。
通过对各种指令的合理使用,熟悉并加深对各种指令的用法。
学会使用汇编语言设计各个功能模块。
当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。
2概要设计
2.1系统总体分析
本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
比如,十进制数的加减乘除四则运算。
我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,我要解决的是输入时是用INT21H的10号功能调用还是用INT21H的1号功能调用来进行输入。
若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。
我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。
在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
第三步,根据计算器程序所要实现的功能完成各个功能模块。
设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。
子模块中包含有:
do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div除法运算模块,input输入模块等。
最后还要对这个简易计算器进行功能完善。
为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。
如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。
在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算器。
2.2程序流程图及说明
此程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。
程序流程图说明:
通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为Q或q,若是,则退出程序,不是则继续输入。
还要判断输入的是否为0--9,‘+’,‘-’,‘*’,‘/’这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。
最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。
程序流程图如图2-1所示:
图2-1程序流程图
3详细设计
3.1主模块及子模块说明
主题模块实现变量的定义,提示输入信息的显示,调用各个功能子模块,判断输入的内容是否符合要求,如果符合要求,则按照用户所输入的运算符即‘+’‘-’‘*’‘/’来调用加减乘除等子模块完成运算。
当用户键入‘enter’键或者‘=’键时将结果显示在屏幕上。
在此,对变量的定义类型进行说明,因为本次课程设计所要求设计的计算器要能够对四位数进行加减乘除运算,所以我使用DD伪指令将x、y、z三个变量定义为双字变量。
子模块说明:
主要的子模块是input子模块,功能是输入;do_add子模块,功能是完成加法运算;do_sub子模块,功能是完成减法运算;do_mul子模块,功能是完成乘法运算;do_div子模块,功能是完成除法运算。
其它模块将在模块详细设计部分中进行说明。
程序主题部分源代码如下:
datasegment
xdd0
ydd0
zdd0
tmpdw0
tendw10
opdb0
messagedb'inputasuanshi(inputqexit):
',13,10,'$';提示用户输入算式。
dataends
assumecs:
code,ds:
data
codesegment
start:
movax,data
movds,ax
nx0:
movah,9
leadx,message;DX指向message,提示输入算式。
int21h;DOS系统功能调用。
calldo_cal;调用do_cal。
callshow;调用show。
jmpnx0;转移到nx0。
done:
movax,4c00h;将4C00H送给AX,即返回DOS。
int21h;DOS系统功能调用。
do_cal:
callinput;调用input。
fistpx;将输入的数以十进制的形式存入x中。
cmpal,'q';将AL和q进行比较,即判断AL是否为q。
jzdone;如果输入的是q则退出程序,返回DOS。
cmpal,'Q';将AL和Q进行比较,即判断AL是否为Q。
jzdone;如果输入的是Q则退出程序,返回DOS。
movop,al;将AL送给OP。
callinput;调用input子程序段。
fistpy;将输入的数以十进制的形式存入y中。
cmpop,'+';判断OP是否为“+”。
jnznx1;如果不是“+”且不为零,则跳转到nx1。
calldo_add;调用do_add。
jmpnx4;转移到nx4。
nx1:
;nx1子程序段定义
cmpop,'-';判断OP是否为“-”。
jnznx2;如果不是“-”,则跳转到nx2。
calldo_sub;调用do_sub。
jmpnx4;转移到nx4。
nx2:
;nx2的定义。
cmpop,'*';判断OP是否为“*”。
jnznx3
calldo_mul;调用do_mul。
jmpnx4
nx3:
cmpop,'/';判断OP是否为“/”。
jnznx4
calldo_div;调用do_div。
nx4:
ret;子程序返回。
3.2各模块详细设计
完成输入功能的模块input模块。
Int21H的01号功能调用可以直接接收键入的字符,当有键按下时,首先检查是否是ctrl+break,若是,则执行退出命令;否则将键值送入AL寄存器并回显。
Input模块源代码如下:
input:
finit
fldz
nx10:
movah,1;01号功能调用。
int21h
subal,'0'
cmpal,0
jldone1
cmpal,9
jgdone1
fimulten
xorah,ah
movtmp,ax
fiaddtmp
jmpnx10
done1:
addal,'0'
ret;子程序返回。
设计完成加法运算功能的模块do_add模块源代码如下:
do_add:
fildx
fiaddy
fimulten
fimulten
fistpz
ret;子程序返回。
设计完成减法运算功能的模块do_sub模块源代码如下:
do_sub:
fildx
fisuby
fimulten
fimulten
fistpz
ret;子程序返回。
设计完成乘法运算功能的模块do_mul模块源代码如下:
do_mul:
fildx
fimuly
fimulten
fimulten
fistpz
ret;子程序返回。
设计完成除法运算的功能模块源代码如下:
do_div:
fildx
fimulten
fimulten
fidivy
fistpz
ret;子程序返回。
设计init模块源代码如下:
init:
finit
fstcwtmp
movax,tmp
orax,0c00h
movtmp,ax
fldcwtmp
ret;子程序返回。
设计完成show模块为:
show:
callcrlf
movah,2
movdl,'='
int21h
movdx,wordptr[z+2]
cmpdx,0
jgepos
movdl,'-'
int21h
callinit
fldz
fld1
fsub
fildz
fmulst
(1),st(0)
fistpz
fistpz
设计完成pos模块如下:
pos:
callinit
fildten
fimulten
fildz
fprem
fildz
fsubst(0),st
(1)
fidivten
fidivten
fistpz
fistptmp
movax,tmp
pushax
callinit
fildten
movax,wordptr[z]
cmpax,0
jnznx8
cmpax,wordptr[z+2]
jnznx8
movah,2
movdl,'0'
int21h
jmpnx9
设计完成crlf模块如下:
crlf:
movah,2
movdl,13
int21h
movdl,10
int21h
ret;子程序返回。
codeends
endstart
4程序调试
4.1运行界面分析
将源程序输入编辑程序中,检查无误后经汇编、连接后装入系统运行界面如图4-1所示:
图4-1运行界面
程序的运行界面显示成功,屏幕上显示“inputasuanshi(inputqexit):
”提示用户输入一个算式。
4.2调试过程及分析
对程序源代码进行功能调试和功能验证。
程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进行分析。
再者,要对当用户输入Q或q时,退出程序的功能进行检测。
加法运算,计算1122+1658,如图4-2所示:
图4-2加法运算
减法运算,计算2345-2533,如图4-3所示:
图4-3减法运算
乘法运算,计算1233*3000,如图4-4所示:
图4-4乘法运算
除法运算,计算98/10,如图4-5所示:
图4-5除法运算
当用户输入Q或q时,程序退出,如图4-6所示:
图4-6退出程序测试
5心得体会
5.1设计体会
经过这次课程设计,我学到了很多东西,其中包括知识方面的,还有其他方面的。
首先让我认识到,做好一件事,做成功一件事是不容易的,但是你只要坚持不懈的努力,不断的发挥自己的智慧去思索去探究,你会欣慰的发现自己正向着成功一步步迈进。
这次课程设计使我对汇编语言程序设计这门课程有了进一步的理解和认识,使我学到了许多编程语言以及算法设计方面的知识,同时也锻炼了我的耐心和意志,增长了我的实践能力。
这次课程设计我所选的题目是使用汇编语言设计一个具有加减乘除基本运算功能的简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
通过使用汇编语言设计实现简单计算器,我进一步了解和掌握了对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。
本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的,我通过对具有加减乘除基本功能的计算器的设计实现,学会了使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。
在汇编语言程序设计中,我通过对各种指令的合理使用,熟悉并加深了对各种指令的用法,同时也学会使用汇编语言设计各个功能模块。
当我实现各个程序模块后,学会了通过程序的调用最终实现一个具有基本计算功能的简单计算器。
在本次课程设中,我遇到了很多问题。
例如,在计完成具有输入功能的模块input模块时我就遇到了困难。
通过一番努力后我发现利用int21H中的01号功能调用可以较好的实现输入功能,原因是Int21H的01号功能调用可以直接接收键入的字符,当有键按下时,首先检查是否是ctrl+break,若是,则执行退出命令;否则将键值送入AL寄存器并回显。
通过这次汇编语言程序课程设计,我学到了许多东西,同时也发现了一些不足之处,在以后的学习中我会逐步弥补这些不足。
总而言之,此次课程设计使我受益匪浅。
5.2系统改进
本次课程设计我虽然完成了题目的要求,但是其中也还存在一些不足之处,这些不足的地方有待与改进与完善。
系统需要改进的地方有以下三点:
一,最主要的就是程序的健壮性不是很完善;二,对大数的加减乘除运算功能不足;三,程序代码算法的优化不足。
本次课程设计我认为最需要改进的就是程序的健壮性。
通过这次课程设计,我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入数据非法,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名其妙的输出结果。
一个正确可行的算法如果缺乏健壮性,那么这个程序也不能算真正的成功。
参考文献
[1]李敬兆.8086/8088和基于ARM核汇编语言程序设计.合肥:
中国科技大学出版社,2008
[2]李敬兆.8086/8088和基于ARM核汇编语言程序设计实验教程.合肥:
中国科技大学出版社,2008
[3]钱晓捷.新版汇编语言程序设计.北京:
电子工业出版社,2007
[4]洪志全,罗省贤.汇编语言程序设计教程.北京:
电子工业出版社,2004
[5]杨季文.80x86汇编语言程序设计教程.北京:
清华大学出版社,2004
[6]周佩玲,彭虎,傅忠谦.微机原理与接口技术.北京:
电子工业出版社,2005
[7]何小海,严华.微机原理与接口技术.北京:
科学出版社,2006
[8]钱晓捷.新版汇编语言程序设计.北京:
电子工业出版社,2008
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- qdu 汇编 计算器 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)