《微机基础原理简单计算器课程教学设计.doc》由会员分享,可在线阅读,更多相关《微机基础原理简单计算器课程教学设计.doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-/ 课 程 设 计 报 告课程设计名称: 简易计算器 系 别: 三系 学生姓名: 张梦瑶 班 级: 11通信1班 学 号: 20110306111 成 绩: 指导教师: 袁静 开课时间: 2013-2014 学年 1 学期一设计题目 简易计算器二主要内容1、采用模块化程序结构设计软件,可将整个软件分成若干功能模块。2、画出程序流程图。3、根据流程图,编写源程序。4、上机调试程序。三具体要求1、利用BIOS和DOS的中断来设计一个计算器,要求在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。2、利用BIOS中断的10号功能调用来设置显示方式。
2、3、利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。四进度安排周一周二周三周四周五讲课设内容,安排任务查资料,确定硬件电路方案编程调试编程调试写总结报告五成绩评定考核方法:现场验收(占50%),课程设计报告(占50%)。考核内容:学习态度(出勤情况,平时表现等)、方案合理性、程序编制质量、演示效果、设计报告质量。成绩评定:优,良,中,及格,不及格。特别说明:如发现抄袭,按照不及格处理。目 录前言41、设计题目52、设计内容52.1 基本内容52.2 主要功能53、设计原理及方案63.1 总体方案63.2 程序流程图73.2.1 主程序73.2.2 计算子程序83.3 系统模块详细
3、设计93.3.1 界面设置93.3.2 算法选择设置103.3.3 数制转换设置114.汇编源程序代码135、调试运行结果205.1 操作说明205.2 调试运行结果206、心得体会237、参考文献24前言课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。计算器在我们日常生活中应用是相当普遍的,可以说它已经成为现代社会生活不可或缺的一部分。本次课程设计就是根据微机原理与接口的相关知识,
4、利用BIOS和DOS的中断来设计一个简易计算器,能够实现加减乘除四则运算,并在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。同时利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。通过本次课程设计,要求学生熟悉和掌握微机系统的软件的方法、设计步骤,使学生得到微机开发应用方面的初步训练,熟练应用8086汇编语言编写应用程序和实际设计中的软件调试方法和步骤,熟悉微机系统的软件开发工具的使用方法。通过课程设计实践,不仅要培养学生事实求是和严肃认真的工作态度,培养学生的实际动手能力,检验学生
5、对本门课学习的情况,更要培养学生在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。1、设计题目简易计算器2、设计内容2.1 基本内容1、编写一个程序,能从键盘上读入数据,并完成加、减、乘、除的计算。2、利用BIOS和DOS的中断来设计一个计算器,要求在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。3、利用BIOS中断的10号功能调用来设置显示方式。4、利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。2.2 主要功能一、显示主菜单功能主菜单如下:Please input a number to choose th
6、e arithmetic operation1add 2subtract 3multiply 4divide qreturn to DOS二、计算功能1、别按数字键“1”、“2”、“3”,则执行相应子模块1、2、3,进行两个字节与两个字节的加法、减法和乘法运算,并在屏幕上显示运算结果。2、按数字键“4”,执行子模块4,进行两个字节除一个字节的除法运算,并显示结果。3、按字母键“q”,执行子模块5,程序退出,返回DOS。4、若按其它键则显示提示字符串:“Please Press Number 1、2、3、4、q:”,然后继续显示主菜单。3、设计原理及方案3.1 总体方案利用BIOS中断的10号功
7、能调用来设置显示方式。利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。设置屏幕显示方式。 MOV AH,00H MOV AL,NUM (NUM为显示方式属性字) INT 10H接着从键盘上接受键值,并判别后转到相应的子模块进行运算,并显示结果。 MOV AH,01H INT 21H ;AL=键入字符的ASCII码从键盘上接收一串字符串命令: MOV AH,0AH MOV DX,OFFSET BUF ;BUF为数据段中定义的数据缓冲区 INT 21H显示单个字符命令: MOV AH,02H INT 21H显示一串字符串的命令: MOV AH,09H MOV DX,OFFSET BU
8、F ;BUF为被显示字符串的首地址 INT 21H十进制数显示过程:将十进制数送到BX中,BX除以1000,余数送BX中,商在AL中,范围为09,显示AL中的内容。BX除以100,余数送BX中,商在AL中,显示AL中的内容,依次类推,直到分出个位数字。如最高位为0,则不应显示,而非最高位的0则显示。可利用设标志位并结合商的方法来决定是否显示0。3.2 程序流程图3.2.1 主程序显示主菜单接收数字AL=1?AL=2?AL=3?AL=4?AL=5?调用加法子程序调用减法子程序调用乘法子程序调用除法子程序结束开始图3.1 主程序流程图3.2.2 计算子程序提示输入第一个数提示输入第二个数计 算判断
9、结果正负,并储存结果将结果转为ASCII码,并显示结果提示返回DOS还是重新计算将第一个数的ASCII码转为二进制并保存将第二个数的ASCII码转为二进制并保存结 束图3.2 计算子程序流程图3.3 系统模块详细设计本次设计需要实现的模块图图如1所示 四则运算器程序设计 界面设置算法选择设置数制转换设置图3.3 模块图(1)界面设置 主要实现确定界面样式的功能,以菜单形式显示。(2) 算法选择设置 用于选择加、减、乘、除来进行运算。(3)数制转换设置 应用十进制二进制的转换算法来处理加、减、乘、除四则运算。3.3.1 界面设置1、设置屏幕显示方式: MOV AH,00H MOV AL,2 IN
10、T 10H通过调用BOIS的O2H号功能来设置屏幕显示方式。此处AL=2,即设置屏幕显示方式为80*25黑白文本。2、显示主菜单:DOS不仅为用户提供了许多指令,而且还有用户可以直接调用的上百个常用子程序。这些子程序的功能主要是进行磁盘读/写、基本输入/输出管理等。在使用时,用户只需要了解各个子程序的编号即可,这些编号成为DOS功能调用号。其调用过程为: (1)DOS功能条用号送AH寄存器。(2)如果需要,按要求给定输入参数(由得不需要输入参数)。(3)写入中断指令“INT 21H”。调用结束,按功能使用其输出参数。本程序主菜单显示代码如下:MOV AH,09H MOV DX,OFFSET T
11、OP INT 21H先在数据段中定义主菜单中要显示的字符串,再通过调用DOS系统的09H号功能显示字符串(串尾字符为,但不显示)来完成。3.3.2 算法选择设置汇编语言中加减乘除运算指令分别为ADD、SUB、MUL、DIV。首先选择要进行的四则运算,规定:若选择1,则进行加法;选择2,则进行减法;选择3,则进行乘法;选择4,则进行除法。具体计算过程分析如下:1、从键盘接收一个数字:MOV AH,01H INT 21H通过调用DOS系统的01H号功能键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中。2、接收键入用于计算的数:MOV AH,0AH MOV DX,OFFSET B
12、UF1通过调用DOS系统的0AH号功能键入字符串至内存缓冲区来实现,其入口参数如下:DS:DX=存放键入字符串的缓冲区的首地址;(DS:DX)=用户规定的缓冲区;(DS:DX+1)=实际键入的字符数;从(DS:DX+2)开始放键入的字符串。因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。3、显示结果:MOV AH,09H MOV DX,OFFSET BUF3 INT 21H将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能显示字符串(串尾字符为,但不显示)来完成。3.3.3 数制转换设置 1、子程序A2将数的ASCII码转为二进制数:A2 PROC NEA
13、R MOV CL,BUF1+1 ; 把BUF1+1中的实际键入的字符数放入CL MOV CH,0 ; CH清零 MOV BX,OFFSET BUF1+2 ; 把第一个数字的地址放在BX PUSH BX ; 保存BX中的值 PUSH CX ; 保存CX中的值L1: MOV AL,BX AND AL,0FH ; 把ASCII码转换为十进制 MOV BX,AL ; 存放十进制 INC BX ; 下一个数字的地址 LOOP L1 POP CX ; 恢复CX POP BX ; 恢复BX MOV AX,0 ; 将累加和赋零 MOV SI,10L2: MUL SI ADD AL,BX ADC AH,0 IN
14、C BX LOOP L2 ; 累加乘10L3: RET A2 ENDP入口:十进制数的ASCII在BUF1内;出口:转换后的二进制数在AX内。算法:先将其转换为十进制,再用累加和乘10加X的方法变为二进制,如将163转换为二进制数,可先将累加和赋0,再计算(0*10+1)*10+6)*10+3)结果为二进制数。2、将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段):该模块的程序设计详见程序清单及说明中A3、BB程序段 入口:二进制数在AX内;出口:转换后的ASCII码在BUF内。算法:AX内的数范围在+32767到-32768之间,先检查AX符号位,决定输出+ -,若
15、为负,先求补码得到原码后可与正数统一处理。方法:把将被转换的二进制数先除以10000,商为万位数,再将余数除以1000,商为千位数,以此类推,求出百十位数,剩下的为个位数。最后各个数加上30H,即为对应字符。4.汇编源程序代码DATA SEGMENT N=15TOP DB 5 DUP(0AH) DB N DUP( ), Please input a number to choose the arithmetic operation, 0DH,0AH DB N DUP( ), , 0DH,0AH DB N DUP( ),1add 2subtract 3multiply, 0DH,0AH DB N
16、 DUP( ),4divide qreturn to DOS, 0DH,0AH DB N DUP( ), , 0DH,0AH DB N DUP( ),Choice (1.2.3.4.q):$MESG1 DB 0DH,0AH,Please press number: 1.2.3.4.q !$ MESG2 DB 0DH,0AH,Please input the first number :$MESG3 DB 0DH,0AH,Please input the second number :$MESG4 DB 0DH,0AH,Play Add :$MESG5 DB 0DH,0AH,Play Subtr
17、act :$MESG6 DB 0DH,0AH,Play Multiply :$MESG7 DB 0DH,0AH,Play Divide :$MESG8 DB 0DH,0AH,The Result :$MESG9 DB 0DH,0AH,PRESS Q RETURN DOC,ANY PRESS RETURN START!$BUF1 DB 6 ; 十进制数的缓冲区,可接收6个字符 DB ? ; 保留,用于10号调用时DOC填入实际输入字符数 DB 6 DUP(?) ; 一个符号位,四位数字ASCII码,加上一个回车符BUF2 DW ? ; 将第一个数转换为二进制后,放于这里BUF3 DB 6 DUP
18、(?),$ ; 将结果转换为ASCII码后,放在这里DATA ENDSSTACK SEGMENT STACKSTACKCODE SEGMENT ASSUME CS:CODE , DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AH,00H ; 设置屏幕显示方式 MOV AL,2 INT 10H MOV AH,09H ; 显示菜单 MOV DX,OFFSET TOP INT 21HAA: MOV AH,01H ; 从键盘接收一个数字 INT 21H CMP AL,1 ; 与1比较 JNE NEXT1 ; 不等于1就转到NEXT1 JMP JIA ; 等于1就转到加
19、法程序NEXT1: CMP AL,2 ; 与2比较 JNE NEXT2 ; 不等于2就转到NEXT2 JMP JIAN ; 等于2就转到减法程序NEXT2: CMP AL,3 ; 与3比较 JNE NEXT3 ; 不等于3就转到NEXT3 JMP CHENG ; 等于3就转到乘法程序NEXT3: CMP AL,4 ; 与4比较 JNE NEXT4 ; 不等于4就转到NEXT4 JMP CHU ; 等于4就转到除法程序NEXT4: CMP AL,q ; 与q比较 JNE NEXT5 ; 不等于q就转到NEXT5 MOV AH,4CH ; 回DOS INT 21HNEXT5: MOV AH,09H
20、 ; 显示MESG1 MOV DX,OFFSET MESG1 INT 21H JMP AA ; 跳到AAA1 PROC NEAR MOV AH,09H ; 提示输入第一个数 MOV DX,OFFSET MESG2 INT 21H MOV AH,0AH ; 接收第一个数 MOV DX,OFFSET BUF1 INT 21H CALL A2 ; 调用A2进行ASCII-二进制的转换 MOV BUF2,AX ; 把第一个数转换的二进制放在BUF2 MOV AH,09H ; 提示输入第二个数 MOV DX,OFFSET MESG3 INT 21H MOV AH,0AH ; 接收第二个数 MOV DX,
21、OFFSET BUF1 INT 21H CALL A2 ; 调用A2把第二个数进行ASCII-二进制转换 RETA1 ENDPA2 PROC NEAR MOV CL,BUF1+1 ; 把BUF1+1中的实际键入的字符数放入CL MOV CH,0 ; CH清零 MOV BX,OFFSET BUF1+2 ; 把第一个数字的地址放在BX PUSH BX ; 保存BX中的值 PUSH CX ; 保存CX中的值L1: MOV AL,BX AND AL,0FH ; 把ASCII码转换为十进制 MOV BX,AL ; 存放十进制 INC BX ; 下一个数字的地址 LOOP L1 POP CX ; 恢复CX
22、 POP BX ; 恢复BX MOV AX,0 ; 将累加和赋零 MOV SI,10L2: MUL SI ADD AL,BX ADC AH,0 INC BX LOOP L2 ; 累加乘10L3: RET A2 ENDPJIA: MOV AH,09H ; 加法程序 MOV DX,OFFSET MESG4 INT 21H CALL A1 ; 调用A1 ADD AX,BUF2 ; 把转换后的放在BUF2中的第一个数和放在AX JMP A3 ; 的第二个数相加JIAN: MOV AH,09H ; 减法程序 MOV DX,OFFSET MESG5 INT 21H CALL A1 MOV BX,AX ;
23、把转换后的放在AX的第二个数放到BX MOV AX,BUF2 ; 把转换后放在BUF2中的第一个数放到AX SBB AX,BX ; 两数相减 JMP A3CHENG: MOV AH,09H ; 乘法程序 MOV DX,OFFSET MESG6 INT 21H CALL A1 MOV BX,AX ; 把转换后的放在AX的第二个数放到BX MOV AX,BUF2 ; 把转换后的放在BUF2中第一个数放到AX MUL BX ; 两数相乘 JMP A3CHU: MOV AH,09H ; 除法程序 MOV DX,OFFSET MESG7 INT 21H CALL A1 MOV DX,AX ; 把转换后的
24、放在AX的第二个数放到DX MOV AX,BUF2 ; 把转换后的放在BUF2中第一个数放到AX DIV DL ; 两数相除,商在AL里 MOV AH,0H ; 使AH清零 JMP A3A3: MOV BUF3,+ ; 把BUF3放+ CMP AX,0 ; 把结果于0比较 JGE L4 ; AX0转到 L4 NEG AX ; AX0将AX取反 MOV BUF3,- ; 把BUF3放-L4: CWD MOV BX,10000 DIV BX ; 商为第一位数字放在AL,余数放在DX CALL BB MOV BUF3+1,AL ; 把第一个数放在BUF3+1单元中 MOV AX,DX ; 把放在DX
25、中的余数放到AX CWD MOV BX,1000 DIV BX ; 商为第二位数字放在AL,余数放在DX CALL BB MOV BUF3+2,AL ; 把第二个数放在BUF3+2单元中 MOV AX,DX ; 把放在DX中的余数放到AX MOV BL,100 DIV BL ; 商为第三位数字放在AL,余数放在AH CALL BB MOV BUF3+3,AL ; 把第三个数放在BUF3+3单元中 MOV AL,AH ; 把放在AH 中的余数放到AL CBW MOV BL,10 DIV BL ; 商为第四位数字放在AL,余数放在A CALL BB MOV BUF3+4,AL ; 把第四个数放在B
26、UF3+4单元中 ADD AH,30H ; 把个位转为ASSCII码 MOV BUF3+5,AH ; 把第五个数放在BUF3+5单元中 MOV AH,09H ; 提示结果 MOV DX,OFFSET MESG8 INT 21H MOV AH,09H MOV DX,OFFSET BUF3 ; 把放在BUF3缓冲区中的结果显示出来 INT 21H MOV AH,09H ; 提示是返回DOS还是重新计算 MOV DX,OFFSET TOP INT 21H JMP NEXT5 ; 其他数字重新计算BB PROC NEAR CMP AL,0H ; 与零比较 JE L5 JMP L6L5: MOV AL,
27、20H ; 等于零,赋AL空格 JMP L7L6: ADD AL,30H ; 不等于零,把数转为ASSCII码L7: RETBB ENDPA4: MOV AH,4CH ; AL等于Q就返回DOS INT 21HCODE ENDS END START5、调试运行结果5.1 操作说明(1)按提示输入1,2,3,4。(2)1:加法 ADD。(3)2:减法 SUB。(4)3:乘法 MUL。(5)4:除法 DIV。(6) 输入一个十进制数,回车。(7) 再输入一个十进制数,回车。(8) 显示计算结果。(9) 退出按q。5.2 调试运行结果(1)进入系统界面,程序运行截图如图5.1所示。图5.1 进入系统
28、界面(2)加法:算法选择1,按提示输入两个十六进制数,回车后显示计算式和结果。程序运行截图如图5.2所示。图5.2 加法程序截图(3)减法:算法选择2,按提示输入两个十进制数,回车后显示计算结果,程序运行截图如图5.3所示。图5.3 减法程序截图(4)乘法:算法选择3,按提示输入两个十进制数,回车后显示计算结果。程序运行截图如图5.4所示。图5.4 乘法程序截图(5)除法:算法选择3,按提示出入两个十进制数,回车后显示计算结果,程序运行截图如图5.5所示。图5.5 除法程序截图(6)退出:按q键即可退出程序。程序运行截图如图5.6所示。图5.6 退出运行截图程序运行后可以看出,程序完成了十进制
29、加减乘除四则运算,按q键则退出程序,符合设计要求。同时,屏幕上可以显示计算结果,也完成了设计要求。6、心得体会本次为期一周的微机原理与接口课程设计已经结束了,在这并不算长的时间里我却获益良多。第一,我对本学期所学的理论知识有了更加深刻的理解。首先是对汇编语言的编程思想、程序设计流程有了更加深刻的认识。另外,我的课程设计中运用了许多BIOS中断和DOS中断的功能,例如利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。从而加深了我对BIOS和DOS中断的理解。以前在课堂上一些一知半解的东西,经过这次的实际应用也顿时觉得豁然开朗。第二,提高
30、了我理论联系实际的能力。在本科生的学习中,大部分是对理论知识的学习,很少有真正实际应用与实践的机会。每个学期末的课程设计无疑是十分难得的,我们应好好利用并倍加珍惜。在上理论课时,对各种程序设计思想都只是有一种肤浅的认识,并没有特别深刻的了解。即使是实验课也只是停留在比较浅显的阶段,并不能对所学知识进行深入的研究。但这次的课程设计却让我对学习的理论知识有了更加深刻的认识,并将其运用到实际的软件设计中,在学会运用的过程中再一次对理论进行了升华。为以后的工作打下了良好的基础。第三,使我认识到了团结协作的重要性。完成本次课程设计也不是一件轻松的事情,设计的过程中也总会出现这样那样的问题。有些问题凭自己
31、绞尽脑汁的空想是很难解决的,这个时候我们就需要其他同学或老师的帮助。在遇到疑难时,有时看着很困难的问题,在通过与同学们的讨论分析之后就迎刃而解了。由此可见,同学间的互帮互助是非常重要的。同时,在有些问题实在无法解决之时,老师的指点总是关键性的。课程设计的开设不仅巩固了我们对理论知识的掌握,激发了我们对学习的兴趣,同时也锻炼了我们实际动手与应用的能力,使我们对专业领域的知识有了初步的了解,并且提高了我们应用理论知识解决生活中实际存在的问题的能力,这对我们今后走向社会做了良好的开端与铺垫。7、参考文献1 戴梅萼 史嘉权.微型计算机技术及应用(第4版).北京:清华大学出版社,2008.32 黄战华.微机原理与接口技术.北京:机械工业出版社,2002.13 周孟初.微型计算机原理与接口技术.合肥:中国科学技术大学出版社,2012.14 彭虎 周佩珍 傅忠谦.微机原理与接口技术学习指导(第3版).北京:电子工业出版社,20135 凌志浩 张建正.微机原理与接口技术.上海:华东理工大学出版社,20136 邹逢兴.微机原理与接口技术经典实验案例集.北京:高等教育出版社,2012
限制150内