课程设计说明书题目: 简单计算器院系:专业班级:学号:学生姓名:指导教师:2010年12月31日安徽理工大学课程设计(论文)任务书计算机科学与工程学院硬件教研室2010年 12月 17 日安徽理工大学课程设计(论文)成绩评定表摘要汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。
汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。
高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。
在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。
现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。
汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。
本次设计的简单计算器支持简单的四则运算。
关键词:汇编语言,简单计算器,高效,硬件AbstractAssembly 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.1 系统总体分析本次设计的简单计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。
由于在设计过程中考虑到了可能会多次计算数据,为此本次课程设计我设计的这个简单计算器可以一次运行,多次使用。
本程序使用了函数和宏混用的方式实现了代码的较好的可读性,使程序看起来结构严谨。
2.2 主模块框图及说明本程序的功能结构图如图2-1:图 2-1功能结构图程序流程图如图2-2:图2-2流程图3.1 主模块及子模块说明主模块:主要完成程序的主体框架结构,提供人-程序的交互。
子模块:主要完成对数据的加工,处理。
3.2 各模块详细设计主模块:首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。
如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。
整个过程按“ESC”结束。
流程图如下图3-1:NY图3-1 主模块流程图代码如下:CURS MACRO A,BMOV AH,2 ;置光标位置MOV BH,0 ;页号为0MOV DH,A ;设置光标的坐标为(A.B)MOV DL,BINT 10H ;BIOS调用ENDM;DISPMSG MACRO MESSAGELEA 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,0MOV DL,100 ;设置右上角的坐标为(100,100)MOV DH,100MOV 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,0ahDB ' * caculater *',0DH,0AH ;,0dh,0ah,0dh,0ahDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * NUM1:'DB ' *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dhDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * *',0DHDB ' * NUM2:'DB ' *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dhDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * *',0DHDB ' * RESULT:'DB ' *',0DH,0AH,0DH ;,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dhDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * *',0DH,0AHDB ' * * * * * * * * * * * * * * * * * * * *','$'MSG1 DB 'choose +,-,*,/','$'MSG2 DB 'you choose wrong','$',0AH,0DHMSG3 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:NY图3-2 子模块流程图代码如下:BEGIN PROC NEARBACK: CLEAR 1EHCURS 2,20 ;设置光标为(2.20)DISPMSG MSG0 ;显示用户界面CURS 8,41 ;设置光标为(8,41),第一行MOV BX,0MOV CX,2NEWCHAR1:MOV AH,1 ;键盘输入并回显INT 21H ;DOS调用CMP AL,30H ;检查输入的字符是不是数字JAE J1 ;如果不是,则转移至J1JMP D2 ;是,转移到D2执行J1: CMP AL,39H ; 与9的ASCII比较JBE J2 ;如果输入的字符是0-9,则转移至J2JMP D2 ;如果不是数字,则转移至D2J2: SUB AL,30HCBW ;AL的内容符号扩展到AHXCHG AX,BXMOV DI,10MUL DIXCHG AX,BXADD BX,AXLOOP NEWCHAR1MOV NUM1,BXCURS 11,41 ;设置光标位为(11,40),第二行MOV BX,0MOV CX,2NEWCHAR2:MOV AH,1 ;键盘输入并回显INT 21H ;DOS调用CMP AL,30H ;与0的ASCII码比较JAE J3 ;如果输入数字大于等于0则跳转至J3JMP D2J3: CMP AL,39H ;与9比较JBE J4 ;如果小于或等于9则跳转JMP D2 ;如果输入不是数字则跳转J4: SUB AL,30H ;如果输入不是0-9,则转化成相应的字符CBW ;将AL符号扩展到AHXCHG AX,BXMOV DI,10MUL DIXCHG AX,BXADD BX,AXLOOP NEWCHAR2MOV NUM2,BXMOV AX,NUM1MOV BX,NUM2PUSH AXPUSH BXCURS 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 DATASADDI: POP BXPOP AXADD AX,BX ;计算两数字之和PUSH AXCURS 14,41 ;设置光标位置为(14,41)POP AXCALL CHANGE ;将结果转换为十进制数JMP D1SUBT: POP BXPOP AXCMP AX,BX ;比较两数大小JAE D0 ;如果AX>=BX则跳转XCHG AX,BXPUSH AXPUSH BXCURS 14,40 ;设置光标位置为(14,40)DISPMSG MSG5 ;在屏幕上显示负号POP BXPOP AXD0: SUB AX,BX ;计算两数之差PUSH AXCURS 14,41 ;设置光标位置为(14,41)POP AXCALL CHANGE ;将结果转换为十进制数JMP D1MULT: POP BXPOP AXMUL BX ;计算两数之积PUSH AXCURS 14,41 ;设置光标位置为(14,41)POP AXCALL CHANGE ;将结果转换为十进制数JMP D1DIVI: POP BXPOP AXCMP BX,0 ;判断除数是否为0JE ERROR ;如果是0则跳转CWDDIV BX ;计算两数之商PUSH DXPUSH AXCURS 14,41 ;设置光标位置为(14,41)POP AXCALL CHANGE ;将十六进制数转换为十进制数POP DXCMP DX,0JNE LOP ;如果DX不等于0则跳转JMP D1LOP: MOV CX,4 ;设置精确度为小数点后4位PUSH DXDISPMSG MSG6 ;输出小数点POP DXCON: PUSH BXMOV AX,DXMOV BX,10MUL BXPOP BXCWD ;将AX的内容符号扩展到双字DIV BX ;计算小数点后每一位的数字PUSH DXPUSH CXCALL CHANGE ;将十六进制数转化为十进制数POP CXPOP DXCMP DX,0 ;判断是否已经计算到小数点后第六位JE D1 ;如果是,则跳转LOOP CON ;如果不是,就继续计算ERROR: CURS 15,33 ;设置光标位置为(15,33)DISPMSG MSG8 ;提示出错D1: RETD2: PUSH AXPUSH BXCURS 15,33 ;设置光标位置为(15,33)DISPMSG MSG7 ;提示输入出错POP BXPOP AXRETBEGIN ENDP4.程序调试4.1 运行界面分析运行界面如图4-1图4-1 运行界面在NUM1这一行会提示输入第一个数据,NUM2这一行提示输入第二个数据,输入完成两个数据后程序会提示允许输入运算符,输入无误后在RESULT行显示结果。