(此文档为word格式,下载后您可任意编辑修改!) 昆明学院课程设计(大作业)目录1题目分析 (5)2基本理论 (5)3 总体设计 (6)3.1 本程序的功能结构图 (6)3.2字符输入及存储设计 (8)3.3加、减、乘、除法运算的判断设计 (8)3.4加、减、乘、除法运算的设计 (9)4实验器材 (10)5方法步骤 (11)6成效分析 (11)6.1运行界面分析 (11)6.2调试过程及分析 (13)7心得体会 (14)8参考文献 (14)9附录 (14)课程设计(大作业)报告一、题目分析本次设计的简单计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。
重点和难点主要包括以下几个方面:(1)利用BIOS调用中INT 16H调用中的子程序完成清屏、设置显示方式、设置窗口等操作。
(2)利用INT 21H DOS系统功能调用中的键盘输入接收十进制操作数和运算符由程序完成字符转换为二进制数,并存储起来。
(3)根据运算符完成运算,由程序在屏幕上显示运算结果。
1、十进制数转换为二进制数过程如下:(1)将BX清0.(2)从键盘接收一个按键的ASCII送AL中,并判断是否为0到9之间的字符,若不是转退出;否则将AL中内容减30H,转换为相应数字的二进制数,并扩展到AX中,然后将BX中内容乘以10后,再加上AX中的内容。
(3)转(2)继续执行因此程序退出后,BX中的内容即为所输入十进制数的二进制值。
例如:首先将BX清0后,先输入数字“5”,则(AL)=35H,属于0到9之间的数字,减30H后,(AL)=05H,扩展后,(AX)=0005H,BX乘以10后,加上AX中的内容,(BX)=0005H。
然后输入数字“8”,则(AL)=38H,属于0到9 之间的数字,减30H后,(AL)=38H,扩展后,(AX)=0008H,(BX)乘以10后,加上AX中的内容,(BX)=0037H,为十进制数“58”的二进制值。
十进制数显示过程如下(被显示的数据<9999):(1)将被显示的内容送入BX中;(2)BX除以1000,余数送BX,商在AL中,范围为0~9;(3)显示AL中的内容;(4)(BX)除以100,余数送BX,商在AL中,范围为0~9;(5)显示AL中的内容。
以此类推,直到分离出个位数字为止。
在这里有一个特殊问题需要讨论:例如“53”这个十进制数,除以1000除以100的商都为0,不应显示。
为了能够实现高位的“0”不显示,程序中设置一个标志M,初始值都设置为1。
若M=1且商为0,则这个0不现实;若M=1且商不为0,则说明这是第一个非0数字,开始显示,并将M设置为0;若M=0,则商值都显示。
如果结果本身就是0,则个位的0显示。
二、基本理论本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
比如,十进制数的加减乘除四则运算。
我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
首先我们要解决的是输入问题,这里我们用INT 21H的一号功能调用来进行输入;然后我们要进行的是判断是进行何种运算,当输入的运算符号不是“+、-、*、/”中的一种时,则报错,提示重新输入。
当输入的是 q或Q时,则清屏。
由于运算过程中出现的进借位问题,会导致输出的结果为一位数,二位数,或者是负数,所以在选择输出的方式时功能调用会很不方便,因为功能调用要求有一个输出字符的缓冲区,由于输出的结果形式太多,缓冲区太难确定,而且若结果为负数,负号也得事先进行设置,所以单字符输出是一个合理的选择。
最后还要对这个简易计算器进行功能完善,例如为了使程序符合我们使用者的操作习惯,我们可以添加按回车键换行输入,即当键入回车键后,可以换行重新输入;可以设置按Q或q键清屏。
三、总体设计3.1本程序的功能结构图如图3-1:图 3-1功能结构图程序设计流程图该程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。
通过流程图,可以看出程序开始运行时,首先输出提示语句,再输入字符,并判断输入的字符是否为Q或q,若是,则清屏重新输入,否则继续输入;判断输入的是不是回车键,若是就回车换行输入,不是则继续输入;判断输入的是否为0~9,+,-,=这些字符,若不是会报错,是则将其存储到定义的数据区BX里面,再判断如果输入的不是=功能键,则继续输入,若是,则判断是做加法运算还是减法运算,最后输出结果,并重新输入,继续上面的步骤。
3.2字符输入及存储设计利用INT 21H的1号中断一个一个地输入字符,并将输入地字符和Q,q比较,如果相等则清屏并重新输入,不等就判断输入的字符是否为0DH即回车键对应的ASCII码值,再看输入的是否为0~9,+,-,=这几个字符,若是则存储,若不是就在屏幕上输出错误提示,程序如下:CHAR PROC NEARMOV BX,0NEWCHAR:MOV AH,01HINT 21H ;通过键盘输入一个十进制数CMP AL,30HJL EXITCMP AL,39HJG EXIT ;输入字符不在0-9之间,转结束SUB AL,30H ;否则减30H,将ASCII转化为二进制数MOV AH,0 ;扩展至AX中XCHG AX,BXMOV CX,10MUL CXXCHG AX,BXADD BX,AX ;完成(BX)×10+AX,结果送入BX 中JMP NEWCHAR ;转NEWCHAREXIT:RETCHAR ENDP3.3加、减、乘、除法运算的判断设计由于输入字符的格式固定为两位数加两位数的格式,则只需把存在BUF数据区的第三个字符提出来并与加号的ASCII码值进行比较即可判断为加法过算还是减法运算了,若相等则为加法过算不等则为减法运算,具体程序实现如下:ADD_TO PROC NEARCALL CHAR ;调子程序CHAR,完成第一个运算转换 MOV X,BX ;第一个数送X单元中CMP AL,2DHJZ MINU ;运算符=“-”,转MINU,执行减法CMP AL,2AHJZ MUL_ ;运算符=“*”,转MUL_,执行乘法CMP AL,2FHJZ DIV_ ;运算符=“/,转DIV_,执行除法CMP AL,51HJZ EXIT8 ;(AL)=“Q”,转EXIT8CALL CHAR ;否则调子程序CHAR,输入第2个数 CALL CR_ ;调子程序CR_,显示“=”MOV Y,BXADD BX,X ;执行加法运算,结果送入BX中 JMP TO_ ;转TO_3.4加、减、乘、除法运算的设计MINU:CALL CHAR ;调子程序CHAR,输入第2个数CALL CR_ ;调子程序CR_,显示“=”MOV Y,BX ;第二个数送入Y单元MOV BX,XCMP BX,Y ;被减数<减数,转T_JL T_SUB BX,Y ;否则完成X减Y,结果送入BX中JMP TO_ ;转TO_,显示运算结果MUL_:CALL CHAR ;调子程序CHAR,输入第2数CALL CR_ ;调子程序CR_,显示“=”MOV Y,BX ;第二个数送入Y单元MOV AX,XMUL Y ;完成X*YMOV BX,AX ;结果送入BX中JMP TO_ ;转TO_,显示运算结果DIV_:CALL CHAR ;调子程序CHAR,输入第2数CALL CR_ ;调子程序CR_,显示“=”MOV Y,BX ;第二个数送入Y单元MOV DX,0MOV AX,XDIV Y ;完成X/YMOV BX,AX ;结果送入BX中JMP TO_ ;转TO_,显示运算结果T_:MOV DL,2DHMOV AH,02HINT 21H ;显示“-”MOV BX,YSUB BX,X ;完成Y-X,结果送入BX中TO_:CALL BIN ;调BIN,显示运算结果四、实验器材1. 硬件环境:微型计算机(Intel x86系列CPU)一台2. 软件环境:Windows98/2000/XP操作系统任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等)汇编程序(MASM.EXE)连接程序(LINK.EXE)调试程序(DEBUG.EXE)文本编辑器建议使用EDIT或NOTEPAD,汇编程序建议使用MASM.EXE,连接程序建议使用LINK.EXE,调试程序建议使用DEBUG.EXE。
五、方法步骤1、用EDIT建立汇编语言源程序2、用MASM汇编生成目标文件3、用LINK进行连接生成可执行文件4、程序的运行六、成效分析6.1运行界面分析图6.1-1 运行界面图6.1-2 清零界面图6.1-3程序运算状态界面6.2 调试过程及分析。