汇编语言课程设计简单计算器设计

上传人:痛*** 文档编号:91497440 上传时间:2022-05-17 格式:DOC 页数:38 大小:307.50KB
收藏 版权申诉 举报 下载
汇编语言课程设计简单计算器设计_第1页
第1页 / 共38页
汇编语言课程设计简单计算器设计_第2页
第2页 / 共38页
汇编语言课程设计简单计算器设计_第3页
第3页 / 共38页
资源描述:

《汇编语言课程设计简单计算器设计》由会员分享,可在线阅读,更多相关《汇编语言课程设计简单计算器设计(38页珍藏版)》请在装配图网上搜索。

1、微机原理与应用课程设计实验题目:简单计算器设计年级:2010级专业:电子信息工程组员:梁玮堃 21005108田少飞 21005116刘 明 21005127陈晓琳 21005145指导教师:邓亚玲2013年01月- 0 - / 38组员分工组长 梁玮堃:报告设计。具体负责对设计报告版面设计、修改,流程图的设计,调试程序和应用程序的设计 。组员田少飞:程序调试。负责计算器具体程序设计,编写主程序。刘 明:程序修改。对已调程序进行修改,并设计相关功能程序。陈晓琳:查阅资料。通过上网或在图书馆查阅有关汇编语言及计算器设计资料。目录1设计目的12概要设计22.1系统总体分析22.2程序流程图及说明3

2、3详细设计53.1主模块及子模块说明53.2各模块详细设计104程序调试134.1调试过程及分析134.2运行界面分析135心得体会175.1设计体会175.2系统改进17参考文献181设计目的汇编语言是计算机能够提供给用户使用的最快而又最有效的语言。同时,汇编语言也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。因而,对程序的空间和时间要求很高的场合,汇编语言的应用是必不可少的。至于很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。由于汇编语言如此地接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。用汇编语言编写的程序速度通常要比高级语言快几倍、几十倍、甚至成百上千倍

3、,解释语言其程序速度更无法与汇编语言程序同日而语。 本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的

4、设计。通过对各种指令的合理使用,熟悉并加深对各种指令的用法。学会使用汇编语言设计各个功能模块。当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。2概要设计2.1 系统总体分析 本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法

5、运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。 第一步,我要解决的是输入时是用INT 21H的10号功能调用还是用INT 21H的1号功能调用来进行输入。若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输

6、入不是这样的格式计算出来的结果就不一定是我们想要的结果了。在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。 第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是+号、-号、*号、/号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。 第三步,根据计算器程序所要实现的功能完成各个功能模块。设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。子模块中包含有:do_add加法运算模块,do_sub减法运

7、算模块,do_mul乘法运算模块,do_div除法运算模块,input输入模块等。 最后还要对这个简易计算器进行功能完善。为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是=符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算器2.2 程序流程图及说明 此程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。 程序流程图说明:

8、通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为Q或q,若是,则退出程序,不是则继续输入。还要判断输入的是否为0-9,+,-,*,/这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。 程序流程图如图2-1所示程序开始输出提示语句输入一个算式Y输入出错Q / q ?退出N09+ * %N存储数据Y判断运算符号按下Enter键调用运算功能模块显示结果Y3详细设计3.1 主模块及子模块说明主题模块实现变

9、量的定义,提示输入信息的显示,调用各个功能子模块,判断输入的内容是否符合要求,如果符合要求,则按照用户所输入的运算符即+-*/来调用加减乘除等子模块完成运算。当用户键入enter键或者=键时将结果显示在屏幕上。在此,对变量的定义类型进行说明,因为本次课程设计所要求设计的计算器要能够对四位数进行加减乘除运算,所以我使用DD伪指令将x、y、z三个变量定义为双字变量。 子模块说明:主要的子模块是input子模块,功能是输入;do_add子模块,功能是完成加法运算;do_sub子模块,功能是完成减法运算;do_mul子模块,功能是完成乘法运算;do_div子模块,功能是完成除法运算。其它模块将在模块详

