简易计算器程序设计剖析.docx
《简易计算器程序设计剖析.docx》由会员分享,可在线阅读,更多相关《简易计算器程序设计剖析.docx(21页珍藏版)》请在冰点文库上搜索。
简易计算器程序设计剖析
课程设计任务书
学生姓名:
于强专业班级:
电气0603
指导教师:
刘劲松工作单位:
武汉理工大学自动化学院
题目:
简易计算器程序设计
初始条件:
用汇编语言编写程序,实现简易计算器的功能。
要求完成的主要任务:
(1)简易计算器可进行2位十进制数以内的加减法运算;
(2)使用0~9数字键,+、-、=功能键,“C”或“c”作为清除键。
如键入“11+12=”后即输出“23”,单击“C”或“c”键后清屏;
(3)可连续输入数据进行计算,直至单击“Q”或“q”键退出程序。
时间安排:
周次
具体时间
设计内容
第一周
1月4日
指导老师就课程设计内容、设计要求、设计进度安排、评分标准等作具体介绍。
强调课程设计期间纪律要求。
学生确定选题,明确设计内容及要求。
1月5日~6日
根据选题查阅资料,完成方案的初步设计,绘制程序流程草图。
1月7日
中期检查及答疑(向指导老师阐述设计思路,并解释程序流程图)。
1月8日
根据中期检查意见修改程序流程图,编写程序代码。
第二周
1月9日
程序调试、修改。
1月10日
指导老师检查程序运行效果,并就结果进行评分。
1月11~12日
学生撰写课程设计说明书。
1月13日
上交课程设计说明书,以及答辩。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
简易计算器程序设计
1程序分析及其方案
1.1程序分析
该程序的目的是通过汇编语言,实现简单的两位十进制数内的加减运算。
程序通过数字和符号的输入,可以自动的出相应的计算结果。
例如:
在屏幕中输入:
“10+2=”,回车输入后,屏幕显示“10+2=12”。
并且该程序要求输入字母“C”或者“c”后,能清除屏幕内容。
输入字母“Q”或者“q”后可以退出程序。
经过分析我们可以知道,程序主要由三个模块组成:
1.计算模块。
该模块的总用时能判断输入的数据和判断相应的运算类型。
2.清屏模块。
该模块的作用是当键入相应的指令,可以清除屏幕内容,使屏幕处于开始状态,清楚原来显示内容。
3.退出模块。
当键入相应指令后,程序可以自动退出。
1.2设计方案
设计时应该充分考虑任务书所给的各项要求。
我在“微机原理实验平台集成开发环境”中进行程序的开发、修改和调试运行等测试。
在进行程序设计时,先进行程序的整体思路与要求,也就是设计内容的分析。
当分析好后,画出相应的流程图,以便在写代码时,能够有一个比较好的思路。
之后对所写的程序进行调试,看看所写的程序是否能满足系统要求。
如果不能,则需要进行相应的修改,知道达到相应的要求。
2程序流程图设计及说明
2.1设计说明
程序设计遵循模块化程序,这样可以大大降低重复语句,增加程序的高效性。
首先,设计处各个模块的作用。
因为程序分别涉及到退出、清屏、计算、输入功能,因此再设计程序时,将这些功能模块化。
在进行编制成功后,如果需要运行,只需要在主程序中进行相应的模块调用,就能实现相应的功能。
在设计模块时,应该把所有模块写在主程序前边或者在主程序前边有相应的定义。
之后再根据每个模块的不同要求进行模块的编写。
在写主程序时,当碰到相应的功能,此时只要通过命令调用模块,运行好,把模块计算的值返回这样可以实现模块的整体化,提高程序的高效,易修改,易查错的要求。
2.2流程方框图
图2-1程序流程方框图
3程序设计
3.1光标定位程序段
CURSMACROA,B
MOVAH,2;置光标位置
MOVBH,0;页号为0
MOVDH,A;设置光标的坐标为(A.B)
MOVDL,B
INT10H;BIOS调用
ENDM
该程序段的总用时当调用该子程序时,只需如下列方式调用,如:
CURS2,20.此时表明将光标定位到屏幕(2,20)
3.2清屏程序段
CLEARMACROCOLOR;清屏
MOVAH,6;屏幕初始化
MOVAL,0;页号
MOVCH,0;设置左上角的坐标为(0,0)
MOVCL,0
MOVDL,100;设置右上角的坐标为(100,100)
MOVDH,100
MOVBH,COLOR;卷入行属性
INT10H;BIOS调用
ENDM
该程序段的总用时是清除屏幕显示内容,调用方式:
CLEAR1EH
3.3输入程序段
CURS2,20;设置光标为(2.20)
DISPMSGMSG0;显示用户界面
CURS8,41;设置光标为(8,41),第一行
MOVBX,0
MOVCX,2
NEWCHAR1:
MOVAH,1;键盘输入并回显
INT21H;DOS调用
CMPAL,30H;检查输入的字符是不是数字
JAEJ1;如果不是,则转移至J1
JMPD2;是,转移到D2执行
J1:
CMPAL,39H;与9的ASCII侣氡
JBEJ2;如果输入的字符是0-9,则转移至J2
JMPD2;如果不是数字,则转移至D2
J2:
SUBAL,30H
CBW;AL的内容符号扩展到AH
XCHGAX,BX
MOVDI,10
MULDI
XCHGAX,BX
ADDBX,AX
LOOPNEWCHAR1
MOVDATA1,BX
CURS11,41;设置光标位为(11,40),第二行
MOVBX,0
MOVCX,2
NEWCHAR2:
MOVAH,1;键盘输入并回显
INT21H;DOS调用
CMPAL,30H;与0的ASCII码比较
JAEJ3;如果输入数字大于等于0则跳转至J3
JMPD2
J3:
CMPAL,39H;与9比较
JBEJ4;如果小于或等于9则跳转
JMPD2;如果输入不是数字则跳转
J4:
SUBAL,30H;如果输入不是0-9,则转化成相应的字符
CBW;将AL符号扩展到AH
XCHGAX,BX
MOVDI,10
MULDI
XCHGAX,BX
ADDBX,AX
LOOPNEWCHAR2
MOVDATA2,BX
MOVAX,DATA1
MOVBX,DATA2
PUSHAX
PUSHBX
该程序段是输入数据,能使输入的数据相应的进行储存,并且之后可以调用,同时判断是否输入错误。
3.4判断计算类型,并计算
INT21H;DOS调用
CMPAL,'+'
JEADDI;如果运算符为+,则计算两数之和
CMPAL,'-'
JESUBT;如果运算符为-,则计算两数之差
CMPAL,'*'
JEMULT;如果运算符为*,则计算两数之积
CMPAL,'/'
JEDIVI;如果运算符为/,则计算两数之商
判断类型,并且调用相应的程序段或命令进行计算
4程序调试
1.通过编译系统编译调试连接后,启动程序,如4-1显示:
图4-1程序启动后显示内容
2.随意输入两个2位十进制内数字,如下图4-2
图4-2输入两个有运算关系的数字
3.此时,按照选择上的choose进行需要进行的运算类型的选择比如上图我们选择加法,得出结果如下下图4-3所示
图4-3输入后显示的结果,并且程序从新开始
4.此时按照屏幕上所示,但按下‘Q’或者‘q’后,程序退出,当拿下其他任意键,屏幕清屏,然后可继续进行运算。
如下图4-4
图4-4清屏
5心得体会
通过本次实验,能初步理论联系实际,应用汇编语言,能简单设计出软件,并且能通自己的调试进行修改。
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,计算机已经成为当今社会生活工作中空前活跃的领域,在生活中可以说得是无处不在。
回顾起此次微机原理与接口技术课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说如何对程序的初始进行变成,如何利用流程方块图……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多思路,编程问题,最后在刘劲松老师的辛勤指导下,和同学的帮助下,终于游逆而解。
同时,在刘劲松老师的身上我学得到很多实用的知识,在次我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
6参考文献
[1]《微机原理与接口技术》主编:
周佩玲彭虎傅忠谦出版社:
电子工业出版社2007
[2]《微机原理与接口技术学习指导》主编:
周佩玲彭虎傅忠谦出版社:
电子工业出版社2007
[3]《计算机高级应用》主编:
章工荣出版社:
高等教育2004
[4]《计算机程序设计基础》主编:
李文成出版社:
科学出版社2007
[5]《C语言高级程序设计及其讲解》主编:
张锦程出版社:
机械工业出版社2000
7程序附录
CURSMACROA,B
MOVAH,2;置光标位置
MOVBH,0;页号为0
MOVDH,A;设置光标的坐标为(A.B)
MOVDL,B
INT10H;BIOS调用
ENDM
;-------------------------------
DISPMSGMACROMESSAGE
LEADX,MESSAGE;传递MESSAGE的偏移地址
MOVAH,9;显示字符串
INT21H;DOS调用
ENDM
;----------------------------------
CLEARMACROCOLOR;清屏
MOVAH,6;屏幕初始化
MOVAL,0;页号
MOVCH,0;设置左上角的坐标为(0,0)
MOVCL,0
MOVDL,100;设置右上角的坐标为(100,100)
MOVDH,100
MOVBH,COLOR;卷入行属性
INT10H;BIOS调用
ENDM
.MODELSMALL
.STACK
.DATA;数据段定义
MSG0DB'********************',0DH,0AH;,0dh,0ah,0dh,0ah
DB'**',0DH,0AH
;db'**',0dh,0ah
;db'**',0dh,0ah
DB'*--------COUNTER--------*',0DH,0AH;,0dh,0ah,0dh,0ah
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'*DATA1:
'
DB'_______________*',0DH,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,0dh,0ah,0dh,0ah,0dh
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'********************','$'
MSG1DB'choose+,-,*,/','$'
MSG2DB'youchoosewrong','$',0AH,0DH
MSG3DB'PressESCtoExit!
',0DH,0AH,'$'
MSG4DB'Pressanykeytocontinue!
',0DH,0AH,'$'
MSG5DB'-','$'
MSG6DB'.','$'
MSG7DB'errorinput!
','$'
MSG8DB'data2iswrong!
','$'
DATA1DW?
DATA2DW?
.CODE;代码段从这里开始
;--------------------------------------------
DEC_DIVPROCNEAR
CWD;将字转换为双字,AX内容符号扩展到DX
DIVCX
PUSHDX
MOVDL,AL
ADDDL,30H;将不是数字的字符转换为数字
MOVAH,2;显示输出
INT21H;DOS调用
POPDX
MOVAX,DX
RET
DEC_DIVENDP
;------------------------------------------
CHANGEPROCNEAR;该子程序的功能:
将AX中存储的十六进制数转换为十进制数
CMPAX,1000
JAEC1;AX≥1000则转移
CMPAX,100
JAEC2;AX≥100则转移
CMPAX,10
JAEC3;AX≥10则转移
JMPC4;AX<10
C1:
MOVCX,1000D
CALLDEC_DIV
C2:
MOVCX,100D
CALLDEC_DIV
C3:
MOVCX,10D
CALLDEC_DIV
C4:
MOVCX,1D
CALLDEC_DIV
RET
CHANGEENDP
;-------------------------------
BEGINPROCNEAR
BACK:
CLEAR1EH
CURS2,20;设置光标为(2.20)
DISPMSGMSG0;显示用户界面
CURS8,41;设置光标为(8,41),第一行
MOVBX,0
MOVCX,2
NEWCHAR1:
MOVAH,1;键盘输入并回显
INT21H;DOS调用
CMPAL,30H;检查输入的字符是不是数字
JAEJ1;如果不是,则转移至J1
JMPD2;是,转移到D2执行
J1:
CMPAL,39H;与9的ASCII侣氡
JBEJ2;如果输入的字符是0-9,则转移至J2
JMPD2;如果不是数字,则转移至D2
J2:
SUBAL,30H
CBW;AL的内容符号扩展到AH
XCHGAX,BX
MOVDI,10
MULDI
XCHGAX,BX
ADDBX,AX
LOOPNEWCHAR1
MOVDATA1,BX
CURS11,41;设置光标位为(11,40),第二行
MOVBX,0
MOVCX,2
NEWCHAR2:
MOVAH,1;键盘输入并回显
INT21H;DOS调用
CMPAL,30H;与0的ASCII码比较
JAEJ3;如果输入数字大于等于0则跳转至J3
JMPD2
J3:
CMPAL,39H;与9比较
JBEJ4;如果小于或等于9则跳转
JMPD2;如果输入不是数字则跳转
J4:
SUBAL,30H;如果输入不是0-9,则转化成相应的字符
CBW;将AL符号扩展到AH
XCHGAX,BX
MOVDI,10
MULDI
XCHGAX,BX
ADDBX,AX
LOOPNEWCHAR2
MOVDATA2,BX
MOVAX,DATA1
MOVBX,DATA2
PUSHAX
PUSHBX
CURS15,33;设置光标的位置为(15.33),第三行
DISPMSGMSG1;显示提示信息
MOVAH,1;接受键盘输入并回显
INT21H;DOS调用
CMPAL,'+'
JEADDI;如果运算符为+,则计算两数之和
CMPAL,'-'
JESUBT;如果运算符为-,则计算两数之差
CMPAL,'*'
JEMULT;如果运算符为*,则计算两数之积
CMPAL,'/'
JEDIVI;如果运算符为/,则计算两数之商
CURS16,25;设置光标为(16,25)
DISPMSGMSG2;在屏幕上输出提示信息
JMPD1
;----------------------------------------
;ADDTHETWODATAS
ADDI:
POPBX
POPAX
ADDAX,BX;计算两数字之和
PUSHAX
CURS14,41;设置光标位置为(14,41)
POPAX
CALLCHANGE;将结果转换为十进制数
JMPD1
;---------------------------------------
;SUBTRACTTHETWODATAS
SUBT:
POPBX
POPAX
CMPAX,BX;比较两数大小
JAED0;如果AX>=BX则跳转
XCHGAX,BX
PUSHAX
PUSHBX
CURS14,40;设置光标位置为(14,40)
DISPMSGMSG5;在屏幕上显示负号
POPBX
POPAX
D0:
SUBAX,BX;计算两数之差
PUSHAX
CURS14,41;设置光标位置为(14,41)
POPAX
CALLCHANGE;将结果转换为十进制数
JMPD1
;---------------------------------------
;MULTIPLYTHETWODATAS
MULT:
POPBX
POPAX
MULBX;计算两数之积
PUSHAX
CURS14,41;设置光标位置为(14,41)
POPAX
CALLCHANGE;将结果转换为十进制数
JMPD1
;---------------------------------------
;DIVIDETHETWODATAS
DIVI:
POPBX
POPAX
CMPBX,0;判断除数是否为0
JEERROR;如果是0则跳转
CWD
DIVBX;计算两数之商
PUSHDX
PUSHAX
CURS14,41;设置光标位置为(14,41)
POPAX
CALLCHANGE;将十六进制数转换为十进制数
POPDX
CMPDX,0
JNELOP;如果DX不等于0则跳转
JMPD1
LOP:
MOVCX,4;设置精确度为小数点后4位
PUSHDX
DISPMSGMSG6;输出小数点
POPDX
CON:
PUSHBX
MOVAX,DX
MOVBX,10
MULBX
POPBX
CWD;将AX的内容符号扩展到双字
DIVBX;计算小数点后每一位的数字
PUSHDX
PUSHCX
CALLCHANGE;将十六进制数转化为十进制数
POPCX
POPDX
CMPDX,0;判断是否已经计算到小数点后第六位
JED1;如果是,则跳转
LOOPCON;如果不是,就继续计算
ERROR:
CURS15,33;设置光标位置为(15,33)
DISPMSGMSG8;提示出错
D1:
RET
D2:
PUSHAX
PUSHBX
CURS15,33;设置光标位置为(15,33)
DISPMSGMSG7;提示输入出错
POPBX
POPAX
RET
BEGINENDP
;----------------------------------------
MAINPROCNEAR
MOVAX,@DATA
MOVDS,AX
MOVES,AX
PUSHDS
XORAX,AX
PUSHAX
MOVDATA2,0;将缓冲区清空
MOVDATA1,0
AGAIN:
CALLBEGIN
CURS16,23;设置光标位置为(16.23)
DISPMSGMSG3;在屏幕上输出提示信息,提示退出的方法
CURS17,23;设置光标位置为(17.23)
DISPMSGMSG4;在屏幕上输出提示信息,提示继续的方法
MOVAH,7;键盘输入,无回显
INT21H;DOS调用
CMPAL,27;判断输入的是否为ESC
JNEAGAIN;如果不是就继续执行以上运算
EXIT:
MOVAX,4C00H;如果是就退出系统
INT21H;DOS调用
MAINENDP
ENDMAIN