您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 综合性的汇编语言程序设计实验
湘潭大学实验报告课程:80X86汇编语言程序设计实验题目:综合性的汇编语言程序设计学院:信息工程学院专业:14级计算机科学与技术二班学号:2014551418姓名:周宇指导教师:匡林爱完成日期:2016.5.121一、实验内容开发一个总源代码行数不低于300行(或新代码行数不少于200行)的汇编语言程序以解决一个相对独立的局部应用问题。二、实验环境硬件环境:一台微型计算机软件环境:Window7系统、debug环境、masm三、实验代码设计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'--------------------------------------------------------------------------','$'NUM1DW0NUM2DW0DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSHUANHANGPROCNEAR;换行子程序可用STR_CRLFDB20AH,0DH,'$'MOVAH,02HMOVDL,0DHINT21HMOVDL,0AHINT21HRETHUANHANGENDPJIAFAPROCNEAR;加法子程序MOVDX,NUM1CALLPRINT;调用数据以十进制输出子程序,把NUM1以十进制形式输出MOVDL,'+'CALLSTDOUT;调用输出子程序,把+号输出MOVDX,NUM2CALLPRINTMOVDL,'=';调用输出子程序,把=号输出CALLSTDOUTMOVAX,NUM1ADDAX,NUM2MOVDX,AXCALLPRINTRETJIAFAENDPJIANFAPROCNEAR;减法子程序MOVDX,NUM1CALLPRINTMOVDL,'-'CALLSTDOUTMOVDX,NUM2CALLPRINTMOVDL,'='CALLSTDOUTMOVAX,NUM1MOVBX,NUM2SUBAX,BXMOVDX,AXCALLPRINTRETJIANFAENDPCHENGFAPROCNEAR;乘法子程序3MOVDX,NUM1CALLPRINTMOVDL,'*'CALLSTDOUTMOVDX,NUM2CALLPRINTMOVDL,'='CALLSTDOUTMOVAX,NUM1MOVDX,0MULNUM2MOVDX,AXCALLPRINTRETCHENGFAENDPCHUFAPROCNEAR;除法子程序MOVDX,NUM1CALLPRINTMOVDL,'/'CALLSTDOUTMOVDX,NUM2CALLPRINTMOVDL,'='CALLSTDOUTMOVDX,0MOVAX,NUM1DIVNUM2MOVDX,AXCALLPRINTRETCHUFAENDPPRINTPROCNEAR;数据以十进制输出子程序PUSHDXPUSHAXPUSHCXPUSHBXMOVCX,0DO:MOVAX,DXMOVDX,0MOVBX,10DIVBX4XCHGAX,DXADDAL,30HPUSHAXINCCXCMPDX,0JNZDODO1:POPAXMOVDL,ALCALLSTDOUTLOOPDO1POPBXPOPCXPOPAXPOPDXRETPRINTENDPSTDOUTPROCNEAR;输出子程序MOVAH,2INT21HRETSTDOUTENDPSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码ONEAGAIN:;输入选择继续执行程序XORAX,AXXORBX,BXMOVNUM1,0;很重要的两步MOVNUM2,0;CALLHUANHANGCALLHUANHANGLEADX,STRING11MOVAH,9INT21HCALLHUANHANGLEADX,STRING1;显示菜单MOVAH,9INT21H5CALLHUANHANGCALLHUANHANGLEADX,STRING2;提示菜单的选择MOVAH,9INT21HCALLHUANHANGCALLHUANHANGMOVAH,1;输入选择INT21H;菜单选择。。。。。。。。。。。。。。。。。。。;CALLHUANHANG;此换行千万不能加,加了后AX的值就变了!!!,导;致不能正确的选择菜单CMPAL,'0';选择退出JZEND_OF_CODECMPAL,'1';选择加法JZNEXT_OF_JIAFACMPAL,'2';选择减法JZNEXT_OF_JIANFACMPAL,'3';选择乘法JZNEXT_OF_CHENGFACMPAL,'4';选择乘法JZNEXT_OF_CHUFACALLHUANHANGLEADX,STRING10MOVAH,9INT21HJMPONEAGAINCALLHUANHANG;菜单选择。。。。。。。。。。。。。。。。。。。;加法NEXT_OF_JIAFA:CALLHUANHANGLEADX,STRING5MOVAH,09HINT21HCALLHUANHANGLEADX,STRING3;输入AMOVAH,09HINT21H6CALLHUANHANGLP1:MOVAH,1INT21HCMPAL,0DH;当输入的字符为回车结束数据输入JZNEXT1SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM1MULBXADDAX,CXMOVNUM1,AXJMPLP1NEXT1:LEADX,STRING4;输入BMOVAH,09HINT21HCALLHUANHANGLP11:MOVAH,1INT21HCMPAL,0DHJZNEXT11;;当输入的字符为回车结束数据输入SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM2MULBXADDAX,CXMOVNUM2,AXJMPLP11NEXT11:CALLHUANHANG;调用换行子程序CALLJIAFA;调用加法子程序JMPONEAGAIN;执行完后跳到最上面;减法NEXT_OF_JIANFA:CALLHUANHANG7LEADX,STRING6MOVAH,09HINT21HCALLHUANHANGLEADX,STRING3;输入AMOVAH,09HINT21HCALLHUANHANGLP2:MOVAH,1INT21HCMPAL,0DH;当输入的字符为回车结束数据输入JZNEXT2SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM1MULBXADDAX,CXMOVNUM1,AXJMPLP2NEXT2:LEADX,STRING4;输入BMOVAH,09HINT21HCALLHUANHANGLP22:MOVAH,1INT21HCMPAL,0DHJZNEXT22;;当输入的字符为回车结束数据输入SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM2MULBXADDAX,CXMOVNUM2,AXJMPLP22NEXT22:CALLHUANHANGCALLJIANFA;调用减法子程序8JMPONEAGAIN;执行完后跳到最上面;乘法NEXT_OF_CHENGFA:CALLHUANHANGLEADX,STRING7MOVAH,09HINT21HCALLHUANHANGLEADX,STRING3;输入AMOVAH,09HINT21HCALLHUANHANGLP4:MOVAH,1INT21HCMPAL,0DH;当输入的字符为回车结束数据输入JZNEXT4SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM1MULBXADDAX,CXMOVNUM1,AXJMPLP4NEXT4:LEADX,STRING4;输入BMOVAH,09HINT21HCALLHUANHANGLP44:MOVAH,1INT21HCMPAL,0DHJZNEXT44;;当输入的字符为回车结束数据输入SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM2MULBXADDAX,CX9MOVNUM2,AXJMPLP44NEXT44:CALLHUANHANGCALLCHENGFA;调用换行子程序JMPONEAGAIN;除法NEXT_OF_CHUFA:CALLHUANHANGLEADX,STRING8MOVAH,09HINT21HCALLHUANHANGLEADX,STRING3;输入AMOVAH,09HINT21HCALLHUANHANGLP3:MOVAH,1INT21HCMPAL,0DH;当输入的字符为回车结束数据输入JZNEXT3SUBAL,30HMOVAH,0MOVCX,AXMOVBX,10MOVAX,NUM1MULBXADDAX,CXMOVNUM1,AXJMPLP3NEXT3:LEADX,STRING4;输入BMOVAH,09HINT21HCALLHUANHANGLP33:MOVAH,1INT21HCMPAL,0DHJZNEXT33;;当输入的字符为回车结束数据输入SUBAL,30HMOVAH,010MOVCX,AXMOVBX,10MOVAX,NUM2MULBXADDAX,CXMOVNUM2,AXJMPLP33NEXT33:;CALLHUANHANG;CALLC;调用乘法子程序CALLHUANHANGCALLCHUFA;调用换行子程序JMPONEAGAINEND_OF_CODE:;CALLHUANHANGLEADX,STRING9MOVAH,9INT21HMOVAH,4CHINT21HCODESENDSENDSTART该程序是一个简单的汇编语言计算器,能进行加减乘除简单运算,程序运行后有一个选择菜单,选择相应的功能后输入操作数就能执行相应的操作。该程序过于简陋,其中有很多地方没有优化,对于除法计算(不能整除的情况)的精度不高,只能显示整数部分,减法中对于以小减大的计算不能进行;由于位数的限制,运算时中间有溢出的结果显示为错误的。四、实验结果与截图实验截图如下:11程序运行后的开始界面测试退出操作12测试加法功能测试加法功能测试减法功能13测试减法功能测试乘法功能测试乘法功能14测试除法功能测试除法功能测试不合法输入15调试截图调试截图16调试截图调试截图17调试截图五、心得体会该实验是对自己所学知识的汇总了,这个实验编写了一个汇编简易计算器,其中很多地方没有优化,在整个编写过程中花了很多时间和精力,其中主要都是在找错误。代码中很多地方用了子程序,所以在用到相应的功能时就直接CALL即可。由于本次实验难度最大,代码量很大,所以代码中多次用到各种寄存器,会导致寄存器的使用过程中数据被修改而导致结果不对,出现错误。在完成整个实验中,最耗费时间就是找错误,在输入相应的菜单选项后程序不能按照正确的方向进行,出现了流程错误,在找了好几个小时后,发现寄存器AX的值被修改了,开始调用1号功能输入一个数字存入AH中,在该指令的下一条CALLHUANHANG用了换行调用,而换行子程序中有改变AX的值,所以导致后面的功能选择不成功,所以,一个很细小的问题就能导致整个程序错误的执行,
本文标题:综合性的汇编语言程序设计实验
链接地址:https://www.777doc.com/doc-2066903 .html