华中科技大学汇编实验报告4Word文档下载推荐.docx
- 文档编号:1004859
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:20
- 大小:197.71KB
华中科技大学汇编实验报告4Word文档下载推荐.docx
《华中科技大学汇编实验报告4Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《华中科技大学汇编实验报告4Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
实验目的与要求
(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系统功能调用定义成宏指令并调用。
上述任务中,重要操作环节(纳入到学生自己写的实验步骤中)提示:
本次实验中需要学生尝试体会的操作可分为以下几种:
1.在TD中跟踪到子程序内部有几种方法?
在TD中观察子程序调用和返回时堆栈的变化。
2.注意观察FAR、NEAR类型子程序的RET指令的机器码有何不同?
观察FAR类型子程序被调用时堆栈的变化情况。
3.通过把一个模块拆成多个模块或反之,体会子程序和模块化程序设计的方法,体会模块调用关系图、子程序功能说明、输入/输出说明在程序设计中的作用。
4.观察不同模块的可合并段合并后变量偏移地址的变化情况。
观察不同段在内存里的放置次序。
体会模块间段的定义及其对应的装配方法。
5.在编程中使用不同的子程序参数传递方法来编写同一个子程序。
6.观察模块间的参数的传递方法,包括公共符号的定义和外部符号的引用,若符号名不一致或类型不一致会有什么现象发生?
7.通过TD观察宏指令在执行程序中的替换和扩展,解释宏和子程序的调用有何不同。
8.如何使菜单和成绩单显示得更漂亮一点?
3实验过程
3.1任务1
3.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实现寻找成绩所在的字节
每+1实现一个学生到另一个学生的跳跃
AX:
存放3门课相加后的成绩
CX:
CL:
3门课成绩CX:
4个学生
3.1.2流程图
3.1.3源程序
;
主程序
编写者:
唐礼威
同组同学:
鲁凯
功能:
定义数据段,打印功能菜单
PUBLICBUF
PUBLICN
EXTRNSORT:
NEAR
EXTRNPRINT:
.386
STACKSEGMENTUSE16STACK
DB200DUP(0)
STACKENDS
DATASEGMENTUSE16PUBLIC
BUFDB10DUP(0)
DB?
?
DB10DUP(0)
NDW0
SDW0
TIP1DB'
Pleasemakethechoice:
$'
TIP2DB'
1inputname$'
TIP3DB'
2calculatescore$'
TIP4DB'
3sortingorder$'
TIP5DB'
4print$'
TIP6DB'
5exit$'
INPUT_NDB12
DB?
DB10DUP(0)
INPUT_SDB6
DB4DUP(0)
DATAENDS
CODESEGMENTUSE16PUBLIC
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
NINEMACROA;
宏定义9号调用
LEADX,A
MOVAH,9
INT21H
ENDM
MENU:
NINETIP1;
输出菜单
MOVDL,0AH
MOVAH,2
MOVDL,0DH
NINETIP2
NINETIP3
NINETIP4
NINETIP5
NINETIP6
MOVAH,1
;
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
CMPAL,31H
JZL1
CMPAL,32H
JZL2
CMPAL,33H
JZL3
CMPAL,34H
JZL4
CMPAL,35H
JZOVER
JMPMENU
OVER:
MOVAH,4CH
L1:
CALLLOPA1
JMPMENU
L2:
CALLLOPA2
JMPMENU
L3:
CALLSORT
L4:
CALLPRINT
子程序1
输入4个学生的姓名和成绩
CL:
在将输入成绩字符转换为实际成绩时存放成绩
LOPA1PROCNEAR
TENMACROB;
宏定义10号调用
LEADX,B
MOVAH,10
MOVSI,0
LOOP1A:
MOVBX,0
TENINPUT_N
MOVDL,0AH
MOVCL,INPUT_N[1]
NEXT_N:
PUSHAX
MOVAX,N
IMULAX,14
MOVSI,AX
POPAX
MOVAL,INPUT_N[2+BX]
MOV[BX+SI],AL
INCBX
DECCL;
把每个字符放入BUF段
JNZNEXT_N
MOVCH,0;
三门课的成绩
SCORE:
TENINPUT_S
MOVDL,100
MOVDH,0
MOVCL,INPUT_S[1];
输入成绩长度,输入3位数进行转换
NEXT_S:
把输入的字符串转为10进制成绩
MOVAL,INPUT_S[2+BX]
SUBAL,30
IMULDL;
(AL)*DL->
AX
ADDDH,AL
PUSHBX
XORAX,AX
MOVAL,DL;
(DL)->
AL
MOVBL,10;
IDIVBL;
(AX)/10->
MOVDL,AL;
(AL)->
DL
POPBX
POPAX
DECCL
JNZNEXT_S;
成绩的3个字符进行转换
ADDBL,CH
MOV[BX+SI+7],DH;
把成绩放入BUF[10]
INCCH
CMPCH,3
JNZSCORE;
循环3次输入成绩
INCN
CMPN,4;
循环输入4个人的信息
JNZLOOP1A
RET
LOPA1ENDP
子程序2
计算4个学生的平均成绩
BX:
4个学生
LOPA2PROCNEAR
MOVSI,0
MOVCH,4
NEXT2:
MOVAX,0
MOVBX,0
MOVCL,3
PUSHAX
MOVAX,S
IMULAX,14
MOVSI,AX
POPAX
NEXT1:
MOVDL,BUF[BX+SI+10]
ADDAL,DL
INCBX
DECCL
JNZNEXT1;
三门课成绩相加
MOVCL,3
IDIVCL
MOVBUF[SI+13],AL
INCS
DECCH
JNZNEXT2
LOPA2ENDP
CODEENDS
ENDSTART
3.1.4实验步骤
1.在TD中跟踪到子程序内部我使用的方法是当程序运行至子程序入口时,直接按f7进入到子程序。
如要进入子程序1:
当程序运行至如图入口时,按下f7
如图,按下f7后进入子程序1执行语句MOVSI,0
2.公共符号的定义和外部符号的引用,若符号名不一致或类型不一致,会发生报错,当我程序中的公共符号和同组同学的外部符号符号名不一致或类型不一致时,会发生报错
3.如图是第一次使用宏定义的9号调用在TD中的语句,可见宏指令的展开只是按宏定义的语句替换和展开的。
说明宏调用是在汇编时展开的,而子程序是在程序执行时由CALL指令调用的,换言之,在汇编后生成的obj文件中,子程序的定义依然存在,而宏定义却不复存在。
4.为了程序的美观,在输出菜单时,采取多次输出的办法,另外在每次10号调用输入后都输出一个回车换行符,这样可以使程序尽量美观。
3.1.5实验记录
(包括实验条件、输入/输出、错误和修改等信息的记录)
1、实验环境条件:
P31GHz,256M内存;
WINDOWS2000命令行窗口;
EDIT.EXE2.0;
MASM.EXE6.0;
LINK.EXE5.2;
TD.EXE5.0。
2、一开始10号功能调用后面忘了加上回车换行,导致输入的总是会被不断覆盖,也就不能正常显示,在后面加上
就能够正常显示了
3、当每输入下一个学生时要在BUF段中+14,一开始想当然直接让SI++,然后14*SI+BX+10寻址,在TD中观察发现输入的成绩每次都只有一个,后来仔细检查代码,发现问题。
后来想用一个寄存器从0加到4时发现寄存器不够了(⊙o⊙)于是就定义了一个字节的N,让N从1加到4,先PUSHAX,N*14->
AX,再(AX)->
SI,POPAX就能实现该功能
4、寻址方式也出了一点小问题,不过很快就解决了,这里就不一一列出了。
最后运行的结果如下(由于算法:
输入3个字符的ascll码减去30再乘相应的位数,输入成绩都要输3位)
再输入2实现计算平均成绩的功能,并回到主程序显示MENU菜单提示下一步操作
在TD数据段中观察实验结果与输入的姓名成绩、计算的平均成绩相符合
4体会
总体来说,这次实验花的时间比以往都要长,主要问题还是出在代码上,写代码花去太多时间,加上代码中出现的错误还比较多,td里调试又花费了很多时间,到最后花了很久才基本弄完,还有一些小地方没有实现,比如要求的每次输入学生要显示是第几个学生,这点没来得及实现,而是选择了一次性输入全部4个人的信息。
由于这次实验功能都融合到一起,刚开始寄存器的分配很繁杂,以至于在程序中多次出现寄存器不够用的尴尬局面,采取的解决方法是用PUSHPOP来空出几个寄存器,使用完毕后再归还。
在实验过程中还出现了很多的低级错误,例如MOV的时候寄存器类型不匹配,还有在使用AL,再使用AX之前没有将高8位置零,这个错误检查了很久才检查出来,耽误了很久。
总之,尽管这次实验效率不够理想,中间还出了很多错误,但是从这些错误中我更多的是取得了收获,也避免了在以后的实验中犯同样类型的错误,以后编程的路还有很远,所以现在还需要多多积累些知识和经验才会在今后的道路上更轻松!
参考文献
[1]王元珍等.80x86汇编语言程序设计.版本(第1版)
[2]王晓虹等.汇编语言程序设计教程.版本(第1版)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 汇编 实验 报告