实验报告子程序设计实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 子程序实验
一.实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
4. 掌握多模块程序设计方法
二.实验容
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
DATAS SEGMENT
BUF DB
00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,0010010 0B,11100010B,01010010B
CAN DB $-BUF ;定义常量CAN
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
MAIN PROC FAR ;主程序块
START:
MOV AX,DATAS
MOV DS,AX
MOV CL,10
LEA SI,BUF
LOOP1: ;调用子程序语句
call HEXAC
call DISP
DEC CAN
JNZ LOOP1
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
HEXAC PROC NEAR ;二进制转换成十六进制子程序
MOV BL,[SI]
INC SI
RET
HEXAC ENDP
DISP PROC NEAR ;显示子程序
MOV CL,4
MOV CH,2
MOVE: ;移位语句
ROL BL,CL
MOV DL,BL
AND DL,0FH
ADD DL,30H
CMP DL,'9'
JBE PRINT
ADD DL,07H
PRINT:
MOV AH,02H ;显示语句
INT 21H
DEC CH
JNZ MOVE
MOV DL,' '
MOV AH,02H
INT 21H
RET
DISP ENDP
CODES ENDS
END START
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
DATA SEGMENT
STR1 DB 0ah,0dh,'PLEASE INPUT YOUR STRING:$'
STR2 DB 0ah,0dh,'THE NUMBER OF b is:$'
TABLE DB 50, ? ,50 DUP(?),'$'
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,STR1
INT 21H
LEA DX,TABLE
MOV AH,0AH
INT 21H
LEA SI , TABLE
MOV CL, [SI+1]
MOV CH, 0
INC SI
INC SI
MOV AL,'b'
MOV AH,0
PUSH SI
PUSH CX
PUSH AX
CALL FAR PTR CHECK
POP AX
MOV CL,AL
LEA DX,STR2
MOV AH,9
INT 21H
MOV DL,CL
AND DL, 0FH
CMP DL,9
JBE CAN
ADD DL,7
CAN:
ADD DL,30H
MOV AH,2
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
SCODE SEGMENT
ASSUME CS:SCODE CHECK PROC FAR
PUSH BP
MOV BP,SP
MOV SI,[BP+10]
MOV CX, [BP+8]
MOV AX, [BP+6]
XOR AH, AH AGAIN:
JNE CAN1
INC AH
CAN1:
INC SI
LOOP AGAIN
MOV AL, AH
MOV [BP+10],AX
POP BP
RET 4
CHECK ENDP
SCODE ENDS
END START
3. 请编写一个程序来实现简单的程序菜单显示。(采用多模块程序设计方法)
显示一个菜单要求用户从下表中选择:
(1)HEXAC GAME (对应-->程序1)
(2)CHAR STATISTICS PROGRAM (对应-->程序2)
(3)PRESS “ESC”TO QUIT
用户作出选择1~3时,显示输出要执行操作的名字,如“Your selection is 1,the program will execute HEXAC NUMBER GAME!”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“will you continue program really?(Y:N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。若用户选择3,要求程序显示提示信息“Please press ESC key to exit!”,并能按要求正确退出。
DATAS SEGMENT
OPT DW YI
DW ER
menu DB 0DH,0AH,'THE MENU:' ;显示菜单
DB 0DH,0AH,'(1)HEXAC GAME' ;对应-->程序1
DB 0DH,0AH,'(2)CHAR STATISTICS PROGRAM';对应-->程序2
DB 0DH,0AH,'(3)PRESS "ESC" TO QUIT$'
BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,0010010 0B,11100010B,01010010B
CAN DB $-BUF ;定义常量CAN
str1 DB 0DH,0AH,'Your selection is 1,the program will execute HEXAC GAME!$'
str2 DB 0dh,0ah,'Your selection is 2,the program will execute CHAR STATISTICS PROGRAM!$'
str3 DB 0DH,0AH,'will you continue program really?(Y:N)$'
str4 DB 0DH,0AH,'Please press ESC key to exit!$'
TABLE DB 50, ? ,50 DUP(?),'$'
char1 db 0ah,0dh,'PLEASE INPUT YOUR STRING:$'