华科汇编语言程序设计实验3Word格式文档下载.docx

上传人:b****4 文档编号:18445980 上传时间:2022-12-16 格式:DOCX 页数:24 大小:286.50KB
下载 相关 举报
华科汇编语言程序设计实验3Word格式文档下载.docx_第1页
第1页 / 共24页
华科汇编语言程序设计实验3Word格式文档下载.docx_第2页
第2页 / 共24页
华科汇编语言程序设计实验3Word格式文档下载.docx_第3页
第3页 / 共24页
华科汇编语言程序设计实验3Word格式文档下载.docx_第4页
第4页 / 共24页
华科汇编语言程序设计实验3Word格式文档下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

华科汇编语言程序设计实验3Word格式文档下载.docx

《华科汇编语言程序设计实验3Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华科汇编语言程序设计实验3Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。

华科汇编语言程序设计实验3Word格式文档下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1