华科汇编语言程序设计实验2_第1页
华科汇编语言程序设计实验2_第2页
华科汇编语言程序设计实验2_第3页
华科汇编语言程序设计实验2_第4页
华科汇编语言程序设计实验2_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE107课程实验报告课程名称:汇编语言程序设计实验实验名称:实验二程序执行时间与代码长度优化实验时间:2017-3-29,14:30-17:30实验地点:南一楼804室78号实验台指导教师:班鹏新专业班级:计算机科学与技术201503班学号:U201514558姓名:刘伟光同组学生:无报告日期:2017年3月29日原创性声明

本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。特此声明!学生签名:日期:2017.3.29成绩评定实验完成质量得分(70分)(实验步骤清晰详细深入,实验记录真实完整等)报告撰写质量得分(30分)(报告规范、完整、通顺、详实等)总成绩(100分)指导教师签字:

日期:汇编语言程序设计实验报告PAGE9目录1 实验目的与要求 12 实验内容 13 实验过程 13.1 任务1 13.1.1 设计思想及存储单元分配 13.1.2流程图 23.13源程序 23.1.2 实验步骤 23.1.3 实验记录与分析 23.2 任务2 33.2.1 设计思想及存储单元分配 33.2.2 源程序 33.2.3 实验步骤 33.2.4 实验记录与分析 43.3 任务3 43.3.1 设计思想及存储单元分配 43.3.2 源程序 43.3.3 实验步骤 53.3.4 实验记录与分析 54 总结与体会 9

