




免费预览已结束,剩余5页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南昌大学实验报告学生姓名: 学 号: 专业班级: 实验类型: 验证 综合 设计 创新 实验日期:2010-12-20 实验成绩: 实验6 子程序实验一实验目的1掌握主程序与子程序之间的调用关系及调用方法;2掌握子程序调用过程中近程调用与远程调用的区别;3掌握通过堆栈转送参数的方法。4. 掌握多模块程序设计方法二实验内容1将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。源程序如下:DATAS SEGMENT BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B,11100010B,01010010B CAN DB $-BUF ;定义常量CANDATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASMAIN PROC FAR ;主程序块START: MOV AX,DATAS MOV DS,AX MOV CL,10 LEA SI,BUFLOOP1: ;调用子程序语句 call HEXAC call DISP DEC CAN JNZ LOOP1EXIT: MOV AH,4CH INT 21HMAIN ENDPHEXAC PROC NEAR ;二进制转换成十六进制子程序 MOV BL,SI INC SI RETHEXAC ENDPDISP PROC NEAR ;显示子程序 MOV CL,4 MOV CH,2MOVE: ;移位语句 ROL BL,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,9 JBE PRINT ADD DL,07HPRINT: MOV AH,02H ;显示语句 INT 21H DEC CH JNZ MOVE MOV DL, MOV AH,02H INT 21H RET DISP ENDPCODES ENDS END START2编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符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: DATASTART: MOV AX,DATA MOV DS,AX LEA DX,STR1 ;显示STR1 MOV AH,9 INT 21H LEA DX,TABLE MOV AH,0AH ;输入字符串 INT 21H LEA SI , TABLE MOV CL, SI+1 MOV CH, 0 ;CX中为字符串长度 INC SI INC SI ;SI指向串首址TABLE MOV AL,b MOV AH,0 ;AX中为待查字符 PUSH SI PUSH CX PUSH AX ; 参数送堆栈 CALL CHECK POP AX ;统计个数在AL中 MOV CL,AL LEA DX,STR2 ;显示结果 MOV AH,9 INT 21H MOV DL,CL AND DL, 0FH CMP DL,9 JBE CAN ADD DL,7CAN: ADD DL,30H MOV AH,2 INT 21H ;显示统计个数EXIT: MOV AH,4CH ;退出 INT 21HCODE ENDS SCODE SEGMENT ;子程序部分 ASSUME CS:SCODECHECK PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10 MOV CX, BP+8 MOV AX, BP+6 XOR AH, AHAGAIN: CMP AL,SI JNE CAN1 INC AHCAN1: INC SI LOOP AGAIN MOV AL, AH MOV BP+10,AX POP BP RET 4CHECK ENDPSCODE ENDS END START3. 请编写一个程序来实现简单的程序菜单显示。(采用多模块程序设计方法)显示一个菜单要求用户从下表中选择:(1)HEXAC GAME (对应程序1)(2)CHAR STATISTICS PROGRAM(对应程序)(3)PRESS “ESC” TO QUIT用户作出选择13时,显示输出要执行操作的名字,如“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;对应程序 DB 0DH,0AH,(3)PRESS ESC TO QUIT$ BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B,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:$ char2 db 0ah,0dh,THE NUMBER OF b is:$ DATAS ENDSCODES SEGMENTMAIN PROC FAR ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX XOR DI,DI sub bx,bx xor si,si LEA DX,menu ;显示主菜单 MOV AH,9 INT 21H mov dl,0dh ;显示回车 mov ah,2 int 21h MOV DL,0AH ;显示换行 MOV AH,2 INT 21H MOV AH,1 ;输入选项 INT 21H CMP AL,1 JE YI CMP AL,2 JE ER CMP AL,3 JE QUITYI: MOV DI,0 lea dx,str1 mov ah,9 int 21h MOV CL,10 LEA SI,BUF CALL HEXACLOOP1: ;调用子程序语句 call HEXAC call DISP DEC CAN JNZ LOOP1 JMP CONTINUEER: MOV DI,02H lea dx,str2 mov ah,9 int 21h LEA DX,char1 MOV AH,9 INT 21H LEA DX,TABLE MOV AH,0AH ;输入字符串 INT 21H LEA SI , TABLE MOV CL, SI+1 MOV CH, 0 ;CX中为字符串长度 INC SI INC SI ;SI指向串首址TABLE MOV AL,b MOV AH,0 ;AX中为待查字符 PUSH SI PUSH CX PUSH AX ; 参数送堆栈 CALL CHECK POP AX ;统计个数在AL中 MOV CL,AL LEA DX,char2 ;显示结果 MOV AH,9 INT 21H MOV DL,CL AND DL, 0FH CMP DL,9 JBE CAN3 ADD DL,7CAN3: ADD DL,30H MOV AH,2 INT 21H ;显示统计个数 JMP CONTINUEQUIT: LEA DX,str4 ;退出的子程序 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,1BH ;按ESC退出 JE EXIT CONTINUE:LEA DX,str3 ;用户是否继续执行当前程序 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,Y ;按y继续,按n退出,不需区分大小写 JE YES CMP AL,y JE YES CMP AL,N JE START CMP AL,n JE STARTYES: JMP optDI ;继续运行当前子程序EXIT: MOV AH,4CH;退出 INT 21H MAIN ENDPCODES ENDS HEXACCODES SEGMENT ASSUME CS:HEXACCODESHEXAC PROC FAR ;二进制转换成十六进制子程序 MOV BL,SI INC SI RETHEXAC ENDPHEXACCODES ENDSDISPCODES SEGMENT ASSUME CS:DISPCODESDISP PROC FAR ;显示子程序 MOV CL,4 MOV CH,2MOVE: ;移位语句 ROL BL,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,9 JBE PRINT ADD DL,07HPRINT: MOV AH,02H ;显示语句 INT 21H DEC CH JNZ MOVE MOV DL, MOV AH,02H INT 21H RETDISP ENDPDISPCODES ENDSCHARCODE SEGMENT ASSUME CS: CHARCODE ;子程序部分CHECK PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10 MOV CX, BP+8 MOV AX, BP+6 XOR AH, AHAGAIN: CMP AL,SI JNE CAN1 INC AHCAN1: INC SI LOOP AGAIN MOV AL, AH MOV BP+10,AX POP BP RET 4CHECK ENDPCHARCODE ENDS END START 三实验要求1第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。2第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。4第三个程序,请采用分文件多模块程序设计方法实现,需注意和实验4中的习题4中采用的地址跳跃表实现方法区分开来,需注意外部符号的定义及其使用方法。5预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图; 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。四实验环境PC微机DOS操作系统或 Windows 操作系统MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境五实验步骤1编辑、汇编三个源程序,生成相应的可执行文件(.EXE)2用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。3检查程序执行的结果是否正确。六实验报告要求1 每个子程序的书写格式如下:;子程序名:;子程序功能:;参数说明:;入口参数:;出口参数:;算法描述:子程序实际代码 2.自编源程序需要阐明程序设计思路及总
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论