微机原理与汇编语言程序设计汇编实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(此文档为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 NEAR
MOV BX,0
NEWCHAR:
MOV AH,01H
INT 21H ;通过键盘输入一个十进制数
CMP AL,30H
JL EXIT
CMP AL,39H
JG EXIT ;输入字符不在0-9之间,转结束
SUB AL,30H ;否则减30H,将ASCII转化为二进制数
MOV AH,0 ;扩展至AX中
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX ;完成(BX)×10+AX,结果送入BX 中
JMP NEWCHAR ;转NEWCHAR
EXIT:
RET
CHAR ENDP
3.3加、减、乘、除法运算的判断设计
由于输入字符的格式固定为两位数加两位数的格式,则只需把存在BUF数据区的第三个字符提出来并与加号的ASCII码值进行比较即可判断为加法过算还是减法运算了,若相等则为加法过算不等则为减法运算,具体程序实现如下:ADD_TO PROC NEAR
CALL CHAR ;调子程序CHAR,完成第一个运算转换 MOV X,BX ;第一个数送X单元中
CMP AL,2DH
JZ MINU ;运算符=“-”,转MINU,执行