文档视界 最新最全的文档下载
当前位置:文档视界 > 简易计算器程序设计

简易计算器程序设计

课程设计任务书

学生姓名:于强专业班级:电气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