实验4子程序实验

上传人:宝路 文档编号:2058075 上传时间:2017-07-19 格式:DOC 页数:9 大小:110.50KB
返回 下载 相关 举报
实验4子程序实验_第1页
第1页 / 共9页
实验4子程序实验_第2页
第2页 / 共9页
实验4子程序实验_第3页
第3页 / 共9页
实验4子程序实验_第4页
第4页 / 共9页
实验4子程序实验_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《实验4子程序实验》由会员分享,可在线阅读,更多相关《实验4子程序实验(9页珍藏版)》请在金锄头文库上搜索。

1、实验 4 子程序实验一实验目的1掌握主程序与子程序之间的调用关系及调用方法;2掌握子程序调用过程中近程调用与远程调用的区别;3掌握通过堆栈转送参数的方法。二实验内容1将 BUF 开始的 10 个单元中的二进制数转换成两位十六进制数的 ASCII 码,在屏幕上显示出来。要求码型转换通过子程序 HEXAC 实现,在转换过程中 ,通过子程序 DISP 实现显示。2编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址 TABLE,字符串长度 N 及字符”b”. 子程序返回字符b” 的个数.参数传送采用堆栈实现.主程序在子程序返回后,

2、显示字符”b” 及其个数(设为一位十六进制数)。三实验要求1第一个实验程序用子程序的近程调用实现。由于在调用 HEXASC 子程序时,子程序又调用了 DISP 子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查 CS 值是不变的。2第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看 CS 值,它与主程序中的 CS 值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3第二个程序中,主程序与子程序之间参数的传

3、送是由堆栈实现的。一段是将参数(此处是串首址 TABLE,串的长度 N 及待统计的字符“ b”)顺序压如堆栈,在子程序调用后,通过 BP 指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。4预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图; 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。四实验环境PC 微机DOS 操作系统或 Windows 操作系统MASM.EXE, LINK.EXE,DEBUG.COM 或宏汇编集成环境五实验步骤1编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2用 DEBUG 的 R 命令,T 命令或 G

4、命令和 D 命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。3检查程序执行的结果是否正确。六实验报告要求1说明用堆栈传送参数的过程及其具体方法。2分析实验结果及所遇到问题,并说明解决的方法。七思考题分析远程调用与近程调用的区别,在用 DEBUG 有关命令观察时,执行过程有何不同。参考程序清单1码型转换程序清单:;CONV.ASNDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH ,6FHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA

5、START: MOV AX,DATAMOV DS,AXMOV CX,10LEA BX,BUFAGAIN: MOV AL,BXCALL HEXASCINC BXLOOP AGAINMOV AH,4CHINT 21HHEXASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL, CLPOP CXCALL DISP ;显示高位 HEX 数MOV DL,ALAND DL, 0FHCALL DISPRETHEXASC ENDPDISP PROP CMP DL,9JBE NEXTADD DL,7NEXT: ADD DL,30HMOV AH,2INT 21H ;显示RET D

6、ISP ENDPCODE ENDSEND START2统计并显示某键入字符的个数的程序:;COUNTER.ASMDATA SEGMENTCHAR DB bBUF DB 50H,? ,50H DUP(?)DATA ENDS MCODE SEGMENTASSUME CS: MCODE, DS: DATASTART: MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,9INT 21HLEA SI BUF MOV CL, SI+1MOV CH, 0 ;CX 中为字符串长度INC SI INC SI ;SI 指向串首址 TABLEMOV AL,CHARMOV AH,0 ;AX 中

7、为待查字符PUSH SIPUSH CXPUSH AX ; 参数送堆栈CALL CHECKPOP AX :统计个数在 AL 中MOV DL,CHARMOV AH,2INT 21HMOV DL,ALAND DL, 0FHCMP DL,9JBE NEXT ADD DL,7NEXT: ADD DL,30HMOV AH,2 INT 21H ;显示统计个数MOV AH,4CHINT 21HM CODE ENDSSCODE SEGMENTASSUME CS:SCODECHECK PROC FARPUSH BPMOV BP,SPMOV SI,BP+10MOV CX, BP+8MOV AX, BP+6XOR A

