课程设计任务书
学生姓名:于强专业班级:电气0603
指导教师:刘劲松工作单位:武汉理工大学自动化学院
题目: 简易计算器程序设计
初始条件:
用汇编语言编写程序,实现简易计算器的功能。
要求完成的主要任务:
(1)简易计算器可进行2位十进制数以内的加减法运算;
(2)使用0~9数字键,+、-、=功能键,“C”或“c”作为清除键。如键入“11+12=”后即输出“23”,单击“C”或“c”键后清屏;
(3)可连续输入数据进行计算,直至单击“Q”或“q”键退出程序。
时间安排:
指导教师签名:年月日
系主任(或责任教师)签名:年月日
简易计算器程序设计
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光标定位程序段
CURS MACRO A,B
MOV AH,2 ;置光标位置
MOV BH,0 ;页号为0
MOV DH,A ;设置光标的坐标为(A.B)
MOV DL,B
INT 10H ;BIOS调用
ENDM
该程序段的总用时当调用该子程序时,只需如下列方式调用,如:CURS 2,20.此时表明将光标定位到屏幕(2,20)
3.2清屏程序段
CLEAR MACRO COLOR ;清屏
MOV AH,6 ;屏幕初始化
MOV AL,0 ;页号
MOV CH,0 ;设置左上角的坐标为(0,0)
MOV CL,0
MOV DL,100 ;设置右上角的坐标为(100,100)
MOV DH,100
MOV BH,COLOR ;卷入行属性
INT 10H ;BIOS调用
ENDM
该程序段的总用时是清除屏幕显示内容,调用方式:CLEAR 1EH
3.3输入程序段
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 ;如果不是,则转移至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调用
CMP 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
该程序段是输入数据,能使输入的数据相应的进行储存,并且之后可以调用,同时判断是否输入错误。
3.4判断计算类型,并计算
INT 21H ;DOS调用
CMP AL,'+'
JE ADDI ;如果运算符为+,则计算两数之和
CMP AL,'-'
JE SUBT ;如果运算符为-,则计算两数之差
CMP AL,'*'
JE MULT ;如果运算符为*,则计算两数之积
CMP AL,'/'
JE DIVI ;如果运算符为/,则计算两数之商
判断类型,并且调用相应的程序段或命令进行计算
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程序附录
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,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,0d h,0ah
DB ' * *',0DH,0AH
;db '* *',0dh,0ah
;db '* *',0dh,0ah
DB ' *
--------COUNTER--------
*',0DH,0AH ;,0dh,0ah,0d
h,0ah
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * DATA1:'
DB '_______________
*',0DH,0AH ;,0dh,0ah,0d
h,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * DATA2:'
DB '_______________
*',0DH,0AH ;,0dh,0ah,0d
h,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * RESULT:'
DB '_______________
*',0DH,0AH,0DH ;,0ah,0d
h,0ah,0dh,0ah,0dh,0ah,0
dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * * * * * * * * * *
* * * * * * * * * *','$'
MSG1 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!','$'
DATA1 DW ?
DATA2 DW ?
.CODE ;代码段从这里开始
;----------------------
----------------------
DEC_DIV PROC NEAR
CWD ;将字转换为双字,AX
内容符号扩展到DX
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 ;AX≥1000则转移
CMP AX,100
JAE C2 ;AX≥100则转移CMP AX,10
JAE C3 ;AX≥10则转移JMP C4 ;AX<10
C1: MOV CX,1000D
CALL DEC_DIV
C2: MOV 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 ;如果不是,则转移至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调用
CMP 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 ;设置光标的位
置为(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
;----------------------
------------------
;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 THE 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
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则
跳转
JMP D1
LOP: MOV CX,4 ;设置精确
度为小数点后4位
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 ;设置
光标位置为(15,33)
DISPMSG MSG8 ;提示出错
D1: RET
D2: PUSH AX
PUSH BX
CURS 15,33 ;设置光标位置
为(15,33)
DISPMSG MSG7 ;提示输入出
错
POP BX
POP AX
RET
BEGIN ENDP
;----------------------
------------------
MAIN PROC NEAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
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调用
CMP AL,27 ;判断输入的是
否为ESC
JNE AGAIN ;如果不是就继
续执行以上运算
EXIT: MOV AX,4C00H ;如果
是就退出系统
INT 21H ;DOS调用
MAIN ENDP
END MAIN