课程实验报告课程名称:汇编语言程序设计实验实验名称:实验四子程序的设计与调用,模块化程序设计实验时间:2016-4-12,14:00-17:30实验地点:南一楼804室73号实验台指导教师:张勇专业班级:计算机科学与技术201409班学号:U201414813姓名:唐礼威同组学生:鲁凯报告日期:2016年4月18日原创性声明本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。特此声明!学生签名:日期:成绩评定实验完成质量得分(70分)(实验步骤清晰详细深入,实验记录真实完整等)报告撰写质量得分(30分)(报告规范、完整、通顺、详实等)总成绩(100分)指导教师签字:日期:汇编语言程序设计实验报告0目录1实验目的与要求.......................................................12实验内容.............................................................13实验过程.............................................................23.1任务1............................................................................................................................23.1.1设计思想及存储单元分配........................................................................................23.1.2流程图........................................................................................................................33.1.3源程序........................................................................................................................43.1.4实验步骤..................................................................................................................123.1.5实验记录..................................................................................................................124体会................................................................14参考文献...............................................................15汇编语言程序设计实验报告11实验目的与要求(1)掌握子程序设计的方法与技巧,熟悉子程序的参数传递方法和调用原理;(2)掌握宏指令、模块化程序的设计方法;(3)掌握较大规模程序的合作开发与调试方法。2实验内容进一步修改与增强实验二的学生成绩查询程序的功能,具体要求如下:(1)程序执行时首先显示一个功能菜单:选择1=录入学生姓名和各科考试成绩,2=计算平均分,3=成绩排序,4=输出成绩单,5=程序退出。提示:由于学生姓名和成绩是通过程序录入的,因此,定义学生成绩表缓冲区时,初始值都可以置零。为避免录入成绩的时间过程太长,假定学生人数在5人左右,具体人数自行决定。(2)2人一组,一人负责包括菜单显示、程序退出在内的主程序,以及菜单中的功能1和2;另一人负责菜单中的功能3和4。各自汇编自己的模块,然后连接生成一个程序。注意,在每个模块的开始,注明编写者的名字以及同组同学的名字。(3)录入学生姓名和各科考试成绩时,首先显示录入的是第几个学生的信息,然后分别在提示之后输入姓名和各科成绩(可以借鉴书上十进制转二进制的子程序F10T2)。所有学生信息录入完毕后回到菜单显示的位置。姓名及考试成绩的存放、平均分的计算,按照实验二的要求。(4)排序的基本要求是按照平均成绩从高到低排序,也可以考虑按照指定课程的成绩排序。输出成绩单的基本要求是按照排序的结果依次显示每个学生的姓名和平均成绩,也可以考虑按照指定课程、指定进制的形式显示(可以借鉴书上二进制转十进制的子程序F2T10)。提示:可以采用一个一维数组记录每个学生成绩的排序名次,这样就可以避免在排序算法里交换成绩表中的具体信息了。(5)将9号和10号DOS系统功能调用定义成宏指令并调用。上述任务中,重要操作环节(纳入到学生自己写的实验步骤中)提示:汇编语言程序设计实验报告2本次实验中需要学生尝试体会的操作可分为以下几种:1.在TD中跟踪到子程序内部有几种方法?在TD中观察子程序调用和返回时堆栈的变化。2.注意观察FAR、NEAR类型子程序的RET指令的机器码有何不同?观察FAR类型子程序被调用时堆栈的变化情况。3.通过把一个模块拆成多个模块或反之,体会子程序和模块化程序设计的方法,体会模块调用关系图、子程序功能说明、输入/输出说明在程序设计中的作用。4.观察不同模块的可合并段合并后变量偏移地址的变化情况。观察不同段在内存里的放置次序。体会模块间段的定义及其对应的装配方法。5.在编程中使用不同的子程序参数传递方法来编写同一个子程序。6.观察模块间的参数的传递方法,包括公共符号的定义和外部符号的引用,若符号名不一致或类型不一致会有什么现象发生?7.通过TD观察宏指令在执行程序中的替换和扩展,解释宏和子程序的调用有何不同。8.如何使菜单和成绩单显示得更漂亮一点?3实验过程3.1任务13.1.1设计思想及存储单元分配任务主要是实现主菜单和功能一、功能二。主菜单很简单,就是重复多次使用9号调用输出菜单栏,然后1号调用输入1、2、3、4、5,选择要实现的功能。子程序1:寄存器分配:CL:输入姓名字符串长度CH:计数:每个学生3次输入成绩SI:循环录入姓名和成绩时SI每+1实现BUF段14个字节的跳跃BX:计数:+1在INPUT_N和INPUT_S和BUF段中实现后移AX:存放姓名的字符和成绩的字符DX:在将输入成绩字符转换为实际成绩时存放成绩子程序2:寄存器分配:BX:+1实现寻找成绩所在的字节SI:每+1实现一个学生到另一个学生的跳跃汇编语言程序设计实验报告3AX:存放3门课相加后的成绩CX:CL:3门课成绩CX:4个学生3.1.2流程图子程序1:开始10号调用输入姓名字符串10号调用循环3次输入成绩N--N==0?NY结束循环3次将字符串转化为真实成绩把成绩放入BUF段将姓名字符串放入BUF段汇编语言程序设计实验报告4子程序2:开始0-SI0-AX0-BX3-CL4-CH0-SS*14-SICL==0?BUF[BX+SI+10]-DLAL+DL-ALBX++CL--NYAX/3-ALAL-BUF[SI+13]S++CH--CH==0?NY结束3.1.3源程序;主程序;编写者:唐礼威;同组同学:鲁凯;功能:定义数据段,打印功能菜单PUBLICBUFPUBLICNEXTRNSORT:NEAREXTRNPRINT:NEAR.386STACKSEGMENTUSE16STACK汇编语言程序设计实验报告5DB200DUP(0)STACKENDSDATASEGMENTUSE16PUBLICBUFDB10DUP(0)DB?,?,?,?DB10DUP(0)DB?,?,?,?DB10DUP(0)DB?,?,?,?DB10DUP(0)DB?,?,?,?NDW0SDW0TIP1DB'Pleasemakethechoice:$'TIP2DB'1inputname$'TIP3DB'2calculatescore$'TIP4DB'3sortingorder$'TIP5DB'4print$'TIP6DB'5exit$'INPUT_NDB12DB?DB10DUP(0)INPUT_SDB6DB?DB4DUP(0)DATAENDSCODESEGMENTUSE16PUBLICASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXNINEMACROA;宏定义9号调用LEADX,A汇编语言程序设计实验报告6MOVAH,9INT21HENDMMENU:NINETIP1;输出菜单MOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HNINETIP2MOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HNINETIP3MOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HNINETIP4MOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HNINETIP5MOVDL,0AHMOVAH,2汇编语言程序设计实验报告7INT21HMOVDL,0DHMOVAH,2INT21HNINETIP6MOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HMOVAH,1INT21H;MOVDL,0AH;MOVAH,2;INT21H;MOVDL,0DH;MOVAH,2;INT21HCMPAL,31HJZL1CMPAL,32HJZL2CMPAL,33HJZL3CMPAL,34HJZL4CMPAL,35HJZOVERJMPMENUOVER:MOVAH,4CHINT21H汇编语言程序设计实验报告8L1:CALLLOPA1JMPMENUL2:CALLLOPA2JMPMENUL3:CALLSORTJMPMENUL4:CALLPRINTJMPMENU;子程序1;编写者:唐礼威;同组同学:鲁凯;功能:输入4个学生的姓名和成绩;寄存器分配:CL:输入姓名字符串长度;CH:计数:每个学生3次输入成绩;SI:循环录入姓名和成绩时SI每+1实现BUF段14个字节的跳跃;BX:计数:+1在INPUT_N和INPUT_S和BUF段中实现后移;AX:存放姓名的字符和成绩的字符;DX:在将输入成绩字符转换为实际成绩时存放成绩LOPA1PROCNEARTENMACROB;宏定义10号调用LEADX,BMOVAH,10INT21HENDMMOVSI,0LOOP1A:MOVBX,0TENINPUT_NMOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2汇编语言程序设计实验报告9INT21HMOVCL,INPUT_N[1]NEXT_N:PUSHAXMOVAX,NIMULAX,14MOVSI,AXPOPAXMOVAL,INPUT_N[2+BX]MOV[BX+SI],ALINCBXDECCL;把每个字符放入BUF段JNZNEXT_NMOVCH,0;三门课的成绩SCORE:MOVBX,0TENINPUT_SMOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HMOVDL,100MOVDH,0MOVCL,INPUT_S[1];输入成绩长度,输入3位数进行转换NEXT_S:;把输入的字符串转为10进制成绩PUSHAXMOVAX,NIMULAX,14MOVSI,AXPOPAXMOVAL,INPUT_S[2+BX]汇编语言程序设计实验报告10SUBAL,