实验报告 子程序设计实验.docx
- 文档编号:11296158
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:15
- 大小:182.42KB
实验报告 子程序设计实验.docx
《实验报告 子程序设计实验.docx》由会员分享,可在线阅读,更多相关《实验报告 子程序设计实验.docx(15页珍藏版)》请在冰豆网上搜索。
实验报告子程序设计实验
实验5子程序实验
一.实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
4.掌握多模块程序设计方法
二.实验内容
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
DATASSEGMENT
BUFDB00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B,11100010B,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,10000010B,10010011B,00100100B,11100010B,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操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.编辑、汇编三个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
六.实验报告要求
1.说明用堆栈传送参数的过程及其具体方法。
2.分析实验结果及所遇到问题,并说明解决的方法。
3、列出各实验题目的程序实现清单,写清楚程序设计思路、各程序模块调用关系及参数传递方式,源程序中对子程序的入口参数和出口参数及功能应进行适当的注释。
七.思考题
分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。
子程序的远程调用是段间的调用,也就是主程序和子程序不在一个段。
近程的调用是段内的调用。
八、实验小结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验报告 子程序设计实验 实验 报告 子程序 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)