汇编实验报告.docx
《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
汇编实验报告
(此文档为word格式,下载后您可任意编辑修改!
)
课程设计(大作业)报告
课程名称:
微机原理与汇编语言程序设计
设计题目:
简单计算器程序设计
院系:
信息技术
班级:
12级计算机应用技术1班
设计者:
陈娟
学号:
指导教师:
周曦
设计时间:
2014.6.23——2014.6.27
昆明学院课程设计(大作业)任务书
姓名:
陈娟院(系):
信息技术
专业:
计算机应用技术学号:
任务起止日期:
2014.6.23——2014.6.27
课程设计题目:
简单计算器程序设计
课程设计要求:
1、在屏幕上显示一个窗口,将光标定位在窗口内
2、在窗口内输入一个表达式(单项运算)
3、程序根据表达式计算结果,并在表达式的后面显示一个“=”和运算结果
工作计划及安排:
第1次绘制程序流程图。
第2次用编写程序。
第3次用调试运行程序。
第4次编写课程设计说明书
指导教师签字
年月日
课程设计(大作业)成绩
学号:
姓名:
陈娟指导教师:
周曦
课程设计题目:
简单计算器程序设计
总结:
经过一个星期的努力,这次课程设计终于成功完成了。
我的心里是满满的喜悦,虽然在设计的过程中遇到了很多的困难,例如BIOS调用INT16H子程序完成清屏、设置显示方式、设置窗口等操作,还有就是由于自己的粗心总是把程序中部分的单词打错,也给程序设计的编译运行带来麻烦,浪费了许多的时间与精力。
另外就是程序的编写十分复杂,工作量很大,所以编写程序就变成了一项十分困难的事。
但在不断的查阅资料,询问学长学姐逐渐做出这份课程设计的过程中,我觉得这些付出很值得,也对微机原理与汇编语言程序设计有了更深入的了解,。
编写程序的时间里也顺便复习了在这一学期中所学的微机原理与汇编语言,为后一星期的期末考试做了一些复习。
通过本次课程设计我学到了不少新的东西,也发现了大量的问题,有些在设计过程中已经解决,有些还有待今后慢慢学习。
总的来说,做完一个简单计算器程序设计的收获不仅仅是分数上的,对以后的学习方式方法很同学的学习合作也有了更深的看法。
指导教师评语:
成绩:
填表时间:
指导教师签名:
目录
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调用中INT16H调用中的子程序完成清屏、设置显示方式、设置窗口等操作。
(2)利用INT21HDOS系统功能调用中的键盘输入接收十进制操作数和运算符由程序完成字符转换为二进制数,并存储起来。
(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显示。
二、基本理论
本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
比如,十进制数的加减乘除四则运算。
我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
首先我们要解决的是输入问题,这里我们用INT21H的一号功能调用来进行输入;然后我们要进行的是判断是进行何种运算,当输入的运算符号不是“+、-、*、”中的一种时,则报错,提示重新输入。
当输入的是q或Q时,则清屏。
由于运算过程中出现的进借位问题,会导致输出的结果为一位数,二位数,或者是负数,所以在选择输出的方式时功能调用会很不方便,因为功能调用要求有一个输出字符的缓冲区,由于输出的结果形式太多,缓冲区太难确定,而且若结果为负数,负号也得事先进行设置,所以单字符输出是一个合理的选择。
最后还要对这个简易计算器进行功能完善,例如为了使程序符合我们使用者的操作习惯,我们可以添加按回车键换行输入,即当键入回车键后,可以换行重新输入;可以设置按Q或q键清屏。
三、总体设计
3.1本程序的功能结构图如图3-1:
图3-1功能结构图
程序设计流程图
该程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。
通过流程图,可以看出程序开始运行时,首先输出提示语句,再输入字符,并判断输入的字符是否为Q或q,若是,则清屏重新输入,否则继续输入;判断输入的是不是回车键,若是就回车换行输入,不是则继续输入;判断输入的是否为0~9,+,-,=这些字符,若不是会报错,是则将其存储到定义的数据区BX里面,再判断如果输入的不是=功能键,则继续输入,若是,则判断是做加法运算还是减法运算,最后输出结果,并重新输入,继续上面的步骤。
3.2字符输入及存储设计
利用INT21H的1号中断一个一个地输入字符,并将输入地字符和Q,q比较,如果相等则清屏并重新输入,不等就判断输入的字符是否为0DH即回车键对应的ASCII码值,再看输入的是否为0~9,+,-,=这几个字符,若是则存储,若不是就在屏幕上输出错误提示,程序如下:
CHARPROCNEAR
MOVBX,0
NEWCHAR:
MOVAH,01H
INT21H;通过键盘输入一个十进制数
CMPAL,30H
JLEXIT
CMPAL,39H
JGEXIT;输入字符不在0-9之间,转结束
SUBAL,30H;否则减30H,将ASCII转化为二进制数
MOVAH,0;扩展至AX中
XCHGAX,BX
MOVCX,10
MULCX
XCHGAX,BX
ADDBX,AX;完成(BX)×10+AX,结果送入BX中
JMPNEWCHAR;转NEWCHAR
EXIT:
RET
CHARENDP
3.3加、减、乘、除法运算的判断设计
由于输入字符的格式固定为两位数加两位数的格式,则只需把存在BUF数据区的第三个字符提出来并与加号的ASCII码值进行比较即可判断为加法过算还是减法运算了,若相等则为加法过算不等则为减法运算,具体程序实现如下:
ADD_TOPROCNEAR
CALLCHAR;调子程序CHAR,完成第一个运算转换
MOVX,BX;第一个数送X单元中
CMPAL,2DH
JZMINU;运算符=“-”,转MINU,执行减法
CMPAL,2AH
JZMUL_;运算符=“*”,转MUL_,执行乘法
CMPAL,2FH
JZDIV_;运算符=“,转DIV_,执行除法
CMPAL,51H
JZEXIT8;(AL)=“Q”,转EXIT8
CALLCHAR;否则调子程序CHAR,输入第2个数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX
ADDBX,X;执行加法运算,结果送入BX中
JMPTO_;转TO_
3.4加、减、乘、除法运算的设计
MINU:
CALLCHAR;调子程序CHAR,输入第2个数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX;第二个数送入Y单元
MOVBX,X
CMPBX,Y;被减数<减数,转T_
JLT_
SUBBX,Y;否则完成X减Y,结果送入BX中
JMPTO_;转TO_,显示运算结果
MUL_:
CALLCHAR;调子程序CHAR,输入第2数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX;第二个数送入Y单元
MOVAX,X
MULY;完成X*Y
MOVBX,AX;结果送入BX中
JMPTO_;转TO_,显示运算结果
DIV_:
CALLCHAR;调子程序CHAR,输入第2数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX;第二个数送入Y单元
MOVDX,0
MOVAX,X
DIVY;完成XY
MOVBX,AX;结果送入BX中
JMPTO_;转TO_,显示运算结果
T_:
MOVDL,2DH
MOVAH,02H
INT21H;显示“-”
MOVBX,Y
SUBBX,X;完成Y-X,结果送入BX中
TO_:
CALLBIN;调BIN,显示运算结果
四、实验器材
1.硬件环境:
微型计算机(Intelx86系列CPU)一台
2.软件环境:
Windows982000XP操作系统
任意一种文本编辑器(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调试过程及分析
图6.2-1出现错误截图界面
图6.2-2无误截图界面
图6.2-3LINK链接生成可执行文件截图界面
七、心得体会
一周的课程设计结束了,本次课程设计让我有不少收获,给我的总体感觉就是忙碌而充实,真正学到了东西。
加深的对汇编语言的认识;在以往的几周上机实验中,对汇编语言源程序的编辑、汇编、连接和调试的过程帮助我在这次的实训中对程序的编译,链接更加熟练;在不断地求解过程中,更进一步的了解到了汇编语言的一些特点,感觉到汇编语言的执行效率非常高。
从构思到设计流程图到编写源程序都是一个人独立完成,这次虽然在网上没有搜到什么资料,但是我还是学会了更好地利用资源——身边的老师,同学以及学长都在我编程的过程中给了我很多很好的建议,而书本是我最好的帮手,有任何编程细节不太清楚的,我就去翻书,一般都能在书中找到答案。
本次课程设计的成功完成,我首先感谢我的指导老师周曦,在他悉心指导下我们才能顺利完成本次课程设计中的每一个计划。
在这次课程设计中,无论从课题选择,方案论证上,还是到具体的设计和调试,每一项安排他都提出了很好的建议,使我们少走了许多弯路,节省了大量时间,在要向周曦老师表示深深的感谢。
八、参考文献
[1]荆淑霞主编.《微机原理与汇编语言程序设计》清华大学出版社;北京交通大学出版社,2005.9
[2]荆淑霞主编.《微机原理与汇编语言程序设计——习题解答、实验指导和实训》中国水利水电出版社,2006
[3]王爽等编.《汇编语言》.北京:
清华大学出版社,2003.5
[4]曹加恒等编.《新一代汇编语言课程设计》.北京:
高等教育出版社,2003.6
[5]杨路明等编.《汇编语言程序设计》.长沙:
中南大学出版社,2005.8
[6]詹仕华等编.《汇编语言程序设计》.北京:
中国电力出版社,2008.2
[7]詹仕华等编.《汇编语言程序设计习题解答及课程设计、设计辅导》.北京:
中国电力出版社,2008.2
[8]宋彩莉等编.《汇编语言程序设计学习指导》.西安:
西安交通大学出版社,2008.2
附录
源程序
STACKSEGMENTSTACK
DB50HDUP(?
)
STACKENDS
DATASEGMENT
XDW?
YDW?
MDB?
MESSDB'',0AH,0DH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX;程序初始化
CALLCUR;调程序完成屏幕初始化并显示边框
POS_CURSE:
MOVAH,02H
MOVDH,9
MOVDL,44
MOVBH,0
INT10H;光标定位在9行44列
MOVDX,OFFSETMESS
MOVAH,09H
INT21H;显示字符串
MOVAH,02H
MOVDH,8
MOVDL,30
MOVBH,0
INT10H;光标定位在8行30列
MOVAH,06H
MOVAL,1
MOVCH,5
MOVCL,30
MOVDH,8
MOVDL,50
MOVBH,7
INT10H;屏幕上卷
MOVM,1
CALLADD_TO;调ADD_TO子程序,完成表达式输入
CMPAL,51H;输入“Q”,结束程序
JZEXIT1
JMPPOS_CURSE
EXIT1:
MOVAH,4CH
INT21H
;子程序名:
ADD_TO
;功能:
完成键盘输入并转换
;入口参数:
无
;出口参数:
(AL)=输入非数字字符的ASCII码
ADD_TOPROCNEAR
CALLCHAR;调子程序CHAR,完成第一个运算转换
MOVX,BX;第一个数送X单元中
CMPAL,2DH
JZMINU;运算符=“-”,转MINU,执行减法
CMPAL,2AH
JZMUL_;运算符=“*”,转MUL_,执行乘法
CMPAL,2FH
JZDIV_;运算符=“,转DIV_,执行除法
CMPAL,51H
JZEXIT8;(AL)=“Q”,转EXIT8
CALLCHAR;否则调子程序CHAR,输入第2个数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX
ADDBX,X;执行加法运算,结果送入BX中
JMPTO_;转TO_
MINU:
CALLCHAR;调子程序CHAR,输入第2个数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX;第二个数送入Y单元
MOVBX,X
CMPBX,Y;被减数<减数,转T_
JLT_
SUBBX,Y;否则完成X减Y,结果送入BX中
JMPTO_;转TO_,显示运算结果
MUL_:
CALLCHAR;调子程序CHAR,输入第2数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX;第二个数送入Y单元
MOVAX,X
MULY;完成X*Y
MOVBX,AX;结果送入BX中
JMPTO_;转TO_,显示运算结果
DIV_:
CALLCHAR;调子程序CHAR,输入第2数
CALLCR_;调子程序CR_,显示“=”
MOVY,BX;第二个数送入Y单元
MOVDX,0
MOVAX,X
DIVY;完成XY
MOVBX,AX;结果送入BX中
JMPTO_;转TO_,显示运算结果
T_:
MOVDL,2DH
MOVAH,02H
INT21H;显示“-”
MOVBX,Y
SUBBX,X;完成Y-X,结果送入BX中
TO_:
CALLBIN;调BIN,显示运算结果
EXIT8:
RET
;子程序名:
CR_
;功能:
显示一个“=”
;入口参数:
(AL)中为输入按键的ASCII码
;出口参数:
无
CR_PROCNEAR
CMPAL,0DH
JNZESC_;(AL)≠0DH,转ESC
MOVAH,02H
MOVDH,8
MOVDL,46
MOVBH,0
INT10H;光标定位在8行46列,显示一个“=”
MOVDL,3DH
MOVAH,02H
INT21H
ESC_:
RET
CR_ENDP
;子程序名:
CHAR
;子程序功能:
接收键盘输入的十进制数,转换为二进制
;入口参数:
无
;出口参数:
(BX)中存放转换的二进制结果,(AL)存放输入的非十进制数的ASCII码
CHARPROCNEAR
MOVBX,0
NEWCHAR:
MOVAH,01H
INT21H;通过键盘输入一个十进制数
CMPAL,30H
JLEXIT
CMPAL,39H
JGEXIT;输入字符不在0-9之间,转结束
SUBAL,30H;否则减30H,将ASCII转化为二进制数
MOVAH,0;扩展至AX中
XCHGAX,BX
MOVCX,10
MULCX
XCHGAX,BX
ADDBX,AX;完成(BX)×10+AX,结果送入BX中
JMPNEWCHAR;转NEWCHAR
EXIT:
RET
CHARENDP
;子程序名:
BIN
;子程序功能:
将BX中的数据以十进制显示在屏幕上
;入口参数:
(BX)=被显示数据
;出口参数:
无
BINPROCNEAR
MOVCX,10000
CALLDEC_DIV
MOVCX,1000
CALLDEC_DIV
MOVCX,100
CALLDEC_DIV
MOVCX,10
CALLDEC_DIV
MOVCX,1
CALLDEC_DIV1
RET
BINENDP
;子程序名:
DEC_DIV
;子程序功能:
BX中的内容除以CX中的内容,显示AL中的结果
;入口参数:
(BX)=被除数,(CX)=除数
;出口参数:
(BX)=余数
DEC_DIVPROCNEAR
MOVAX,BX;被除数送入AX中
MOVDX,0;扩展至DX,AX中
DIVCX;除以CX中的内容
MOVBX,DX;余数送入BX中
CMPM,0
JZTO1_;标志变量M=0,转TO1_
CMPAL,0;否则AL=0,转TO2_
JZTO2_
TO1_:
MOVDL,AL
ADDDL,30H
MOVAH,02H
INT21H;显示AL中的内容
MOVAL,0
MOVM,AL;标志变量送0
TO2_:
RET
DEC_DIVENDP
;----
DEC_DIV1PROCNEAR
MOVAX,BX
MOVDX,0
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,02H
INT21H
RET
DEC_DIV1ENDP
;BINENDP
ADD_TOENDP
;----
CURPROCNEAR
MOVAH,6
MOVAL,0
MOVCH,0
MOVDH,24
MOVDL,79
MOVBH,7
INT10H;屏幕初始化
MOVAH,2
MOVBH,0
MOVDH,4
MOVDL,25
INT10H;光标定位在4行25列
MOVAH,9
MOVAL,'*'
MOVBH,0
MOVBL,9
MOVCX,30
INT10H;显示1行“*”
;********************
MOVAH,2
MOVBH,0
MOVDH,10
MOVDL,25
INT10H;光标定位在10行25列
MOVAH,9
MOVAL,'*'
MOVBH,0
MOVCX,30
INT10H;显示1行“*”
;********************
MOVDH,4
CALLA
CALLA
CALLA
CALLA
CALLA
CALLA;调子程序,显示左边框“*”
;********************
MOVDH,4
CALLB
CALLB
CALLB
CALLB
CALLB
CALLB;调子程序,显示右边框“*”
RET
CURENDP
;********************
APROCNEAR
MOVAH,2
MOVBH,0
INCDH
MOVDL,25
INT10H
MOVAH,9
MOVAL,'*'
MOVBH,0
MOVBL,9
MOVCX,1
INT10H
RET
AENDP
;*********************
BPROCNEAR
MOVAH,2
MOVBH,0
INCDH
MOVDL,54
INT10H
MOVAH,9
MOVAL,'*'
MOVBH,0
MOVBL,9
MOVCX,1
INT10H