10、细设计部分中进行说明。 程序主题部分源代码如下: CURS MACRO A,B MOV AH,2 ;置光标位置 MOV BH,0 ;页号为0 MOV DH,A ;设置光标的坐标为(A.B) MOV DL,B INT 10H ;BIOS调用 ENDM;- DISPMSG MACRO MESSAGE LEA DX,MESSAGE ;传递MESSAGE的偏移地址 MOV AH,9 ;显示字符串 INT 21H ;DOS调用 ENDM;- CLEAR MACRO COLOR ;清屏 MOV AH,6 ;屏幕初始化 MOV AL,0 ;页号 MOV CH,0 ;设置左上角的坐标为(0,0) MOV CL

11、,0 MOV DL,100 ;设置右上角的坐标为(100,100) MOV DH,100 MOV BH,COLOR ;卷入行属性 INT 10H ;BIOS调用 ENDM.MODEL SMALL.STACK.DATA ;数据段定义MSG0 DB _ ,0DH,0AH ;,0dh,0ah,0dh,0ah DB | |,0DH,0AH | |,0dh,0ah | |,0dh,0ah DB | -counter- |,0DH,0AH ;,0dh,0ah,0dh,0ah DB | |,0DH,0AH DB | |,0DH,0AH DB | |,0DH,0AH DB | data1:DB _ |,0DH

12、,0AH ;,0dh,0ah,0dh,0ah,0dh DB | |,0DH,0AH DB | |,0DH,0AH DB | |,0DH DB | data2: DB _ |,0DH,0AH ;,0dh,0ah,0dh,0ah,0dh DB | |,0DH,0AH DB | |,0DH,0AH DB | |,0DH DB | result:DB _ |,0DH,0AH,0DH ;,0ah,0dh,0ah,0dh,0ah DB | |,0DH,0AH DB | |,0DH,0AH DB | |,0DH,0AH DB | |,0DH,0AH DB | |,0DH,0AH DB |_|,$ MSG1

13、DB choose +,-,*,/,$ MSG2 DB you choose wrong,$,0AH,0DH MSG3 DB Press ESC to Exit!,0DH,0AH,$ MSG4 DB Press any key to continue!,0DH,0AH,$ MSG5 DB -,$ MSG6 DB .,$ MSG7 DB error input!,$ MSG8 DB data2 is wrong!,$ F_AL DB ? DATA1 DW ? DATA2 DW ?.CODE ;代码段从这里开始;- DEC_DIV PROC NEAR CWD ;将字转换为双字,AX内容符号扩展到D

14、X DIV CX PUSH DX MOV DL,AL ADD DL,30H ;将不是数字的字符转换为数字 MOV AH,2 ;显示输出 INT 21H ;DOS调用 POP DX MOV AX,DX RET DEC_DIV ENDP;- CHANGE PROC NEAR ;该子程序的功能:将AX中存储的十六进制数转换为十进制数 CMP AX,1000 JAE C1 ;AX1000则转移 CMP AX,100 JAE C2 ;AX100则转移 CMP AX,10 JAE C3 ;AX10则转移 JMP C4 ;AX10 C1: MOV CX,1000D CALL DEC_DIV C2: MOV

15、CX,100D CALL DEC_DIV C3: MOV CX,10D CALL DEC_DIV C4: MOV CX,1D CALL DEC_DIV RET CHANGE ENDP;- BEGIN PROC NEAR BACK: CLEAR 1EH CURS 2,20 ;设置光标为(2.20) DISPMSG MSG0 ;显示用户界面 CURS 8,41 ;设置光标为(8,41) ,第一行 MOV BX,0 MOV CX,2 NEWCHAR1: MOV AH,1 ;键盘输入并回显 INT 21H ;DOS调用 CMP AL,30H ;检查输入的字符是不是数字 JAE J1 ;如果不是,则转移

