实验报告子程序设计实验.docx

上传人:b****3 文档编号:5103589 上传时间:2023-05-08 格式:DOCX 页数:15 大小:181.83KB
下载 相关 举报
实验报告子程序设计实验.docx_第1页
第1页 / 共15页
实验报告子程序设计实验.docx_第2页
第2页 / 共15页
实验报告子程序设计实验.docx_第3页
第3页 / 共15页
实验报告子程序设计实验.docx_第4页
第4页 / 共15页
实验报告子程序设计实验.docx_第5页
第5页 / 共15页
实验报告子程序设计实验.docx_第6页
第6页 / 共15页
实验报告子程序设计实验.docx_第7页
第7页 / 共15页
实验报告子程序设计实验.docx_第8页
第8页 / 共15页
实验报告子程序设计实验.docx_第9页
第9页 / 共15页
实验报告子程序设计实验.docx_第10页
第10页 / 共15页
实验报告子程序设计实验.docx_第11页
第11页 / 共15页
实验报告子程序设计实验.docx_第12页
第12页 / 共15页
实验报告子程序设计实验.docx_第13页
第13页 / 共15页
实验报告子程序设计实验.docx_第14页
第14页 / 共15页
实验报告子程序设计实验.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验报告子程序设计实验.docx

《实验报告子程序设计实验.docx》由会员分享,可在线阅读,更多相关《实验报告子程序设计实验.docx(15页珍藏版)》请在冰点文库上搜索。

实验报告子程序设计实验.docx

实验报告子程序设计实验

实验5子程序实验

一.实验目的

1.掌握主程序与子程序之间的调用关系及调用方法;

2.掌握子程序调用过程中近程调用与远程调用的区别;

3.掌握通过堆栈转送参数的方法。

4.掌握多模块程序设计方法

二.实验内容

1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

DATASSEGMENT

BUFDB00000111B,00100001B,00100010B,00000011B,00000101B,B,B,00100100B,B,01010010B

CANDB$-BUF;定义常量CAN

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

MAINPROCFAR;主程序块

START:

MOVAX,DATAS

MOVDS,AX

MOVCL,10

LEASI,BUF

LOOP1:

;调用子程序语句

callHEXAC

callDISP

DECCAN

JNZLOOP1

EXIT:

MOVAH,4CH

INT21H

MAINENDP

HEXACPROCNEAR;二进制转换成十六进制子程序

MOVBL,[SI]

INCSI

RET

HEXACENDP

DISPPROCNEAR;显示子程序

MOVCL,4

MOVCH,2

MOVE:

;移位语句

ROLBL,CL

MOVDL,BL

ANDDL,0FH

ADDDL,30H

CMPDL,'9'

JBEPRINT

ADDDL,07H

PRINT:

MOVAH,02H;显示语句

INT21H

DECCH

JNZMOVE

MOVDL,''

MOVAH,02H

INT21H

RET

DISPENDP

CODESENDS

ENDSTART

2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

DATASEGMENT

STR1DB0ah,0dh,'PLEASEINPUTYOURSTRING:

$'

STR2DB0ah,0dh,'THENUMBEROFbis:

$'

TABLEDB50,,50DUP(),'$'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEADX,STR1

MOVAH,9

INT21H

LEADX,TABLE

MOVAH,0AH

INT21H

LEASI,TABLE

MOVCL,[SI+1]

MOVCH,0

INCSI

INCSI

MOVAL,'b'

MOVAH,0

PUSHSI

PUSHCX

PUSHAX

CALLFARPTRCHECK

POPAX

MOVCL,AL

LEADX,STR2

MOVAH,9

INT21H

MOVDL,CL

ANDDL,0FH

CMPDL,9

JBECAN

ADDDL,7

CAN:

ADDDL,30H

MOVAH,2

INT21H

EXIT:

MOVAH,4CH

INT21H

CODEENDS

SCODESEGMENT

ASSUMECS:

SCODE

CHECKPROCFAR

PUSHBP

MOVBP,SP

MOVSI,[BP+10]

MOVCX,[BP+8]

MOVAX,[BP+6]

XORAH,AH

AGAIN:

CMPAL,[SI]

JNECAN1

INCAH

CAN1:

INCSI

LOOPAGAIN

MOVAL,AH

MOV[BP+10],AX

POPBP

RET4

CHECKENDP

SCODEENDS

ENDSTART

3.请编写一个程序来实现简单的程序菜单显示。

(采用多模块程序设计方法)

显示一个菜单要求用户从下表中选择:

(1)HEXACGAME      (对应-->程序1)

(2)CHARSTATISTICSPROGRAM    (对应-->程序2)

(3)PRESS“ESC”TOQUIT

用户作出选择1~3时,显示输出要执行操作的名字,如“Yourselectionis1,theprogramwillexecuteHEXACNUMBERGAME!

”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“willyoucontinueprogramreally(Y:

N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。

若用户选择3,要求程序显示提示信息“PleasepressESCkeytoexit!

”,并能按要求正确退出。

DATASSEGMENT

OPTDWYI

DWER

menuDB0DH,0AH,'THEMENU:

';显示菜单

DB0DH,0AH,'

(1)HEXACGAME';对应-->程序1

DB0DH,0AH,'

(2)CHARSTATISTICSPROGRAM';对应-->程序2

DB0DH,0AH,'(3)PRESS"ESC"TOQUIT$'

BUFDB00000111B,00100001B,00100010B,00000011B,00000101B,B,B,00100100B,B,01010010B

CANDB$-BUF;定义常量CAN

str1DB0DH,0AH,'Yourselectionis1,theprogramwillexecuteHEXACGAME!

$'

str2DB0dh,0ah,'Yourselectionis2,theprogramwillexecuteCHARSTATISTICSPROGRAM!

$'

str3DB0DH,0AH,'willyoucontinueprogramreally(Y:

N)$'

