内容发布更新时间 : 2024/11/14 23:59:00星期一 下面是文章的全部内容请认真阅读。
《汇编语言程序设计实验》 第二次上机实验任务
实验名称:实验二分支程序、循环程序的设计。
一.实验目的和要求
1、熟悉分支、循环程序的结构及控制方法,掌握分支、循环程序的调试方法; 2、加深对转移指令及一些常用的汇编指令的理解;
3、加深对常用DOS功能调用指令的理解,进一步熟悉TD的使用。
二.实验内容
设计实现一个学生成绩查询的程序。 1、实验背景
在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。
例如:
N EQU 1000
BUF DB ‘zhangsan’,0,0 ;学生姓名,不足10个字节的部分用0填充
DB 100, 85, 80,? ; 平均成绩还未计算 DB ‘lisi’,6 DUP(0)
DB 80, 100, 70,?
DB N-3 DUP( ‘TempValue’,0,80,90,95,?) ;除了3个已经具体定义了学生信息的成绩表以
外,其他学生的信息暂时假定为一样的。
DB ‘wangwu’,0,0,0,0
DB 85, 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 4 5 6 7 8 功能1 三、四 2 3 4 如果在9号功能调用前,未对DS赋值,或者未对DX给予正确的值,结果会如何? 10号功能调用时,输入的字符数超过定义的数量时,它是如何处理的? 查找学生姓名时,如何提高查找速度? 循环或转移时,是否有多种指令的组合方式实现? 注意观察转移指令机器码的编码方法,观察对应标号的偏移地址与该编码之间的关系。 检查循环程序,是否可能出现死循环的情况。 把除以3.5,改成乘2除以7。简化一下计算公式。 单步观察计算过程,结果是否正确? 用TD直接修改BUF区的成绩值,使得程序对应的每个分支都能得到验证。 选取特殊的值,观察计算结果溢出的情况。