实验目的与要求熟悉汇编语言指令的特点,掌握代码优化的基本方法;理解高级语言程序与汇编语言程序之间的对应关系。实验内容任务1.观察多重循环对CPU计算能力消耗的影响若有m个用户在同一台电脑上排队使用实验一任务四的程序,想要查询成绩列表中最后一个学生“wangwu”的平均成绩,那就相当于将实验一任务四的程序执行了m次。为了观察从第一个用户开始进入查询至第m个用户查到结果之间到底延迟了多少时间,我们让实验一任务四的功能二和功能三的代码重复执行m次,通过计算这m次循环执行前和执行后的时间差,来感受其影响。由于功能一和功能四需要输入、输出,速度本来就较慢,所以,没有纳入到这m次循环体内(但可以保留不变)。请按照上述设想修改实验一任务四的程序,并将m值尽量取大(建议m>=1000,具体数值依据实验效果来改变,逐步增加到比较明显的程度,比如秒级延迟),以得到较明显的效果。任务2.对任务1中的汇编源程序进行优化优化工作包括代码长度的优化和执行效率的优化,本次优化的重点是执行效率的优化。请通过优化m次循环体内的程序,使程序的执行时间尽可能减少10%以上。减少的越多,评价越高!任务3.观察用C语言实现的实验一任务四中功能一的程序与汇编语言实现的程序的差异用汇编语言和C语言分别实现实验一任务四中功能一的功能(对汇编语言而言,就是把实验一中相关程序摘取出来成为独立的程序),对比两种语言实现的程序的代码情况,观察和总结C语言编写程序和自己的汇编语言程序的对应关系及差异,总结其中可以简化的地方。实验过程任务1设计思想及存储单元分配第二次的实验是在第一次实验的基础上进行的,设计思想大致与第一次的实验的任务四相同,更改的方面有在任务四的功能二和功能三中添加了长达100000次的循环,新增的j作为计数器,其类型为DD双字类型。,同时也减少了部分的寄存器以加快程序的运行时间。3.1.2流程图 流程图如图3.1.1所示。3.1.1任务一的程序流程图3.13源程序┇JDD0┇cmpj,wordptr1000000jneaxb┇实验步骤准备上机环境,编辑、汇编、连接文件4。按F9来执行程序文件。进行功能一的测试,窗口提示输入要查找的学生的姓名,在窗口中输入姓名。成功后,再直接敲入回车,测试功能。查看查询最后一位学生所需要的查询时间差,决定选取1000000级时会影响到秒级。实验记录与分析1.实验环境条件:P31GHz,256M内存;WINDOWSXP下DOSBox0.72;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。2.程序中按下回车重新提示输入姓名,如图3.1.1所示:图3.1.1循环1000000的时间差 3.改变程序的循环次数,查看时间差,如图3.1.2所示:图3.1.2循环600000的时间差任务2设计思想及存储单元分配在第一次的基础上修改一些寄存器以加快程序的运行速度。源程序┇movax,0movdx,0movbp,offsetBUFaddbp,bxaddbp,10addal,byteptrds:[bp]addal,almovdl,ds:[bp+1]addax,dxmovdl,ds:[bp+2]sardl,1addax,dx┇实验步骤1.准备上机环境,编辑、汇编、连接文件4。2.按F9来执行程序文件。3.进行功能一的测试,窗口提示输入要查找的学生的姓名,在窗口中输入姓名。成功后,再直接敲入回车,测试功能。4.通过改变求取平均数的功能中,将代码中的乘以二变从用IDIV改为用sal,将求两倍的运算改成用加法重复加两遍。5.删去不必要的重复语句,将第一次的多余的重复清零语句都清零。6.对比修改前和修改之后的时间差,计算改进的百分比。实验记录与分析实验环境条件:P31GHz,256M内存;WINDOWSXP下DOSBox0.72;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。修改代码之前的时间差如图3.2.1所示:图3.2.1修改代码之前的时间差3.修改代码之前的时间差如图3.2.2所示:图3.2.2执行到int21H之前的内容经过多次的运行比较之后,平均的时间差是455ms,平均提高的百分比为18.4%。任务3设计思想及存储单元分配在c语言中使用声明一个char[]10的数组,msg为字符串数组,其中为显示的提示的打印的字符串信息。源程序(1)c语言代码#include<stdio.h>#include<string.h>voidf1(char*S,char*MSG);intmain(){chars[10],*msg;msg="Inputthename:";f1(s,msg);return0;}voidf1(char*S,char*MSG){printf("%s",MSG);gets(S);if(strlen(S)==0)f1(S,MSG);elseif(strlen(S)==1&&(*S=='q'||*S=='Q'))return;elsereturn;}实验步骤准备上机环境,编辑。2.使用Turboc2.0程序敲出与汇编第一次实验任务四功能一相同的c语言程序,使用Turboc生成相对应的exe文件,将生成的exe文件移至反汇编的程序文件夹中,进行反汇编。3.使用TD.EXE观察程序的反汇编代码,观察其长度与汇编语言的差别,仔细对比两者语句的区别。4.实验记录与分析实验环境条件:P31GHz,256M内存;WINDOWSXP下DOSBox0.72;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。Turboc中的c语言代码:图3.3.1Turboc中的c语言代码C语言生成的exe文件的大小和汇编语句生成的exe文件长度的区别:图3.3.2汇编语言生成的exe文件大小图3.3.3C语言生成的exe文件大小由计算可知C语言生成的可执行文件的大小是汇编文件的大小的12.5倍,C语言的形成的可执行文件的大小还是很大的。在TD中使用汇编的程序的反汇编最后退出语句的位置如图3.3.3,其在代码段位置为004F图3.3.3TD汇编的反汇编语句中最后一句位置图3.3.4TDC语言的反汇编语句中最后一句位置分析:汇编语句中,反汇编的代码的长度为79行,C语言的反汇编后代码长度为6039行,C语言的反汇编的代码长度远大于汇编语言的代码长度,由此可分析出汇编代码的性能远远好于c语言生成的观察C语言的反汇编代码(1)C语言中的调用scanf函数,当call01FA时,系统会提醒输入,如图3.3.5图3.3.5gets函数的入口 分析:C语言在调用自己库中的函数时,使用的是调用一个函数,通过调用函数来执行对应的功能。(2)gets函数经过第二次call后经过F7单步执行进入函数如图3.3.6图3.3.5gets函数的嵌套入口分析:在调用gets函数时不仅仅是简单的一次调用,我用F7依次进去时发现在函数调用中还嵌套了很多个函数调用,大概是3,4次调用才到真正的 执行输入代码(2)gets函数内部经过测试真正执行输入的代码如图3.3.6图3.3.6执行输入的反汇编语句 分析:真正进入输入界面的调用输入方式并不像我们在汇编中使用的直接简单的使用系统的10号功能,而是很复杂地执行了4个给寄存器赋值的指令,经过猜想应该是我们没有学过的其他系统功能调用。在给寄存器赋值时,反汇编语言分别依次将bp中的4,8,6的值赋给bx,cx,dx寄存器,由此可知c语言还是放了较多东西在堆栈段。(3)代码中调用C中自己设置的功能函数的代码如图3.3.7图3.3.7调用f1的反汇编语句分析:代码在进入自己写的函数时,不会使用jmp,而是使用call调用,使用call调用结束程序后还会继续回源程序进行下一步的执行。(4)在对c语言的程序进行反汇编的时候,发现C对各种寄存器都进行了使用,有时还使用进栈出栈,在对寄存器的使用中,尤其喜欢用16位的寄存器,如图3.3.8图3.3.8C语言反汇编使用的寄存器 分析:寄存器使用的范围面还是比较广的,尤其是对16位寄存器,还经常喜欢使用堆栈。总结与体会第二次的实验总的来说比第一次的实验简单,但是从第二次的实验中,我也发现了不少的东西。首先任务一就让我们意识到了当循环次数增加的时候,程序运行的速度的确会变慢许多,我从千级一直试到了千万级,从一开始几乎显示不出什么数据到最后时间间隔达到十几秒,我亲身体会到了计算机在数量庞大的时候也是吃不消的,当数据规模成几何类型上涨时,对代码的优化对于我们来说就是很重要的了。任务二对我来说这次很有意思,这是一场跟自己智力的较量,在前一次的实验中,我就尽量的想使代码的运行速度变得更快,这次的实验是在大量的重复循环下,让我们通过精简语句,改变计算的方法来使运行的速度加快,令人兴奋的是,由于数据规模的不断扩大,代码之间的优秀和不优秀分明的也就越加的明显。我绞尽脑汁的将功能二功能三循环中的多余的语句删去,因为在第一次实验中为了确保代码的正常运行写了很多多余的代码,这次在任务二中,我就用方法将不必要的语句尽量删去。还有改变的是对搜索方式的改变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论