子程序设计实验报告

更新时间:2023-09-27 10:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学号:0740303104

姓名:雷凤 子程序设计实验报告

一、实验目的:

1、训练子程序;调用程序以及DOS功能调用程序的编制,进一步熟悉和灵活使用系统功能调用,培养根据具体情况合理划分程序模块的能力

2、掌握主、子程序之间的调用关系,联结方法,提高使用各种参数传递方法的正确性和灵活性。

3、掌握调试主、子程序的基本方法,通过调试进一步理解和加深堆栈在子程序设计中的重要意义的认识

4、上机前要求写好被调试程序的程序文本,并进行静态调试,然后拟定好调试计划和上机操作步骤。

二、实验要求:

1、具体了解和掌握call指令,主,子程序之间的调用和在使用时应注意的问题

2、学习子程序设计和调用的一般方法。 三、实验内容 1、实验任务

试编制一程序,分别对NUM字节单元数组中统计出有多少个20,有多少个5,有多少个2,有多少个1.统计的个数分别放在NUM20、num5、num2、num1单元中。

1. 程序要求用主程序-子程序的结构形式编制。 2. 并且传递参数的方式为堆栈方法。

2、实验的原理

在主程序部分,将统计个数的单元分别放在俩个通用寄存器——AH,AL,DH,DL中,数组首址和数组长度都压栈,设置一个循环次数,送给CX,再调用输出语句进行输出。最重要的是子程序JUSUAN,做好保护现场等准备工作后就将数组中的每个元素分别与20,5,2,1比较,根据不同的结果转到不同的分支语句,对应的不同的计数器相应地增1,并修改地址,继续循环比较。 3、程序设计流程图 子程序流程图

入口 保护现场 取出断点送DI AX,DX清零 [DI]=20 [DI]=5 AH<-AH+1 [DI]=2 AL<-AL+1 [DI]=1 DH<-DH+1 DL<-DL-1 DI<-DI+1 CX<-CX-1? 恢复现场 四、实验步骤 1、编辑(纪事本)

DATAS SEGMENT

NUM DB 20,1,20,5,2,5,2,2,2,20 COUNT EQU $-NUM NUM20 DB ? NUM5 DB ? NUM2 DB ? NUM1 DB ?

;此处输入数据段代码 DATAS ENDS

STACK SEGMENT PARA STACK 'STACK' STAPN DB 100 DUP(?) ;此处输入堆栈段代码 STACK ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACK MAIN PROC FAR

PUSH DS SUB AX,AX PUSH AX

MOV AX,DATAS MOV DS,AX MOV AX,STACK MOV SS,AX START:

MOV BX,OFFSET NUM ;取偏移地址 MOV CX,COUNT ;数组长度送给CX

PUSH BX ;数组首地址入栈 PUSH CX ;数组长度进栈 CALL JISUAN ;调用子程序

MOV NUM20,AH ;将统计的个数保存 MOV NUM5,AL MOV NUM2,DH MOV NUM1,DL

MOV CX,4 ;设置循环次数

LEA DI,NUM20 ;取偏移地址

COUT: ADD [DI],30H ;输出 MOV DL,[DI] MOV AH,02H INT 21H INC DI LOOP COUT RET MAIN ENDP

JISUAN PROC

;PUSH Bx ;保护现场 PUSH CX PUSH BP

MOV BP,SP ;当前栈顶地址送BP BEGIN:

MOV DI,[BP+10] ;DI<-数组首址 MOV CX,10 ;CX<-数组长度 SUB AX,AX ;计数器清零 SUB DX,DX ;计数器清零 GO:

CMP BYTE PTR [DI],20

JE NEXT1 ;比较,相等就转 CMP BYTE PTR [DI],5 JE NEXT2

CMP BYTE PTR [DI],2 JE NEXT3

CMP BYTE PTR [DI],1 JE NEXT4

DO: INC DI ;修改地址 LOOP GO JMP A

NEXT1: INC AH ;计数器加1 JMP DO NEXT2: INC AL JMP DO NEXT3: INC DH JMP DO

NEXT4: INC DL

JMP DO

A: ;POP BX ;恢复现场 POP CX POP BP

RET 4 ;此处输入代码段代码 ;

JISUAN ENDP CODES ENDS END MAIN

2、汇编(masm/ML) 3、连接(link) 4、调试(debug) 5、运行 3241

Press any key to continue 五、实验中各个步骤遇到的问题及解决方法、 1、汇编(masm/ML)

虽然思路比较清晰,但在用堆栈方式进行参数传递时出现了一些语法错误,不知道该何时进栈,对到底应该哪个寄存器进栈也没弄太明白。遇到的这个问题刚开始看了一下书上的例题,但还是没明白,最后是让学得比较好的同学一步一步的帮我分析,找出错误并改正的。 2、连接(link) 3、调试(debug) 六、总结经验

我认为这个程序最难的部分是堆栈部分和子程序的一些清零工作,因为这个题目思路比较明确,主,子程序的大致方向也比较好把握,难就难在一些细节,所以,以后在写一些稍微繁琐偏难得程序时,每一步都要仔细推敲,不然写完了再回过头来检查时很难找出错在哪的。总之,这个程序在修改上花费了不少时间,以后要吸取教训,要培养更缜密的思想。

本文来源:https://www.bwwdw.com/article/sd4d.html

Top