str4DB0DH,0AH,'PleasepressESCkeytoexit!

$'

TABLEDB50,,50DUP(),'$'

char1db0ah,0dh,'PLEASEINPUTYOURSTRING:

$'

char2db0ah,0dh,'THENUMBEROFbis:

$'

DATASENDS

CODESSEGMENT

MAINPROCFAR

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

XORDI,DI

subbx,bx

xorsi,si

LEADX,menu;显示主菜单

MOVAH,9

INT21H

movdl,0dh;显示回车

movah,2

int21h

MOVDL,0AH;显示换行

MOVAH,2

INT21H

MOVAH,1;输入选项

INT21H

CMPAL,'1'

JEYI

CMPAL,'2'

JEER

CMPAL,'3'

JEQUIT

YI:

MOVDI,0

leadx,str1

movah,9

int21h

MOVCL,10

LEASI,BUF

CALLHEXAC

LOOP1:

;调用子程序语句

callHEXAC

callDISP

DECCAN

JNZLOOP1

JMPCONTINUE

ER:

MOVDI,02H

leadx,str2

movah,9

int21h

LEADX,char1

MOVAH,9

INT21H

LEADX,TABLE

MOVAH,0AH;输入字符串

INT21H

LEASI,TABLE

MOVCL,[SI+1]

MOVCH,0;CX中为字符串长度

INCSI

INCSI;SI指向串首址TABLE

MOVAL,'b'

MOVAH,0;AX中为待查字符

PUSHSI

PUSHCX

PUSHAX;参数送堆栈

CALLCHECK

POPAX;统计个数在AL中

MOVCL,AL

LEADX,char2;显示结果

MOVAH,9

INT21H

MOVDL,CL

ANDDL,0FH

CMPDL,9

JBECAN3

ADDDL,7

CAN3:

ADDDL,30H

MOVAH,2

INT21H;显示统计个数

JMPCONTINUE

QUIT:

LEADX,str4;退出的子程序

MOVAH,9

INT21H

MOVAH,1

INT21H

CMPAL,1BH;按ESC退出

JEEXIT

CONTINUE:

LEADX,str3;用户是否继续执行当前程序

MOVAH,9

INT21H

MOVAH,1

INT21H

CMPAL,'Y';按y继续,按n退出,不需区分大小写

JEYES

CMPAL,'y'

JEYES

CMPAL,'N'

JESTART

CMPAL,'n'

JESTART

YES:

JMPopt[DI];继续运行当前子程序

EXIT:

MOVAH,4CH;退出

INT21H

MAINENDP

CODESENDS

HEXACCODESSEGMENT

ASSUMECS:

HEXACCODES

HEXACPROCFAR;二进制转换成十六进制子程序

MOVBL,[SI]

INCSI

RET

HEXACENDP

HEXACCODESENDS

DISPCODESSEGMENT

ASSUMECS:

DISPCODES

DISPPROCFAR;显示子程序

MOVCL,4

MOVCH,2

MOVE:

;移位语句

ROLBL,CL

MOVDL,BL

ANDDL,0FH

ADDDL,30H

CMPDL,'9'

JBEPRINT

ADDDL,07H

PRINT:

MOVAH,02H;显示语句

INT21H

DECCH

JNZMOVE

MOVDL,''

MOVAH,02H

INT21H

RET

DISPENDP

DISPCODESENDS

CHARCODESEGMENT

ASSUMECS:

CHARCODE;子程序部分

CHECKPROCFAR

PUSHBP

MOVBP,SP

MOVSI,[BP+10]

MOVCX,[BP+8]

MOVAX,[BP+6]

XORAH,AH

AGAIN:

CMPAL,[SI]

JNECAN1

INCAH

CAN1:

INCSI

LOOPAGAIN

MOVAL,AH

MOV[BP+10],AX

POPBP

RET4

CHECKENDP

CHARCODEENDS

ENDSTART

三.实验要求

1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。

在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。

子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。

一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。

有关该方法的原理此处不再介绍。

4.第三个程序,请采用分文件多模块程序设计方法实现,需注意和实验4中的习题4中采用的地址跳跃表实现方法区分开来,需注意外部符号的定义及其使用方法。

5.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

四.实验环境

PC微机

DOS操作系统或Windows操作系统

,,或宏汇编集成环境

五.实验步骤

1.编辑、汇编三个源程序,生成相应的可执行文件(.EXE)

2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。

特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

3.检查程序执行的结果是否正确。

六.实验报告要求

1.说明用堆栈传送参数的过程及其具体方法。

2.分析实验结果及所遇到问题,并说明解决的方法。

3、列出各实验题目的程序实现清单,写清楚程序设计思路、各程序模块调用关系及参数传递方式,源程序中对子程序的入口参数和出口参数及功能应进行适当的注释。

七.思考题

分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。

子程序的远程调用是段间的调用,也就是主程序和子程序不在一个段。

近程的调用是段内的调用。

八、实验小结

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2