16、至J1 JMP D2 ;是,转移到D2执行 J1: CMP AL,39H ; 与9的ASCII侣氡 JBE J2 ;如果输入的字符是0-9,则转移至J2 JMP D2 ;如果不是数字,则转移至D2 J2: SUB AL,30H CBW ;AL的内容符号扩展到AH XCHG AX,BX MOV DI,10 MUL DI XCHG AX,BX ADD BX,AX LOOP NEWCHAR1 MOV DATA1,BX CURS 11,41 ;设置光标位为(11,40),第二行 MOV BX,0 MOV CX,2 NEWCHAR2: MOV AH,1 ;键盘输入并回显 INT 21H ;DOS调用 C

17、MP AL,30H ;与0的ASCII码比较 JAE J3 ;如果输入数字大于等于0则跳转至J3 JMP D2 J3: CMP AL,39H ;与9比较 JBE J4 ;如果小于或等于9则跳转 JMP D2 ;如果输入不是数字则跳转 J4: SUB AL,30H ;如果输入不是0-9,则转化成相应的字符 CBW ;将AL符号扩展到AH XCHG AX,BX MOV DI,10 MUL DI XCHG AX,BX ADD BX,AX LOOP NEWCHAR2 MOV DATA2,BX MOV AX,DATA1 MOV BX,DATA2 PUSH AX PUSH BX CURS 15,33 ;设

18、置光标的位置为(15.33),第三行 DISPMSG MSG1 ;显示提示信息 MOV AH,1 ;接受键盘输入并回显 INT 21H ;DOS调用 CMP AL,+ JE ADDI ;如果运算符为+,则计算两数之和 CMP AL,- JE SUBT ;如果运算符为-,则计算两数之差 CMP AL,* JE MULT ;如果运算符为*,则计算两数之积 CMP AL,/ JE DIVI ;如果运算符为/,则计算两数之商 CURS 16,25 ;设置光标为(16,25) DISPMSG MSG2 ;在屏幕上输出提示信息 JMP D1 ;-;- MAIN PROC NEAR MOV AX,DATA

19、MOV DS,AX MOV ES,AX MOV AH,0FH INT 10H MOV BYTE PTRF_AL,AL MOV AH,0 PUSH DS XOR AX,AX PUSH AX MOV DATA2,0 ;将缓冲区清空 MOV DATA1,0 AGAIN: CALL BEGIN CURS 16,23 ;设置光标位置为(16.23) DISPMSG MSG3 ;在屏幕上输出提示信息,提示退出的方法 CURS 17,23 ;设置光标位置为(17.23) DISPMSG MSG4 ;在屏幕上输出提示信息,提示继续的方法 MOV AH,7 ;键盘输入,无回显 INT 21H ;DOS调用 CM

20、P AL,27 ;判断输入的是否为ESC JNE AGAIN ;如果不是就继续执行以上运算 EXIT: MOV AH,0 MOV AL,BYTE PTRF_AL INT 10H MOV AX,4C00H ;如果是就退出系统 INT 21H ;DOS调用 MAIN ENDP END MAIN3.2 各模块详细设计;ADD THE TWO DATAS ADDI: POP BX POP AX ADD AX,BX ;计算两数字之和 PUSH AX CURS 14,41 ;设置光标位置为(14,41) POP AX CALL CHANGE ;将结果转换为十进制数 JMP D1;-;SUBTRACT TH

21、E TWO DATAS SUBT: POP BX POP AX CMP AX,BX ;比较两数大小 JAE D0 ;如果AX=BX则跳转 XCHG AX,BX PUSH AX PUSH BX CURS 14,40 ;设置光标位置为(14,40) DISPMSG MSG5 ;在屏幕上显示负号 POP BX POP AX D0: SUB AX,BX ;计算两数之差 PUSH AX CURS 14,41 ;设置光标位置为(14,41) POP AX CALL CHANGE ;将结果转换为十进制数 JMP D1;-;MULTIPLY THE TWO DATAS MULT: POP BX POP AX

22、MUL BX ;计算两数之积 PUSH AX CURS 14,41 ;设置光标位置为(14,41) POP AX CALL CHANGE ;将结果转换为十进制数 JMP D1;-;DIVIDE THE TWO DATAS DIVI: POP BX POP AX CMP BX,0 ;判断除数是否为0 JE ERROR ;如果是0则跳转 CWD DIV BX ;计算两数之商 PUSH DX PUSH AX CURS 14,41 ;设置光标位置为(14,41) POP AX CALL CHANGE ;将十六进制数转换为十进制数 POP DX CMP DX,0 JNE LOP ;如果DX不等于0则跳转

