《2023年实验报告子程序设计实验.docx》由会员分享,可在线阅读,更多相关《2023年实验报告子程序设计实验.docx(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验5子程序实验.实验目的1 .掌握主程序与子程序之间的调用关系及调用方法;2 .掌握子程序调用过程中近程调用与远程调用的区别;3 .掌握通过堆栈转送参数的方法。4 .掌握多模块程序设计方法.实验内容1 .将BUF开始的1 0个单元中的二进制数转换成两位十六进制数的ASCI I码,在屏幕 上显示出来。规定码型转换通过子程序HEXAC实现,在转换过程中,通过子程序D ISP实 现显示。DATAS SEGMENToBUF DB 0 0 0 00111B,OO1OOOO1B,OO1O 0 0 10B, 0 000 0 01 1 B,0000 0lOIBJOOOOO I0BJ001 0OIIB,OOl
2、 OOIOOBJ 1 1000l0B,010100l0BCAN D B $- B UF ;定义常量CANDATAS ENDSCODE S SEGMENTASSUME CS : CODES, DS:DATASMAIN PROC FAR;主程序块START:MOV AX.DATA SMOV D S ,AXMOV CLJOLEA SI,BUFLOOP1:LOOP1:;调用子程序语句MOVDL,C LANDDL, OFHCMPDL,9JBECAN3ADDDL,7C AN3:ADDDL, 3 OHMOVAH,2INT21H;显示记录个数JMPCONTINUEQUIT:LEADX,str4;退出的子程序M
3、OVAH.9INT2iHMOVAH, 1INT21HCMPAL,1 BH;按ESC退出JEEXITC ONTINUE:LEADX,st r 3;用户是否继续执行当前程序MOVAH,9INT2 1 HMOVAH.II NT21HCMPALY;按y继续,按n退出,不需区分大小写JEYESCMPAL, yJEYESCMPAL/ N,J ESTARTCMPA L:nJESTARTYES:J MPopt|D I EXIT:MOVAH,4 CH;退出INT21HMA I N ENDP;继续运营当前子程序CODES E NDSHEXA C CODES SEGM ENTASSUME CS:HEXACCO DE
4、SHEXAC PROC FAR;二进制转换成十六进制了程序MOVBL, SIINCSIRETHEXAC ENDPHEX A CCODESENDSDISPCODES SEGM ENTASSUM E CS:D I SPCODESDIS P PROC FAR;显示子程序MOV CL, 4MOV CH, 2MOVE:RO L BL,CLMOV DL,B LAND D L,0FHADD DL, 30HCMP DL/ 9JBE PRINTADD DL,07HPRINT:MOV AH,0 2HINT 21 HDEC CHJNZ MOVEMOV D L,MOV AH, 02HINT 2 IHR ETDISP
5、ENDPDISP CODES ENDSCHARCODE SEGMENTASS UMECS: CHARCODECHE C K PROC FARPUSH BP;移位语句;显示语句;子程序部分MOVBP,SPMOVSI4BP+1OMOVCX, BP+8MOVAX, BP+6JXORAH, AHAGAIN:CMPAL,SIJNECAN1INCAHCAN1:INCSILOOPAGAINMOV AL, AHMOVBP+ 1 0,AXPOPBPRET4CHECK END PCHARCOD E ENDSE ND STARTTHE MENU: HEXAC GAME CHftR STATISTICS PROGRA
6、M PRESS ESC TO QUIT 1Your selection isprogram will execute HEXAC GAME721 22 03 05 82 93 2452 01will you continue program really?n THE MENU: HEXAC GAME CHAR STATISTICS PROGRAM PRESS “ESC TO QUIT2 Vour selection is 2,the program will execute CHAR STATISTICS PROGRAM? PLEASE INPUT YOUR STRING:bdbfbbbbsd
7、jfhWETHE NUMBER OF b is:6 will you continue program really?n THE MENU: HEXAC GAME CHAR STATISTICS PROGRAM PRESS “ESC” TO QUIT L C1HEXAC GAME (2CHAR STATISTICS PROGRAM (3PRESS ”ESC“ TO QUIT Lfour selection is 1,the program will execute HEXAC GAME?21 22 03 05 82 93 24 E2 52 01ill you continue program
8、really?n FHE MENU: C1HEXAC GAME C2CHAR STATISTICS PROGRAM (3PRESS ”ESC“ TO QUIT2 four selection is 2,the program will execute CHAR STATISTICS PROGRAM? PLEASE INPUT YOUR STRING:bdbfbbbbsdjfh FHE NUMBER OF b is:6 Mill you continue program really?n FHE MENU: C1HEXAC GAME C2CHAR STATISTICS PROGRAM C3PRE
9、SS “ESC” TO QUIT 3三.实验规定1 .第一个实验程序用子程序的近程调用实现。由于在调用HEX AS C子程序时,子程序又 调用了 DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序 的返回地址值。由于是近调用,地址值只涉及返回地址的段内偏移量。在每个子程序的执行 中,检查CS值是不变的。2 .第二个程序是运用远调用的方法调用子程序的。在远调用情况下,主程序与子程序 处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。 子程序调用后,堆栈中保存了返回地址的段地址及段内偏移量。3 .第二个程序中,主程序与子程序之间参数的传送
10、是由堆栈实现的。一段是将参数(此 处是用首址TABL E,串的长度N及待记录的字符“ b )顺序压如堆栈,在子程序调用后, 通过BP指针对堆栈中的参数访问,并将记录的结果通过堆栈返回。有关该方法的原理此处 不再介绍。4 .第三个程序,请采用分文献多模块程序设计方法实现,需注意和实验4中的习题4中 采用的地址跳跃表实现方法区分开来,需注意外部符号的定义及其使用方法。5 .预习子程序设计的基本方法,根据实验内容规定,画出子程序及主程序的流程图;熟 悉键盘键入字符串及用堆栈传送参数的程序段编制方法。四.实验环境PC微机DOS操作系统或Window s操作系统MASM.EXE,LINK.EXE, DE
11、 B UGCO M 或宏汇编集成环境.实验环节1 .编辑、汇编三个源程序,生成相应的可执行文献(.EXE)2 .用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的 变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的具体过程。3 .检查程序执行的结果是否对的。五 .实验报告规定1 .说明用堆栈传送参数的过程及其具体方法。2 .分析实验结果及所碰到问题,并说明解决的方法。3、列出各实验题目的程序实现清单,写清楚程序设计思绪、各程序模块调用关系及参 数传递方式,源程序中对子程序的人口参数和出口参数及功能应进行适当的注释。六 .思考题分析远程调用与近程调用的区别,在用
12、DEBUG有关命令观测时,执行过程有何不同。子程序的远程调用是段间的调用,也就是主程序和子程序不在一个段。 近程的调用是段内的调用。八、实验小结call HEX ACcal 1 D I SPDEC CANJNZ LOOP1EXIT:MOV AH, 4 cHI NT 21HMAIN ENDPHEXAC PROC NEAR;二进制转换成十六进制子程序MOVBL,SII NC SIRETH EXAC ENDPD I SP PROC N EAR;显示子程序MOV C L,4MOV C H,2MOVE:;移位语句ROL BL,C LMOV DL,BLAND DL, OFHADD DL,3 0 HCMP
13、DL/ 9J BE PRINTADD DL, 07HP RINT:MOV AH,02H;显示语句INT 2 1HDEC CHJNZ MOVEMOV DL:MOV AH, 02HINT 21HRETDISP ENDPCODES ENDSEND STARTD: nasti5.01 .exe21 22 03 05 82 93 24 E2 522 .编写一个主程序,从键盘接受若干个字符,然后用远调用的方法,调用子程序记录字符 串中字符,b,的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符“ b”.子 程序返回字符 b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符b及其
14、 个数(设为一位十六进制数)。DATA SEGMENTSTR 1 DB Oah,Od h , PLEAS E INPUT YOUR STRINGSSTR2 DB Oah, Odh/ THE NUMBER OF b i s:$TABLE DB 50, ?,50DUP(?) :$DATA ENDSCODE SEG MENTASSUME CS:CODE, DS: D ATASTART:MOV AX,DATAMOVD S,AXLEADX,STR1MOVAH,9INT21 HleaDX, TABLEMOVAH,0AHINT2 1 HLEAS I , TABLEMOVcl, rsi+nMOVCH, 0IN
15、CSIINCSIMOVAL, b MOVAH, 0PUSHS IPUSHCXPUSHAXCALLFAR PTR CHECKPOPAXMOVC L,ALLEADX, STR 2MOVAH, 9I NT21HMOVDL,CLANDDL, OFHCM PDL, 9JBECANADDDL,7CAN:ADD DL,3 0 HMOV AH,2INT 21HEXIT:MOV AH,4CHINT 21HCODE ENDSS COD E SEGMENTASSUME CS:S C ODECHECK PROC F ARPUSHBPMOVBP,SPMOVSI, BP+1OMOV CX, BP+8MOVAX, BP+
16、6XOR AH, AHAGAIN:CMP AL, SIJN E CAN1INC AHCAN1:INC SILOOP AGAINMOV AL, AHMOV BP+lOb AXPOP B PRET 4C HECK ENDPSCOD E ENDSEND S T ARTPLEASE INPUT YOUR S T RI NG:e hrbu baIhf bdas b THE NUMBER OF b is:43 .请编写一个程序来实现简朴的程序菜单显示。(采用多模块程序设计方法)显示一个菜单规定用户从下表中选择:(1 ) HEXAC GAME(相应一,程序 1 )(2CHAR STAT I ST I CS
17、PROGRAM (相应程序 2)(3) PRESS “ESC” TO QUIT用户作出选择13时,显示输出要执行操作的名字,如“ Your selcc t ion is l,the p ro g r a m wi 1 1 ex e cute HEXAC NUMBER GAME! ”然后转向相应的程序去执行, 执行结束前进行退出的判断,显示一个提醒信息“ w ill you co n t i n ue p rogr a m really?(Y:N)规定用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则 返回到菜单。若用户选择3,规定程序显示提醒信息“Please press E
18、SC key to ex it!, 并能按规定对的退出。DAT AS SEGMENT。OP T DW YIDW ERmenu DB ODH, 0AH;THE MENU:*;显示菜单DB 0 D H, OAH; (l)HEXAC GAME,;相应一程序 1DB 0DH,0AH, * (2)CHAR STAT I ST I CS PROGRAM;相应一程序2DB ODH, 0AH;(3) PRES S ESC TO QUITSBUF DB 00000 1 11B,00 1 00001B,00 1 00 0 1 0B,000000 1 1 B, 00 00 01 OlBJOOOO 0 10B, 1
19、001 0011B,00100 100B.1110001 0 B,0 1 0 1 00 1 OBCAN DB$-BUF;定义常量 CANs tr 1 DB 0 D H,0 A H/ Y ou r s electio n i s 1, t he progr a m will exe c ute HEXAC GAME$str2 DB 0 dh, 0 ah,Your s ele c tion is 2,th e prog r am will execu t e CHAR S T ATI S TICS PROGRAM! $s t r3 DB 0DH, 0 A H , will y ou c o n t
20、 inue program re a lly?( Y :N)$str4 DB 0 DH, 0AH,Please pre s s ESC key to e x it!$TABLE DB50,?,50DUP(?),c h a r 1 db Oah.Odh/PL EASE I NPU T YOUR STRING: $char 2 db 0 ah,Odh, THE NUMBER 0 F b i sDATAS ENDSC ODES SEGMENTMAIN PROC FARASSUME CS :CODES,DS:DATASSTART:MOVAX,DATASMOV D S ,AXXORDI, DIsubb
21、x, b xxor s i, s iLEA D X,mcnu;显示主菜单MOVAH, 9I NT 21Hdl.O d h;显示回车YI:m o vah,2int2 1 hMOVDL,0AH;显示换行MOVAH,2I N T21HMOVAH, 1;输入选项INT2 1HCMPAL,TJEYICMPAL/ 2J EERCMPAL, 3JEQUITMOVDI,0leadx,s t rim o vah,9int2 1 hMOVCL,10LEASLBUFCALLHEX AC;调用子程序语句call11 EX ACcallDISPDECCANJNZLOO PlLOOP1:JMPCONTINUEER:MOVDI, 0 2H1 e ad x, s tr2m o vah, 9i n t21 hLEADX, c har 1MOVAH,91NT21HLEADX,TABLEMOVAH,0 AH;输入字符串INT2 1 HLEASI , TABLEMOVCL, SI+ 1 MOVC 11,0;CX中为字符串长度INCS IINCS I;SI指向串首址TABLEMOVAL;bMOVAH,0;AX中为待查字符PUSHSIPUSHCXPUSHAX;参数送堆栈CALLCHECKPOPAX;记录个数在AL中MOVCL, ALLEAD X ,char2;显示结果MOVAH,9INT2IH
限制150内