华中科技大学汇编实验报告2.docx
《华中科技大学汇编实验报告2.docx》由会员分享,可在线阅读,更多相关《华中科技大学汇编实验报告2.docx(11页珍藏版)》请在冰豆网上搜索。
华中科技大学汇编实验报告2
华中科技大学汇编实验报告2
课程实验报告
课程名称:
汇编语言程序设计实验
实验名称:
实验二分支程序、循环程序的设计
实验时间:
2016-3-29,14:
00-17:
30实验地点:
南一楼804室63号实验台
指导教师:
张勇专业班级:
计算机科学与技术201409班
学号:
U201414813姓名:
唐礼威
同组学生:
无报告日期:
2016年3月30日
原创性声明
本人郑重声明:
本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。
除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。
特此声明!
学生签名:
日期:
成绩评定
实验完成质量得分(70分)(实验步骤清晰详细深入,实验记录真实完整等)
报告撰写质量得分(30分)(报告规范、完整、通顺、详实等)
总成绩(100分)
指导教师签字:
日期:
1
实验目的与要求
1、熟悉分支、循环程序的结构及控制方法,掌握分支、循环程序的调试方法;
2、加深对转移指令及一些常用的汇编指令的理解;
3、加深对常用DOS功能调用指令的理解,进一步熟悉TD的使用。
2实验内容
设计实现一个学生成绩查询的程序。
1、实验背景
在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:
姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。
例如:
NEQU1000
BUFDB‘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,0
DB85,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)”处(提示并输入姓名)。
3实验过程
3.1任务1
3.1.1设计思想及存储单元分配
设计思想:
本实验主要是要解决3个问题:
一是提示并输入学生姓名;二是如何进行字符串的比较从而查询学生;三是如何计算平均分从而分出等级。
依据本次实验的要求,此处用分支、循环程序的结构及控制方法来解决。
寄存器分配:
CX:
存放学生数量(默认3),计数器作用;
BX:
存放目标学生下标值,得到分数缓冲区首地址;
BP:
存放缓冲区基地址;
AL:
存放平均成绩;
AX,DX,SI:
临时寄存器;
3.1.2流程图
3.1.3源程序
.386
STACKSEGMENTUSE16STACK
DB200DUP(0)
STACKENDS
DATASEGMENTUSE16
NEQU3
BUFDB'zhangsan',0,0
DB100,85,80,?
DB'lisi',6DUP(0)
DB80,100,70,?
DB'wangwu',4DUP(0)
DB85,85,100,?
MSGDB'Inputthename:
$'
CONTINUDB'Enteranykeystocontinue(ifenterq,exit!
):
$'
FAILDB'NotExist!
$'
INPUTDB10
DB?
DB10DUP(0)
DATAENDS
CODESEGMENTUSE16
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
JMPBEGIN
FAILED:
LEADX,OFFSETFAIL;查找失败
MOVAH,9H
INT21H
LOOPA:
MOVDL,0AH;换行符
MOVAH,2H
INT21H
LEADX,OFFSETCONTINU;继续
MOVAH,9H
INT21H
MOVDL,0AH;换行符
MOVAH,2H
INT21H
MOVDL,0DH
MOVAH,2H
INT21H
MOVAH,8H
INT21H
CMPAL,71H
JEOVER;输入'q',退出程序
BEGIN:
MOVCX,N;学生个数
LEADX,OFFSETMSG;输出提示信息
MOVAH,9H
INT21H
MOVDL,0AH;换行符
MOVAH,2H
INT21H
LEADX,OFFSETINPUT;读入学生姓名
MOVAH,0AH
INT21H
MOVDL,0AH;换行符
MOVAH,2H
INT21H
LEABP,OFFSETINPUT;将INPUT基址存放至BP
ADDBP,2
CMPDS:
BYTEPTR[BP-1],0H;空字符串
JELOOPA
INCCX
COMPA:
DECCX
JEFAILED;查找失败,重新输入
MOVBX,N;计算目标学生下标值,存放至BX
SUBBX,CX
IMULBX,14;根据目标学生下标值,找到分数缓冲区首地址
MOVAX,10;临时计数器
MOVSI,0
COMPB:
MOVDL,[BX+SI]
MOVDH,BYTEPTRDS:
[BP+SI]
CMPDL,0;如果缓冲区姓名已结束,说明查找成功
JECAL;跳转至平均成绩计算处
CMPDH,DL;比较当前缓冲区姓名与输入姓名字符
JNECOMPA;当前字符相同,继续循环以比较下一字符
INCSI
DECAX
JNECOMPB
CAL:
MOVBX,N;计算目标学生下标值,存放至BX
SUBBX,CX
IMULBX,14
ADDBX,10;根据目标学生下标值,找到分数缓冲区首地址BX=m*14+10
MOVAX,0
MOVDX,0
MOVAL,[BX];计算平均成绩
ADDAX,AX
MOVDL,[BX+1]
ADDAX,DX
MOVDL,[BX+2]
SARDL,1
ADDAX,DX;AL=A*2+B+C/2
SALAX,1
MOVDL,7
IDIVDL;AL=2*AL/7
MOV[BX+3],AL;AVG=AL(AL/3.5)
CMPAL,90
JGELEVELA
CMPAL,80
JGELEVELB
CMPAL,70
JGELEVELC
CMPAL,60
JGELEVELD
JMPLEVELF
LEVELA:
MOVDL,41H;输出成绩等级
MOVAH,2H
INT21H
JMPLOOPA
LEVELB:
MOVDL,42H
MOVAH,2H
INT21H
JMPLOOPA
LEVELC:
MOVDL,43H
MOVAH,2H
INT21H
JMPLOOPA
LEVELD:
MOVDL,44H
MOVAH,2H
INT21H
JMPLOOPA
LEVELF:
MOVDL,46H
MOVAH,2H
INT21H
JMPLOOPA
OVER:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.1.4实验步骤
1.使用编辑程序EDIT.EXE录入源程序,存盘文件名为shiyan.ASM。
2.使用MASM6.0汇编源文件。
即MASMshiyan;
3.观察提示信息,若出错,则用编辑程序修改错误,存盘后重新汇编,直至不再报错为止。
4.使用连接程序LINK.EXE将汇编生成的shiyan.OBJ文件连接成执行文件。
即LINKshiyan;
5.若连接时报错,则依照错误信息修改源程序。
之后重新汇编和连接,直至不再报错并生成shiyan.EXE文件。
6.执行该程序。
即在命令行提示符后输入shiyan后回车,观察执行现象。
7.让9号功能调用显示的信息放在自己希望的位置。
8.在9号功能调用时,尝试带显示字符串的结尾没有“$”结束符。
9.10号功能调用时,输入的字符数超过定义的数量时,它是如何处理的?
3.1.5实验记录
(包括实验条件、输入/输出、错误和修改等信息的记录)
1、实验环境条件:
P31GHz,256M内存;WINDOWS2000命令行窗口;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。
2、按照流程图编写完程序,编译和连接都没问题,运行时出现
后来发现是9号调用的字符串在之前定义时没有以$结尾,改正后程序运行正确
3、程序运行正确,但格式很差,如下图:
改进方法:
在LOOPA里1号调用的换行符后面加上一个回车换行符,即
MOVDL,0AH;换行符
MOVAH,2H
INT21H
后面加上:
MOVDL,0DH
MOVAH,2H
INT21H
改正后运行如下图:
分析:
存放的三个人平均成绩依次为zhangsan:
88等级A;lisi:
83等级B;wangwu:
90等级B,可见与输出结果相符合
4、对于输入字符超过定义的数量时,会出现无法再继续输入的情况如下图:
4体会
这次上机,进一步提高了自己的汇编语言编程能力,通过实验对这门语言有了更深的理解,更加熟悉了调试工具td的使用以及对dos功能调用的理解。
这次上机主要是熟悉分支、循环程序的结构和控制方法,掌握了它们的调试方法,对转移指令有了更深的理解,是从比高级语言更底层的角度去理解了其含义,对其它的汇编指令有了初步的认识,尽管有些指令还是需要查表才能写出来,但相信在
参考文献
[1]王元珍等.80x86汇编语言程序设计.版本(第1版)
[2]王晓虹等.汇编语言程序设计教程.版本(第1版)