23、 JMP D1 LOP: MOV CX,6 ;设置精确度为小数点后6位 PUSH DX DISPMSG MSG6 ;输出小数点 POP DX CON: PUSH BX MOV AX,DX MOV BX,10 MUL BX POP BX CWD ;将AX的内容符号扩展到双字 DIV BX ;计算小数点后每一位的数字 PUSH DX PUSH CX CALL CHANGE ;将十六进制数转化为十进制数 POP CX POP DX CMP DX,0 ;判断是否已经计算到小数点后第六位 JE D1 ;如果是,则跳转 LOOP CON ;如果不是,就继续计算 ERROR: CURS 15,33 ;设置光

24、标位置为(15,33) DISPMSG MSG8 ;提示出错 D1: RET D2: PUSH AX PUSH BX CURS 15,33 ;设置光标位置为(15,33) DISPMSG MSG7 ;提示输入出错 POP BX POP AX RET BEGIN ENDP4程序调试4.1调试过程及分析4.2 运行界面分析加法减法乘法除法5心得体会5.1 设计体会 经过这次课程设计,我学到了很多东西,其中包括知识方面的,还有其他方面的。首先让我认识到,做好一件事,做成功一件事是不容易的,但是你只要坚持不懈的努力,不断的发挥自己的智慧去思索去探究,你会欣慰的发现自己正向着成功一步步迈进。 这次课程设

25、计使我对汇编语言程序设计这门课程有了进一步的理解和认识,使我学到了许多编程语言以及算法设计方面的知识,同时也锻炼了我的耐心和意志,增长了我的实践能力。 这次课程设计我所选的题目是使用汇编语言设计一个具有加减乘除基本运算功能的简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。通过使用汇编语言设计实现简单计算器,我进一步了解和掌握了对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的,我通过对具有加减乘除基本功能的计算器的设计实现,学会了使用汇编语言实现输入输出模块

26、的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。在汇编语言程序设计中,我通过对各种指令的合理使用,熟悉并加深了对各种指令的用法,同时也学会使用汇编语言设计各个功能模块。当我实现各个程序模块后,学会了通过程序的调用最终实现一个具有基本计算功能的简单计算器。在本次课程设中,我遇到了很多问题。例如,在计完成具有输入功能的模块input模块时我就遇到了困难。通过一番努力后我发现利用int 21H中的01号功能调用可以较好的实现输入功能,原因是Int 21H的01号功能调用可以直接接收键入的字符,当有键按下时,首先检查是否是ctrl+break,若是,则执行退出命令;否则将键值送

27、入AL寄存器并回显。 通过这次汇编语言程序课程设计,我学到了许多东西,同时也发现了一些不足之处,在以后的学习中我会逐步弥补这些不足。总而言之,此次课程设计使我受益匪浅。5.2 系统改进 本次课程设计我虽然完成了题目的要求,但是其中也还存在一些不足之处,这些不足的地方有待与改进与完善。系统需要改进的地方有以下三点:一,最主要的就是程序的健壮性不是很完善;二,对大数的加减乘除运算功能不足;三,程序代码算法的优化不足。本次课程设计我认为最需要改进的就是程序的健壮性。通过这次课程设计,我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入数据非法,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名其妙的输出结果。一个正确可行的算法如果缺乏健壮性,那么这个程序也不能算真正的成功。参考文献1 微型计算机原理与接口技术 吕林涛主编 北京科学出版社,20052 钱晓捷 新版汇编语言程序设计 北京电子工业出版社,20083 刘丽莉 汇编语言程序设计 北京大学出版社,20104 王爽 汇编语言 清华大学出版社,20085 零基础入门学习汇编语言 主讲:小甲鱼6 何小海、严华 微机原理与接口技术 北京科学出版社 友情提示:方案范本是经验性极强的领域,本范文无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!