实验报告子程序设计实验Word文档下载推荐.docx
《实验报告子程序设计实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验报告子程序设计实验Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。
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;
显示语句
DECCH
JNZMOVE
MOVDL,'
'
MOVAH,02H
DISPENDP
CODESENDS
ENDSTART
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
DATASEGMENT
STR1DB0ah,0dh,'
PLEASEINPUTYOURSTRING:
$'
STR2DB0ah,0dh,'
THENUMBEROFbis:
TABLEDB50,,50DUP(),'
DATAENDS
CODESEGMENT
CODE,DS:
DATA
MOVAX,DATA
LEADX,STR1
MOVAH,9
LEADX,TABLE
MOVAH,0AH
LEASI,TABLE
MOVCL,[SI+1]
MOVCH,0
INCSI
MOVAL,'
b'
MOVAH,0
PUSHSI
PUSHCX
PUSHAX
CALLFARPTRCHECK
POPAX
MOVCL,AL
LEADX,STR2
MOVDL,CL
ANDDL,0FH
CMPDL,9
JBECAN
ADDDL,7
CAN:
ADDDL,30H
MOVAH,2
INT21H
CODEENDS
SCODESEGMENT
SCODE
CHECKPROCFAR
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
XORAH,AH
AGAIN:
CMPAL,[SI]
JNECAN1
INCAH
CAN1:
LOOPAGAIN
MOVAL,AH
MOV[BP+10],AX
POPBP
RET4
CHECKENDP
SCODEENDS
3.请编写一个程序来实现简单的程序菜单显示。
(采用多模块程序设计方法)
显示一个菜单要求用户从下表中选择:
(1)HEXACGAME (对应-->
程序1)
(2)CHARSTATISTICSPROGRAM (对应-->
程序2)
(3)PRESS“ESC”TOQUIT
用户作出选择1~3时,显示输出要执行操作的名字,如“Yourselectionis1,theprogramwillexecuteHEXACNUMBERGAME!
”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“willyoucontinueprogramreally(Y:
N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。
若用户选择3,要求程序显示提示信息“PleasepressESCkeytoexit!
”,并能按要求正确退出。
OPTDWYI
DWER
menuDB0DH,0AH,'
THEMENU:
'
;
显示菜单
DB0DH,0AH,'
(1)HEXACGAME'
对应-->
程序1
(2)CHARSTATISTICSPROGRAM'
;
程序2
(3)PRESS"
ESC"
TOQUIT$'
BUFDB00000111B,00100001B,00100010B,00000011B,00000101B,B,B,00100100B,B,01010010B
定义常量CAN
str1DB0DH,0AH,'
Yourselectionis1,theprogramwillexecuteHEXACGAME!
str2DB0dh,0ah,'
Yourselectionis2,theprogramwillexecuteCHARSTATISTICSPROGRAM!
str3DB0DH,0AH,'
willyoucontinueprogramreally(Y:
N)$'
str4DB0DH,0AH,'
PleasepressESCkeytoexit!
char1db0ah,0dh,'
char2db0ah,0dh,'
MAINPROCFAR
XORDI,DI
subbx,bx
xorsi,si
LEADX,menu;
显示主菜单
movdl,0dh;
显示回车
movah,2
int21h
MOVDL,0AH;
显示换行
MOVAH,2
MOVAH,1;
输入选项
CMPAL,'
1'
JEYI
2'
JEER
3'
JEQUIT
YI:
MOVDI,0
leadx,str1
movah,9
int21h
CALLHEXAC
JMPCONTINUE
ER:
MOVDI,02H
leadx,str2
LEADX,char1
MOVAH,0AH;
输入字符串
MOVCH,0;
CX中为字符串长度
INCSI;
SI指向串首址TABLE
MOVAH,0;
AX中为待查字符
PUSHAX;
参数送堆栈
CALLCHECK
POPAX;
统计个数在AL中
LEADX,char2;
显示结果
JBECAN3
CAN3:
INT21H;
显示统计个数
QUIT:
LEADX,str4;
退出的子程序
MOVAH,1
CMPAL,1BH;
按ESC退出
JEEXIT
CONTINUE:
LEADX,str3;
用户是否继续执行当前程序
Y'
按y继续,按n退出,不需区分大小写
JEYES
y'
N'
JESTART
n'
YES:
JMPopt[DI];
继续运行当前子程序
MOVAH,4CH;
退出
HEXACCODESSEGMENT
HEXACCODES
HEXACPROCFAR;
HEXACCODESENDS
DISPCODESSEGMENT
DISPCODES
DISPPROCFAR;
DISPENDP
DISPCODESENDS
CHARCODESEGMENT
CHARCODE;
子程序部分
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有关命令观察时,执行过程有何不同。
子程序的远程调用是段间的调用,也就是主程序和子程序不在一个段。
近程的调用是段内的调用。
八、实验小结