综合性汇编语言程序设计实验.docx
《综合性汇编语言程序设计实验.docx》由会员分享,可在线阅读,更多相关《综合性汇编语言程序设计实验.docx(23页珍藏版)》请在冰豆网上搜索。
综合性汇编语言程序设计实验
湘潭大学
实验报告
课程:
80X86汇编语言程序设计
实验题目:
综合性的汇编语言程序设计
学院:
信息工程学院
专业:
14级计算机科学与技术二班
学号:
2014551418
姓名:
周宇
指导教师:
匡林爱
完成日期:
2016.5.12
1、实验内容
开发一个总源代码行数不低于300行(或新代码行数不少于200行)的汇编语言程序以解决一个相对独立的局部应用问题。
2、实验环境
硬件环境:
一台微型计算机
软件环境:
Window7系统、debug环境、masm
3、实验代码设计
DATASSEGMENT
;此处输入数据段代码
STRING1DB'0:
EXIT,1:
A+B,2:
A-B,3:
A*B,4:
A/B','$'
STRING2DB'Pleaseenteranumbertohaveachoice:
','$'
STRING3DB'PleaseenterA:
','$'
STRING4DB'PleaseenterB:
','$'
STRING5DB'YouhavechosedtheA+B','$'
STRING6DB'YouhavechosedtheA-B','$'
STRING7DB'YouhavechosedtheA*B','$'
STRING8DB'YouhavechosedtheA/B','$'
STRING9DB'Thanksforusing^U^!
','$'
STRING10DB'Youentertheerrornumber!
Pleaseenteragain.','$'
STRING11DB'--------------------------------------------------------------------------','$'
NUM1DW0
NUM2DW0
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
HUANHANGPROCNEAR;换行子程序可用STR_CRLFDB0AH,0DH,'$'
MOVAH,02H
MOVDL,0DH
INT21H
MOVDL,0AH
INT21H
RET
HUANHANGENDP
JIAFAPROCNEAR;加法子程序
MOVDX,NUM1
CALLPRINT;调用数据以十进制输出子程序,把NUM1以十进制形式输出
MOVDL,'+'
CALLSTDOUT;调用输出子程序,把+号输出
MOVDX,NUM2
CALLPRINT
MOVDL,'=';调用输出子程序,把=号输出
CALLSTDOUT
MOVAX,NUM1
ADDAX,NUM2
MOVDX,AX
CALLPRINT
RET
JIAFAENDP
JIANFAPROCNEAR;减法子程序
MOVDX,NUM1
CALLPRINT
MOVDL,'-'
CALLSTDOUT
MOVDX,NUM2
CALLPRINT
MOVDL,'='
CALLSTDOUT
MOVAX,NUM1
MOVBX,NUM2
SUBAX,BX
MOVDX,AX
CALLPRINT
RET
JIANFAENDP
CHENGFAPROCNEAR;乘法子程序
MOVDX,NUM1
CALLPRINT
MOVDL,'*'
CALLSTDOUT
MOVDX,NUM2
CALLPRINT
MOVDL,'='
CALLSTDOUT
MOVAX,NUM1
MOVDX,0
MULNUM2
MOVDX,AX
CALLPRINT
RET
CHENGFAENDP
CHUFAPROCNEAR;除法子程序
MOVDX,NUM1
CALLPRINT
MOVDL,'/'
CALLSTDOUT
MOVDX,NUM2
CALLPRINT
MOVDL,'='
CALLSTDOUT
MOVDX,0
MOVAX,NUM1
DIVNUM2
MOVDX,AX
CALLPRINT
RET
CHUFAENDP
PRINTPROCNEAR;数据以十进制输出子程序
PUSHDX
PUSHAX
PUSHCX
PUSHBX
MOVCX,0
DO:
MOVAX,DX
MOVDX,0
MOVBX,10
DIVBX
XCHGAX,DX
ADDAL,30H
PUSHAX
INCCX
CMPDX,0
JNZDO
DO1:
POPAX
MOVDL,AL
CALLSTDOUT
LOOPDO1
POPBX
POPCX
POPAX
POPDX
RET
PRINTENDP
STDOUTPROCNEAR;输出子程序
MOVAH,2
INT21H
RET
STDOUTENDP
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
ONEAGAIN:
;输入选择继续执行程序
XORAX,AX
XORBX,BX
MOVNUM1,0;很重要的两步
MOVNUM2,0;
CALLHUANHANG
CALLHUANHANG
LEADX,STRING11
MOVAH,9
INT21H
CALLHUANHANG
LEADX,STRING1;显示菜单
MOVAH,9
INT21H
CALLHUANHANG
CALLHUANHANG
LEADX,STRING2;提示菜单的选择
MOVAH,9
INT21H
CALLHUANHANG
CALLHUANHANG
MOVAH,1;输入选择
INT21H
;菜单选择。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
;CALLHUANHANG;此换行千万不能加,加了后AX的值就变了!
!
!
,导;致不能正确的选择菜单
CMPAL,'0';选择退出
JZEND_OF_CODE
CMPAL,'1';选择加法
JZNEXT_OF_JIAFA
CMPAL,'2';选择减法
JZNEXT_OF_JIANFA
CMPAL,'3';选择乘法
JZNEXT_OF_CHENGFA
CMPAL,'4';选择乘法
JZNEXT_OF_CHUFA
CALLHUANHANG
LEADX,STRING10
MOVAH,9
INT21H
JMPONEAGAIN
CALLHUANHANG
;菜单选择。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
;加法
NEXT_OF_JIAFA:
CALLHUANHANG
LEADX,STRING5
MOVAH,09H
INT21H
CALLHUANHANG
LEADX,STRING3;输入A
MOVAH,09H
INT21H
CALLHUANHANG
LP1:
MOVAH,1
INT21H
CMPAL,0DH;当输入的字符为回车结束数据输入
JZNEXT1
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM1
MULBX
ADDAX,CX
MOVNUM1,AX
JMPLP1
NEXT1:
LEADX,STRING4;输入B
MOVAH,09H
INT21H
CALLHUANHANG
LP11:
MOVAH,1
INT21H
CMPAL,0DH
JZNEXT11;;当输入的字符为回车结束数据输入
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM2
MULBX
ADDAX,CX
MOVNUM2,AX
JMPLP11
NEXT11:
CALLHUANHANG;调用换行子程序
CALLJIAFA;调用加法子程序
JMPONEAGAIN;执行完后跳到最上面
;减法
NEXT_OF_JIANFA:
CALLHUANHANG
LEADX,STRING6
MOVAH,09H
INT21H
CALLHUANHANG
LEADX,STRING3;输入A
MOVAH,09H
INT21H
CALLHUANHANG
LP2:
MOVAH,1
INT21H
CMPAL,0DH;当输入的字符为回车结束数据输入
JZNEXT2
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM1
MULBX
ADDAX,CX
MOVNUM1,AX
JMPLP2
NEXT2:
LEADX,STRING4;输入B
MOVAH,09H
INT21H
CALLHUANHANG
LP22:
MOVAH,1
INT21H
CMPAL,0DH
JZNEXT22;;当输入的字符为回车结束数据输入
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM2
MULBX
ADDAX,CX
MOVNUM2,AX
JMPLP22
NEXT22:
CALLHUANHANG
CALLJIANFA;调用减法子程序
JMPONEAGAIN;执行完后跳到最上面
;乘法
NEXT_OF_CHENGFA:
CALLHUANHANG
LEADX,STRING7
MOVAH,09H
INT21H
CALLHUANHANG
LEADX,STRING3;输入A
MOVAH,09H
INT21H
CALLHUANHANG
LP4:
MOVAH,1
INT21H
CMPAL,0DH;当输入的字符为回车结束数据输入
JZNEXT4
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM1
MULBX
ADDAX,CX
MOVNUM1,AX
JMPLP4
NEXT4:
LEADX,STRING4;输入B
MOVAH,09H
INT21H
CALLHUANHANG
LP44:
MOVAH,1
INT21H
CMPAL,0DH
JZNEXT44;;当输入的字符为回车结束数据输入
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM2
MULBX
ADDAX,CX
MOVNUM2,AX
JMPLP44
NEXT44:
CALLHUANHANG
CALLCHENGFA;调用换行子程序
JMPONEAGAIN
;除法
NEXT_OF_CHUFA:
CALLHUANHANG
LEADX,STRING8
MOVAH,09H
INT21H
CALLHUANHANG
LEADX,STRING3;输入A
MOVAH,09H
INT21H
CALLHUANHANG
LP3:
MOVAH,1
INT21H
CMPAL,0DH;当输入的字符为回车结束数据输入
JZNEXT3
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM1
MULBX
ADDAX,CX
MOVNUM1,AX
JMPLP3
NEXT3:
LEADX,STRING4;输入B
MOVAH,09H
INT21H
CALLHUANHANG
LP33:
MOVAH,1
INT21H
CMPAL,0DH
JZNEXT33;;当输入的字符为回车结束数据输入
SUBAL,30H
MOVAH,0
MOVCX,AX
MOVBX,10
MOVAX,NUM2
MULBX
ADDAX,CX
MOVNUM2,AX
JMPLP33
NEXT33:
;CALLHUANHANG
;CALLC;调用乘法子程序
CALLHUANHANG
CALLCHUFA;调用换行子程序
JMPONEAGAIN
END_OF_CODE:
;
CALLHUANHANG
LEADX,STRING9
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
该程序是一个简单的汇编语言计算器,能进行加减乘除简单运算,程序运行后有一个选择菜单,选择相应的功能后输入操作数就能执行相应的操作。
该程序过于简陋,其中有很多地方没有优化,对于除法计算(不能整除的情况)的精度不高,只能显示整数部分,减法中对于以小减大的计算不能进行;由于位数的限制,运算时中间有溢出的结果显示为错误的。
4、实验结果与截图
实验截图如下:
程序运行后的开始界面
测试退出操作
测试加法功能
测试加法功能
测试减法功能
测试减法功能
测试乘法功能
测试乘法功能
测试除法功能
测试除法功能
测试不合法输入
调试截图
调试截图
调试截图
调试截图
调试截图
5、心得体会
该实验是对自己所学知识的汇总了,这个实验编写了一个汇编简易计算器,其中很多地方没有优化,在整个编写过程中花了很多时间和精力,其中主要都是在找错误。
代码中很多地方用了子程序,所以在用到相应的功能时就直接CALL即可。
由于本次实验难度最大,代码量很大,所以代码中多次用到各种寄存器,会导致寄存器的使用过程中数据被修改而导致结果不对,出现错误。
在完成整个实验中,最耗费时间就是找错误,在输入相应的菜单选项后程序不能按照正确的方向进行,出现了流程错误,在找了好几个小时后,发现寄存器AX的值被修改了,开始调用1号功能输入一个数字存入AH中,在该指令的下一条CALLHUANHANG用了换行调用,而换行子程序中有改变AX的值,所以导致后面的功能选择不成功,所以,一个很细小的问题就能导致整个程序错误的执行,再次提醒自己要仔细和谨慎,思路要严谨,不仅仅在这里,在生活中,在工作中也要做到细心和严谨。
通过这个实验,让我再次复习和掌握了汇编中指令和相应知识点,
是一个很好的复习、掌握和熟悉汇编编程的机会,对汇编语言的了解更加深入。