实验报告子程序设计实验.docx
《实验报告子程序设计实验.docx》由会员分享,可在线阅读,更多相关《实验报告子程序设计实验.docx(13页珍藏版)》请在冰豆网上搜索。
实验报告子程序设计实验
实验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
JNZM