文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言简单计算器程序课程设计报告[1]

汇编语言简单计算器程序课程设计报告[1]

课程设计说明书题目: 简单计算器

院系:

专业班级:

学号:

学生姓名:

指导教师:

2010年 12月 31日

安徽理工大学课程设计(论文)任务书

计算机科学与工程学院硬件教研室

2010年 12月 17 日

安徽理工大学课程设计(论文)成绩评定表

摘要

汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。本次设计的简单计算器支持简单的四则运算。

关键词:汇编语言,简单计算器,高效,硬件

Abstract

Assembly language is a powerful programming language features, but also all the hardware features of computer and can directly control the hardware of the language. Assembly language, as a language, corresponding to high-level language compiler, you need a "assembler" to the assembly language source file compiled into machine executable code. Advanced assembler such as MASM, TASM assembler, and so for us to write high-level language offers many similar features, such as structured, abstract and so on. In such an environment prepared by the assembler, a large part of the directive for the assembler has been similar in the high-level language. Now the compilation environment has such a high, even if all windows in assembly language to write applications that are feasible, but this is not assembly language strengths. The strength lies in assembly language to write efficient hardware and requires precise control of the machine process. This simple calculator designed to support simple arithmetic.

Keywords:assembly language, simple calculator, efficient, hardware

目录

1设计目的 (1)

2概要设计 (2)

2.1 系统总体分析 (2)

2.2 主模块框图及说明 (2)

3 详细设计 (4)

3.1 主模块及子模块说明 (4)

3.2 各模块详细设计 (4)

4.程序调试 (12)

4.1 运行界面分析 (12)

4.2 算法的分析 (12)

4.3 调试过程及分析 (12)

5心得体会 (13)

5.1 设计体会 (13)

5.2 系统改进 (13)

参考文献 (14)

1设计目的

通过本次的课程设计,使自己加深对汇编语言的了解,应用《汇编语言程序设计》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能里的目的。

通过本次课程设计的训练,可以使我在基本思路和基本方法上对基于8086/8088和基于ARM核的汇编语言程序设计有一个比较感性的认识,并具备一定程度的设计能力,从而能够熟练掌握编写汇编语言源程序的基本方法和基本构架,学会编写顺序结构、分支结构、循环结构和子程序的汇编程序,掌握程序中数据的产生与输入输出的方法以及一些关于汇编语言更深层次方面有初步的认识。

2概要设计

2.1 系统总体分析

本次设计的简单计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。由于在设计过程中考虑到了可能会多次计算数据,为此本次课程设计我设计的这个简单计算器可以一次运行,多次使用。本程序使用了函数和宏混用的方式实现了代码的较好的可读性,使程序看起来结构严谨。

2.2 主模块框图及说明

本程序的功能结构图如图2-1:

图 2-1 功能结构图

程序流程图如图2-2

图2-2流程图

3 详细设计

3.1 主模块及子模块说明

主模块:主要完成程序的主体框架结构,提供人-程序的交互。

子模块:主要完成对数据的加工,处理。

3.2 各模块详细设计

主模块:

首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。整个过程按“ESC”结束。流程图如下图3-1:

图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

;-------------------------------

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,0dh,0ah DB ' * *',0DH,0AH

;db '* *',0dh,0ah

;db '* *',0dh,0ah

DB ' * --------caculater-------- *',0DH,0AH ;,0dh,0ah,0dh,0ah

DB ' * *',0DH,0AH

DB ' * *',0DH,0AH

DB ' * *',0DH,0AH

DB ' * NUM1:'

DB ' *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh

DB ' * *',0DH,0AH

DB ' * *',0DH,0AH

DB ' * *',0DH

DB ' * NUM2:'

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 ' * * * * * * * * * * * * * * * * * * * *','$'

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!','$'

NUM1 DW ?

NUM2 DW ?

子模块:

完成对数据的进一步加工处理,转换格式并得出结果。首先根据输入调用对应的“+”、“-”、“*”、“/”四大函数模块,这是本程序的核心模块,其他部分的一些小模块都是为这几大模块服务的,大致的流程图如下图3-2:

Y

图3-2 子模块流程图

代码如下:

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 NUM1,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 NUM2,BX

MOV AX,NUM1

MOV BX,NUM2

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

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

MULT: POP BX

POP AX

MUL BX ;计算两数之积

PUSH AX

CURS 14,41 ;设置光标位置为(14,41)

POP AX

CALL CHANGE ;将结果转换为十进制数

JMP D1

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

4.程序调试

4.1 运行界面分析

运行界面如图4-1

图4-1 运行界面

在NUM1这一行会提示输入第一个数据,NUM2这一行提示输入第二个数据,输入完成两个数据后程序会提示允许输入运算符,输入无误后在RESULT行显示结果。

4.2算法的分析

本程序使用了宏和函数调用的方法,这样做使得整个程序体看上去严谨,舒服。整个程序中的CHANGE子程序,将十六进制数转换为十进制数。BEGIN子程序开始运算。DISPMSG子程序,显示用户界面。通过这几个及程序的协助,使得这个系统可以正常的运行。

4.3 调试过程及分析

编写完代码后分别点击按钮“C”,”L”,”R”,依次完成编译、连接和运行过程,也可以进入DOS环境下用DEBUG命令完成类似的功能,整个程序按“ESC”退出。

5心得体会

5.1 设计体会

本次课程设计我有不少收获:在选好了题目之后我查阅了不少资料,加深的对汇编语言的认识;在往后的几周上机实践中,对汇编语言源程序的编辑、汇编、连接和调试的全过程更加熟练;在不断地求解过程中,了解到了汇编语言的一些特点,感觉到汇编语言的执行效率非常高,由于汇编是对底层的操作,这一点决定了它在代码的产量方面不如一些高级语言。

本次课程设计的成功完成,我首先感谢我的指导老师刘向举,他自始至终都给予了我莫大的帮助,正是在刘向举老师的悉心指导下我才能顺利完成本次课程设计中的每一个计划。在这次课程设计中,无论从课题选择,方案论证上,还是到具体的设计和调试,每一项安排他都提出了至关重要的建议,使我少走了许多弯路,节省了大量时间,可以说,我的课程设计的顺利完成凝聚着老师的大量心血,在此向刘向举老师表示深深的感谢。

当然,我也要感谢我的同学和那些互联网上的朋友,他们毫不吝啬的将自己所掌握的知识拿出来资源共享,才能使我的部分功能模块得以实现,谢谢他们

5.2 系统改进

本程序有一些问题:

1)不能进行混合的四则运算

2)能计算的数值范围有限,容易产生益处

3)不能进行有关小数的四则运算

4)在进行除法运算时的精确度不高

在以后的时间里,我会改进一些问题,力争使该程序完美。

相关文档
相关文档 最新文档