华科汇编语言程序设计实验3Word格式文档下载.docx
- 文档编号:18445980
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:24
- 大小:286.50KB
华科汇编语言程序设计实验3Word格式文档下载.docx
《华科汇编语言程序设计实验3Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华科汇编语言程序设计实验3Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
2人一组,一人负责包括菜单显示、程序退出在内的主程序,以与菜单中的功能1和2;
另一人负责菜单中的功能3和4。
各自汇编自己的模块,然后连接生成一个程序。
录入学生姓名和各科考试成绩时,首先显示录入的是第几个学生的信息,然后分别在提示之后输入姓名和各科成绩(可以借鉴书上十进制转二进制的子程序F10T2)。
所有学生信息录入完毕后回到菜单显示的位置。
姓名与考试成绩的存放、平均分的计算,按照实验二的要求。
排名的基本要求是按照平均成绩从高到低计算名次,也可以考虑按照指定课程的成绩排名。
相同平均分时排名相同,下一个相邻平均分的排名应该是排名在前的所有人数和的下一个数值。
输出成绩单的基本要求是依次显示每个学生的姓名、平均成绩和排名,也可以考虑按照指定课程、指定进制的形式显示(可以借鉴书上二进制转十进制的子程序F2T10)。
将9号和10号DOS系统功能调用定义成宏指令并调用。
任务2:
在C语言程序中调用汇编语言实现的函数
对于任务1的程序进行改造,主控程序、以与输入输出等功能用C语言实现,其他功能用独立的汇编语言子程序的方式实现;
在C语言程序中调用汇编语言子程序。
3实验过程
3.1任务1
3.1.1设计思想与存储单元分配
此次任务使用的数据段分配比较简单,一开始就用MENU来存放显示菜单的字符串,并以$结尾,此次还使用了两个宏定义,分别是WRITE和READ,分别用来输出和输入数据。
BUF用以存放5位学生的基本信息,前十个字节用来存放学生姓名,后三个用来存放语文,数学,英语成绩。
后两个用来存放平均成绩和排名。
FUN11、CHINESE、MATH、ENGLISH、SUC作为提示信息。
Inname作为输入学生姓名的缓冲区,GRADE作为输入学生姓名的缓冲区。
3.1.2流程图
1.开始界面设计流程图如图3.1.1所示
3.1.1开始界面的程序流程图
2.学生信息输入流程图如图3.1.2所示
3.1.2模块一的程序流程图
3.模块二计算平均分流程图如图3.1.3
3.1.3模块二的程序流程图
3.1.3源程序
;
编写者:
刘伟光同组人:
刘智博,王国瑞
NAMEWAN12
EXTRNWAN3:
NEAR,WAN4:
NEAR
.386
STACKSEGMENTUSE16STACK
DB500DUP(0)
STACKENDS
DATA1SEGMENTUSE16PARAPUBLIC'
D1'
NEQU5
MENUDB0AH,0DH,'
|---------------Menu---------------|'
DB0AH,0DH,'
|1.inputtheinformation|'
DB0AH,0DH,'
|2.Calculatedaverage|'
|3.Calculatedorder|'
|4.Printthetable|'
|5.quittheprogram|'
|----------------------------------|'
0AH,0DH,'
$'
BUFDBNDUP(16DUP(0));
前十个用来存放姓名
FUN11DB0AH,0DH,'
Pleaseinputthename:
CHINESEDB0AH,0DH,'
Pleaseinputthechinesegrade:
MATHDB0AH,0DH,'
Pleaseinputthemathgrade:
ENGLISHDB0AH,0DH,'
Pleaseinputtheenglishgrade:
'
'
SUCDB0AH,0DH,'
FuctionSuccess$'
CRLFDB0DH,0AH,'
;
回车换行
GRADEDB3
DB?
DB3DUP(0)
innameDB11
DB11DUP(0)
BUF10DB15DUP(0)
DATA1ENDS
CODESEGMENTUSE16PARAPUBLIC'
CODE'
代码段
ASSUMECS:
CODE,DS:
DATA1,SS:
STACK
START:
MOVAX,DATA1
MOVDS,AX
MOVAX,STACK
MOVSS,AX
WRITEMACROA;
输出功能的宏定义
PUSHDX;
保护现场
PUSHAX
LEADX,A
MOVAH,9
INT21H
POPAX
POPDX
ENDM
READMACROA;
输入功能的宏定义
MOVAH,10
MAIN:
WRITEMENU;
输出菜单
MOVAH,1
INT21H
WRITECRLF
MOVCX,0
CMPAL,31H
JZFUN1
CMPAL,32H
JZFUN2
CMPAL,33H
JZFUN3
CMPAL,34H
JZFUN4
CMPAL,35H
JZFUN5
FUN1:
MOVDL,CL;
cx用作计数器
ADDDL,30H;
DL做提示用的数字的ASCII码
INCDL
MOVAH,2
MOVDL,3AH
INT21H;
提示第几个学生
输入学生姓名
WRITEFUN11;
提示输入姓名
READinname
MOVAL,inname+1
MOVAH,0
MOVSI,0
LOOPA:
MOVBX,CX;
BX是当前学生的前一个
IMULBX,16;
BX表示当前学生姓名首字母偏移地址
MOVDL,inname[SI+2]
MOVBUF[BX+SI],DL;
转移字符串
INCSI
CMPSI,AX
JNZLOOPA
MOVBUF[BX+SI],24H
输入学生语文成绩
WRITECHINESE
READGRADE
MOVAX,WORDPTRGRADE+2
SUBAL,30H
MOVDL,AL
MOVDH,0
IMULDX,10;
对十位数的处理
SUBAH,30H;
对个位数的处理
ADDAH,DL
MOVBUF[BX+10],AH
输入学生数学成绩
WRITEMATH
MOVBUF[BX+11],AH
输入学生英语成绩
WRITEENGLISH
MOVBUF[BX+12],AH;
存放
INCCX;
循环控制
WRITECRLF
CMPCX,N
JNZFUN1
MOVAX,03H;
清屏
INT10H
JMPMAIN
FUN2:
MOVAX,0
MOVDX,0
MOVBX,CX
计算所在位置
ADDBX,10
MOVDL,BUF[BX]
ADDDL,DL
ADDAX,DX
INCBX
ADDAX,DX
SARDL,1
ADDAX,DX;
总成绩
SALAX,1
MOVDL,7
DIVDL
INCBX
MOVBUF[BX],AL
INCCX
JNZFUN2
LEADX,SUC
FUN3:
MOVSI,OFFSETBUF
CALLWAN3
LEADX,CRLF
MOVAX,0003H;
JMPSTART
FUN4:
MOVDI,OFFSETBUF10
CALLWAN4
FUN5:
MOVAH,4CH
GRADEPPROC
MOVAL,GRADE+1
MOVAH,0;
成绩长度存储在AX中
CMPAX,3
JZLOOP3
CMPAX,2
JZLOOP2
CMPAX,1
JZLOOP1
LOOP3:
MOVBUF[BX+DI],64H
RETN
LOOP2:
MOVBUF[BX+DI],AH;
LOOP1:
MOVAL,GRADE+2
MOVBUF[BX+DI],AL
GRADEPENDP
CODEENDS
ENDSTART
3.1.4实验步骤
1.准备上机环境,编辑、汇编、连接文件4。
2.按F9来执行程序文件。
3.进行功能一的测试,窗口提示输入要查找的学生的姓名,在窗口中输入姓名。
成功后,再直接敲入回车,测试功能。
4.运行功能二,测试功能。
5.(思考题)美化菜单
6.(思考题)跟踪到子程序内部,在TD中观察子程序调用和返回时堆栈的变化。
在进入子程序的时候观察堆栈区的值的变化
7.(思考题)观察公共符号的定义和外部符号的引用,若符号名不一致或类型不一致时的现象。
8.(思考题)观察EXTRN说明语句放在.386之前或者之后的区别。
9.(思考题)总结过程中所遇到的错误。
3.1.5实验记录与分析
1.实验环境条件:
P31GHz,256M内存;
WINDOWS10下DOSBox0.72;
EDIT.EXE2.0;
MASM.EXE6.0;
LINK.EXE5.2;
TD.EXE5.0。
2.程序开始菜单如图3.1.4所示:
图3.1.4程序开始菜单
3.模块一输入学生信息如图3.1.5所示:
图3.1.5输入学生信息
4.模块二计算平均成绩如图3.1.6所示:
图3.1.6计算平均成绩
5.模块四打印成绩如图3.1.7所示:
分析:
测试样例:
姓名:
zhang,语文成绩:
60,数学成绩:
70,英语成绩:
80;
li,语文成绩:
50,数学成绩:
40,英语成绩:
30;
liu,语文成绩:
90,数学成绩:
85,英语成绩:
75;
sun,语文成绩:
86,数学成绩:
76,英语成绩:
66;
wang,语文成绩:
60,英语成绩:
70;
理论输出:
zhang,平均成绩:
65,排名:
3;
li,平均成绩:
44,排名:
5;
liu,平均成绩:
86,排名:
1;
sun,平均成绩:
80,排名:
2;
wang,平均成绩:
55,排名:
4;
由运行结果可知,代码的输出功能正确。
6.(思考题)追踪子程序观察堆栈段变化,如图3.1.8,3.1.9所示:
图3.1.8调用子程序前的堆栈段
图3.1.9进入子程序后的堆栈段
已知调用子程序的下一句是IP地址为000D,显然在调用子程序的时候,程序将子程序的出口的IP压入堆栈段,等到子程序运行完毕return的时候,将IP地址出栈,根据堆栈段中的IP地址作为自己下一步的IP。
7.(思考题)观察FAR、NEAR类型子程序的RET指令的机器码,far类型如图3.1.10和3.1.11。
图3.1.10进入far子程序前的代码段和堆栈段
图3.1.11进入far子程序前的代码段和堆栈段
far类型子程序相比near型子程序,在前面多了0b0c,仔细观察是代码段cs的内容,进入子程序后,先把子程序的出口的IP压入堆栈段,再将代码段中的内容压入堆栈段。
8.(思考题)观察公共符号的定义和外部符号的引用,若符号名不一致或类型不一致的现象,将主程序文件中的wan3:
near改成wan5:
near,再将主文件中所有的wan3改成wan5,link连接时发生以下错误,错误如图3.1.12所示。
图3.1.12使用错误的公共类型发生的错误
当多个模块的公告定义不同时,虽然在编译各个文件的时候不会出错误,但是在连接程序的时候会发生找不到wan5扩展的错误。
9.(思考题)观察EXTRN说明语句放在.386之前或者之后的区别,将EXTRN说明语句放到.386后面观察运行,运行结果如下:
图3.1.13进入far子程序前的代码段和堆栈段
经过各个方面的测试,验证说明更改后的语句依旧能正常运行。
10.(思考题)观察宏定义在反汇编中的扩展,源代码如图3.1.14,反汇编如图3.1.15
图3.1.13原汇编代码
图3.1.13反汇编中宏定义的展开
分析:
调用宏定义在反汇编中会直接展开。
11.总结错误一,这个是比较低级的错误,在刚开始组接模块的时候,漏掉了对于模块三和模块四的扩展语句,导致程序编译时发生错误,错误如图3.1.14。
10.
11.图3.1.14缺少entrn语句时代码编译发生的错误
12.总结错误二,基址加变址寻址的经典错误,这是我第二次栽在这个坑里面了,基址只能使用bx,bp,IR只能选择SI,DI,正确与错误输入的方式如下:
图3.1.15错误的使用基址加变址寻址
图3.1.15正确的使用基址加变址寻址
对于基址加变址寻址的学习还是需要加深,熟练掌握应当使用哪些寄存器不该使用哪些寄存器。
3.2任务2
3.2.1设计思想与存储单元分配
这次的程序由C语言部分和汇编程序构成,使用的IDE是vs2017,程序中调用汇编的子程序,在C语言中构建学生的结构,其中名字用十个字符类型保存,三门成绩和平均成绩用char型来存储,目的是为了和汇编中当初的数据结构相匹配,最后用一个shortint型来保存该学生的名次。
3.2.2流程图
1.任务二流程图如图3.2.1所示
3.2.1开始界面的程序流程图
3.2.3源程序
#include<
stdio.h>
#include<
stdlib.h>
typedefstruct{
charname[10];
charmark[4];
shortrank;
}st;
extern"
C"
voidWAN2(st*stu);
voidWAN3(st*stu);
ststu[5];
charout[4]={0,0,0,0};
intchange;
intinput(void){
intj;
for(j=0;
j<
=4;
j++)
{
printf("
pleaseinputthename:
"
);
scanf("
%s"
stu[j].name);
pleaseinputtheChinesegrade:
%d"
&
change);
stu[j].mark[0]=(char)change;
pleaseinputthemathgrade:
stu[j].mark[1]=(char)change;
pleaseinputtheEnglishgrade:
stu[j].mark[2]=(char)change;
输入完成\n"
getchar();
}
return0;
}
voidoutput(void){
thenameis\n"
his/heraveragegradeis"
out[0]=stu[j].mark[3];
change=(int)out[0];
%d\n"
change);
Theorderis:
\n%d\n"
stu[j].rank);
intmain(void){
intop=1;
while(op)
system("
cls"
\n\n"
\t\t\t.............Menu...............\n"
\t\t\t1.Inputtheinformation.\n"
\t\t\t2.Calculatedaverage.\n"
\t\t\t3.Calculatedorder\n"
\t\t\t4.Printthetable\n"
\t\t\t0.quit.\n"
\t\t\t................................\n"
op);
switch(op){
case1:
input();
getchar();
break;
case2:
WAN2(stu);
case3:
WAN3(stu);
case4:
output();
case0:
}
3.2.4实验步骤
1.准备上机环境,编辑、汇编、运行vs生成解决方案。
2.使用ml编译两个模块文件,生成两个obj文件。
3.使用vs建立解决方案,建立一个项目,将c的源文件和两个obj的文件导入进vs中。
4.生成解决方案,使用vs进行跟踪调试。
5.观察调用汇编子程序时的反汇编代码。
6.(思考题)探讨c语言中调用汇编子程序时,对汇编子程序是否敏感。
7.总结实验中的错误。
3.2.5实验记录与分析
WINDOWS10下VS2017;
MASM32;
2.程序开始菜单如图3.2.2所示:
图3.2.2程序开始菜单
3.输入学生信息如图3.2.3所示:
图3.2.3输入学生信息
4.模块二计算平均成绩如图3.2.4所示:
图3.2.4计算平均成绩
5.模块三排序如图3.2.5所示:
图3.2.5对学生成绩进行排序
6.模块四打印成绩如图3.2.6所示:
图3.2.6计算平均成绩
5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 实验