《汇编语言程序设计实验》第二次上机实验任务实验名称:实验二分支程序、循环程序的设计。一.实验目的和要求1、熟悉分支、循环程序的结构及控制方法,掌握分支、循环程序的调试方法;2、加深对转移指令及一些常用的汇编指令的理解;3、加深对常用DOS功能调用指令的理解,进一步熟悉TD的使用。二.实验内容设计实现一个学生成绩查询的程序。1、实验背景在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。例如:NEQU1000BUFDB‘zhangsan’,0,0;学生姓名,不足10个字节的部分用0填充DB100,85,80,?;平均成绩还未计算DB‘lisi’,6DUP(0)DB80,100,70,?DBN-3DUP(‘TempValue’,0,80,90,95,?);除了3个已经具体定义了学生信息的成绩表以外,其他学生的信息暂时假定为一样的。DB‘wangwu’,0,0,0,0DB85,85,100,?2、功能一:提示并输入学生姓名(1)使用9号DOS系统功能调用,提示用户输入学生姓名。(2)使用10号DOS系统功能调用,输入学生姓名。输入的姓名字符串放在以in_name为首址的存储区中。(3)若只是输入了回车,则回到“(1)”处重新提示与输入;若仅仅输入字符q,则程序退出,否则,准备进入下一步处理。3、功能二:以学生姓名查询有无该学生(1)使用循环程序结构,在成绩表中查找该学生。(2)若未找到,就提示用户该学生不存在,并回到“功能一(1)”的位置,提示并重新输入姓名。(3)若找到,则将该学生课程成绩表的起始偏移地址保存到POIN字变量中。提示:字符串比较时,当采用输入串的长度作为循环次数时,若因循环次数减为0而终止循环,则还要去判断成绩表中名字串的下一个字符是否是结束符0,若是,才能确定找到了。4、功能三:计算所有学生的平均成绩使用算数运算相关指令计算并保存每一个学生的平均成绩。平均成绩计算公式:(A*2+B+C/2)/3.5,即将语文成绩A乘以权重2、英语成绩C除以权重2后,与数学成绩B一起求和,再计算该生的平均成绩。要求避免溢出。提示:使用循环程序结构,注意寻址方式的灵活使用。把小数3.5转换成分数后再运算避免使用浮点数指令。5、功能四:将功能二查到的学生的平均成绩进行等级判断,并显示判断结果。(1)平均成绩等级显示方式:若平均成绩大于等于90分,显示“A”;大于等于80分,显示“B”;大于等于70分,显示“C”;大于等于60分,显示“D”;小于60分,显示“F”。提示:使用分支程序结构,采用2号DOS系统功能调用显示结果。(2)使用转移指令回到“功能一(1)”处(提示并输入姓名)。6、思考与选做功能(1)对输入的姓名进行合法性检查,比如:是否存在大小写字母之外的字符,等等;若存在非法的输入情形,则提示之后重新输入。(2)对BUF中预先定义的课程成绩表中的所有成绩项进行合法性检查,判断是否符合实际(如超过100分等),不符合则提示并退出程序。预先定义的学生姓名中,如果有重名如何处理?(3)除了显示平均成绩的等级外,还将平均成绩同时显示。(4)由于有些课程体系中,成绩的满分可能会达到300分,此时,成绩项的定义必须采用字类型,那么,如何改造程序呢?采用数据结构来定义BUF存储区是否会更好?上述任务中,重要操作环节(纳入到学生自己写的实验步骤中)提示:功能编号序号学生尝试的操作功能一、二1如何让9号功能调用显示的信息放在自己希望的位置?2如果在9号功能调用时,带显示字符串的结尾没有“$”结束符会怎样?3如果在9号功能调用前,未对DS赋值,或者未对DX给予正确的值,结果会如何?410号功能调用时,输入的字符数超过定义的数量时,它是如何处理的?5查找学生姓名时,如何提高查找速度?6循环或转移时,是否有多种指令的组合方式实现?7注意观察转移指令机器码的编码方法,观察对应标号的偏移地址与该编码之间的关系。8检查循环程序,是否可能出现死循环的情况。功能三、四1把除以3.5,改成乘2除以7。简化一下计算公式。2单步观察计算过程,结果是否正确?3用TD直接修改BUF区的成绩值,使得程序对应的每个分支都能得到验证。4选取特殊的值,观察计算结果溢出的情况。