8、H, AHAGAIN: CMP AL.SIJNE NEXT1INC AHNEXT1: INC SILOOP AGAINMOV AL, AHMOV BP+10, AXPOP BPRET 4CHECK ENDPEND START实验 3 中删除输入串中重复字符实例换成子程序书写形式DATA SEGMENTSTR DB 80 DUP(?)LEN DW ?DATA ENDSSTACK SEGMENT STACKDW 100 DUP(?)TOS EQU THIS WORDSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART

9、: MOV AX,DATAMOV DS,AXMOV ES,AX ;初始化数据段和附加段为同一段值MOV AX,STACK MOV SS,AX ;初始化堆栈段LEA SP,TOS ;初始化栈顶指针LEA SI,STR ;SI=接收串的首地址;调用 IN_STR 子程序从键盘输入字符串CALL IN_STR;调用 REPLACE 子程序将输入字符串中重复出现字符替换为 0CALL REPLACE ;调用 DELE 子程序将那些被替换成 0 的字符去掉CALL DELE;调用 ENDLINE 子程序现实回车换行CALL ENDLINE ;调用 PRTSTR 子程序输出结果CALL PRTSTRMOV

10、 AH,4CHINT 21H;= ; 子程序: IN_STR; 功能 : 从键盘输入字符串,以回车结束输入; 入口参数: SI = 输入字符串的首地址; 出口参数: SI = 输入字符串的首地址 ; CX = 输入字符个数;= IN_STR PROC NEAR;保护现场 PUSH AXPUSH SIMOV CL,0 ;CL 用来存放输入字符数AGAIN: MOV AH,1INT 21H CMP AL,0DHJZ IN_DONEMOV SI,ALINC SIINC CLJMP AGAIN IN_DONE: MOV CH,0 ;CX 存放输入字符数 ;恢复现场POP SIPOP AXRETIN_S

11、TR ENDP;= ; 子程序: REPLACE; 功能 : 把字符串中重复出现的字符用 0 替代; 入口参数: SI = 字符串的首地址; CX = 字符个数; 出口参数: 无 ;= REPLACE PROC NEAR ;将串中重复出现的字符用 0 替换 ;保护现场PUSH AXPUSH CXPUSH SIPUSH DIMOV DI,SIINC DI AGN: CMP CX,1 JZ OK ;只有剩一个字符就结束替换PUSH CX ;保护外层循环计数MOV AL,SIAND AL,ALJZ NEXT ;当前字符已被替换为 0 L1: CMP AL,DI JNZ L2MOV BYTE PTRD

12、I,0L2: INC DI LOOP L1 ;内部循环,扫描当前字符后面是否与当前字符相同,相同则用 0 替换NEXT: INC SIMOV DI,SIINC DIPOP CXLOOP AGN OK: ;恢复现场POP DIPOP SIPOP CXPOP AXRETREPLACE ENDP;= ; 子程序: DELE; 功能 : 去掉字符串中为 0 的字符; 入口参数: SI = 字符串的首地址; CX = 字符个数; 出口参数: 无 ;=DELE PROC NEAR;保护现场PUSH AXPUSH BXPUSH CXPUSH SIPUSH DIRPT: AND CX,CXJZ RTN ;CX

13、=0 结束子程序MOV AL,SIAND AL,ALJNZ NEXT1 ;当前字符不是被替换为 0 的字符PUSH CXMOV DI,SIXOR BX,BXCLDREPZ SCASB JNZ L3POP CXJMP RTN ;后面全是 0,不用再继续 L3: DEC DIMOV AL,DIMOV SI,AL MOV BYTE PTRDI,0POP CXNEXT1: INC SIDEC CXJMP RPTRTN: ;恢复现场 POP DIPOP SIPOP CXPOP BXPOP AXRETDELE ENDP;= ; 子程序: PRTSTR; 功能 : 输出字符串; 入口参数: SI = 字符串的首地址; CX = 字符个数; 出口参数: 无 ;=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号