当前位置:文档之家› 实验报告 子程序设计实验

实验报告 子程序设计实验

实验5 子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。

4. 掌握多模块程序设计方法二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

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

DATAS SEGMENTBUF DB00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B, 11100010B,01010010BCAN DB $-BUF ;定义常量CANDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASMAIN PROC FAR ;主程序块START:MOV AX,DATASMOV DS,AXMOV CL,10LEA SI,BUFLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1EXIT:MOV AH,4CHINT 21HMAIN ENDPHEXAC PROC NEAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDPDISP PROC NEAR ;显示子程序MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPCODES ENDSEND START2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

DATA SEGMENTSTR1 DB 0ah,0dh,'PLEASE INPUT YOUR STRING:$'STR2 DB 0ah,0dh,'THE NUMBER OF b is:$'TABLE DB 50, ? ,50 DUP(?),'$'DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX,DATAMOV DS,AXLEA DX,STR1MOV AH,9INT 21HLEA DX,TABLEMOV AH,0AHINT 21HLEA SI , TABLEMOV CL, [SI+1]MOV CH, 0INC SIINC SIMOV AL,'b'MOV AH,0PUSH SIPUSH CXPUSH AXCALL FAR PTR CHECKPOP AXMOV CL,ALLEA DX,STR2MOV AH,9INT 21HMOV DL,CLAND DL, 0FHCMP DL,9JBE CANADD DL,7CAN:ADD DL,30HMOV AH,2INT 21HEXIT:MOV AH,4CHINT 21HCODE ENDSSCODE SEGMENTASSUME CS:SCODE CHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX, [BP+8]MOV AX, [BP+6]XOR AH, AH AGAIN:CMP AL,[SI]JNE CAN1INC AHCAN1:INC SILOOP AGAINMOV AL, AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPSCODE ENDSEND START3. 请编写一个程序来实现简单的程序菜单显示。

(采用多模块程序设计方法)显示一个菜单要求用户从下表中选择:(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 SEGMENTOPT DW YIDW ERmenu DB 0DH,0AH,'THE MENU:' ;显示菜单DB 0DH,0AH,'(1)HEXAC GAME' ;对应-->程序1DB 0DH,0AH,'(2)CHAR STATISTICS PROGRAM';对应-->程序2DB 0DH,0AH,'(3)PRESS "ESC" TO QUIT$'BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B, 11100010B,01010010BCAN DB $-BUF ;定义常量CANstr1 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:$'char2 db 0ah,0dh,'THE NUMBER OF b is:$'DATAS ENDSCODES SEGMENTMAIN PROC FARASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXXOR DI,DIsub bx,bxxor si,siLEA DX,menu ;显示主菜单MOV AH,9INT 21Hmov dl,0dh ;显示回车mov ah,2int 21hMOV DL,0AH ;显示换行MOV AH,2INT 21HMOV AH,1 ;输入选项INT 21HCMP AL,'1'JE YICMP AL,'2'JE ERCMP AL,'3'JE QUITYI: MOV DI,0lea dx,str1mov ah,9int 21hMOV CL,10LEA SI,BUFCALL HEXACLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1JMP CONTINUEER: MOV DI,02Hlea dx,str2mov ah,9int 21hLEA DX,char1MOV AH,9INT 21HLEA DX,TABLEMOV AH,0AH ;输入字符串INT 21HLEA SI , TABLEMOV CL, [SI+1]MOV CH, 0 ;CX中为字符串长度INC SIINC SI ;SI指向串首址TABLEMOV AL,'b'MOV AH,0 ;AX中为待查字符PUSH SIPUSH CXPUSH AX ; 参数送堆栈CALL CHECKPOP AX ;统计个数在AL中MOV CL,ALLEA DX,char2 ;显示结果MOV AH,9INT 21HMOV DL,CLAND DL, 0FHCMP DL,9JBE CAN3ADD DL,7CAN3:ADD DL,30HMOV AH,2INT 21H ;显示统计个数JMP CONTINUEQUIT:LEA DX,str4 ;退出的子程序MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,1BH ;按ESC退出JE EXITCONTINUE:LEA DX,str3 ;用户是否继续执行当前程序MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'Y' ;按y继续,按n退出,不需区分大小写JE YESCMP AL,'y'JE YESCMP AL,'N'JE STARTCMP AL,'n'JE STARTYES: JMP opt[DI] ;继续运行当前子程序EXIT:MOV AH,4CH;退出INT 21HMAIN ENDPCODES ENDSHEXACCODES SEGMENTASSUME CS:HEXACCODESHEXAC PROC FAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDPHEXACCODES ENDSDISPCODES SEGMENTASSUME CS:DISPCODESDISP PROC FAR ;显示子程序MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPDISPCODES ENDSCHARCODE SEGMENTASSUME CS: CHARCODE ;子程序部分CHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX, [BP+8]MOV AX, [BP+6]XOR AH, AHAGAIN:CMP AL,[SI]JNE CAN1INC AHCAN1:INC SILOOP AGAINMOV AL, AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPCHARCODE ENDSEND START三.实验要求1.第一个实验程序用子程序的近程调用实现。

相关主题