微机原理及应用实验-简 - 图文 下载本文

《微机原理及应用》实验教程

实验四 子程序设计

基础知识

在程序中,有些部分重复出现,但不一定连续出现,这样的部分可以定义为一个过程,即子程序,于是可以通过调用子程序(过程)来代替这些重复的部分,从而使源程序变得更为简炼。也有些时候,虽然并重复出现的部分,但相对来说,功能比较独立,甚至于比较标准,这样的部分也可以定义为一个子程序。再有些时候,一个程序比较大,可以化整为零,分割成几个部分,每部分单定义为一个子程序,整个主程序变成只须分别调用各个子程序即可,结构清晰,层次分明。

采用子程序结构可以简化源程序书写、提高程序存储效率、减少出错率、增加程序的易读性和可维护性,并且有利于子程序资源的组织和使用.设计子程序时,除了必需要考虑的程序调用、返回和完成特定功能的指令序列外,还必须注意解决子程序设计中带有的共性的一些问题,即:现场保护、参数传递、子程序的嵌套与递归调用、编写子程序说明文档等。

子程序定义为一个过程,实质上和主程序并没有什么两样,事实上相对于DOS操作系统而言,主程序本身也可以定义为一个过程,由DOS进行调用。然而,考虑到子程序与主程序之间的关系,有以下几个具体问题必须解决:

● 调用与返回

● 参数传递

● 现场保护和恢复

由于调用和返回指令都分为近程(段内)和远程(段间)两种方式,所以必须区分其使用场合。在汇编语言中,一个过程的属性定义决定了对它的调用返回的方式,因此,问题归结到如何定义一个过程的调用属性。一般来说,如果一个过程和调用主程序在源文件的同一个代码段内,那么该过程既可以定义为近程型(NEAR),也可以定义为远程型(FAR);如果一个过程和调用它的主程序不在源文件的同一个代码段内(甚至于不在同一个源文件内),那么该过程必须定义为远程型。根据过程定义的属性,主程序使用相应的调用指令对子程序进行调用(近调用或远调用),然而在编写程序时只需要使用相同的调用指令,由汇编软件自动进行协调。

主程序和子程序之间的参数传递一般可采用三种不同的方法。第一种方法是使用CPU内部的寄存器传递参数,最为简单快捷,但受寄存器数量的限制,传递的参数不能太多。第二种方法是使用数据段定义的变量传递参数。当主程序和子程序在同一个模块(源文件)中时,可直接使用模块中定义的变量传递参数;当主程序和子程序不在同一个模块中时,须使用外部变量(在主程序中定义,在子程序中使用)传递参数。第三种方法是使用堆栈传递参数,这要求程序员清楚地了解堆栈结构并熟练地掌握堆栈操作方法。

现场保护和恢复是为了避免子程序破坏主程序正在使用的CPU寄存器的内容。在子程序使用这些寄存器之前先把其内容保存在堆栈内,在子程序即将返回主程序之前把保存的内容恢复到寄存器中。显然,用以返回参数的寄存器是无法加以保护的。

主程序和子程序之间调用与被调用只是一种相对的关系,一个子程序不仅可以被主程序调用,也可以调用另一个子程序,这种结构称为嵌套调用,如图1.7.1所示。

如果一个子程序调用其自身,称为递归调用。递归调用可以有效地处理迭代算法,但由于结构特殊,在设计过程中需要注意避免死循环或堆栈溢出。

15

《微机原理及应用》实验教程

一、实验目的

1、学习子程序的定义和调用方法。

2.掌握子程序、子程序的嵌套、递归子程序的结构。 3、掌握子程序的程序设计、编制及调用。

二、实验仪器、设备

计算机或EPC-1000型嵌入式微机实验仪。

三、实验内容

1、求无符号数字节序列中的最大值和最小值,具体数据在DATA段中定义。 STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS DATA SEGMENT NUM DB 1,2,3,4,5 COUNT EQU $-NUM

MAXNUM DB 'The max number is $' MINNUM DB 'The min number is $! ' DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX LEA SI,NUM MOV CX,COUNT CALL MAX CALL SHOW MOV AH,4CH INT 21H

MAX PROC NEAR JCXZ A4 PUSH SI PUSH CX MOV BH,[SI] MOV BL,BH A1:LODSB

CMP AL,BH JNA A2

MOV BH,AL ;大数送BH JMP A3 A2:CMP AL,BL

JNB A3

MOV BL,AL ;小数送BL A3:LOOP A1

16

《微机原理及应用》实验教程

POP CX POP SI

A4:RET MAX ENDP

SHOW PROC

LEA DX,MAXNUM MOV AH,9 INT 21H MOV AH,2 MOV DL,BH ADD DL,30H INT 21H

CALL CTRL

LEA DX,MINNUM MOV AH,9 INT 21H MOV AH,2 MOV DL,BL ADD DL,30H INT 21H RET SHOW ENDP

CTRL PROC MOV AH,2 MOV DL,0DH INT 21H MOV AH,2 MOV DL,0AH INT 21H RET CTRL ENDP

CODE ENDS

END START

2、用递归的方法实现1+2+?+n求和的功能,入口参数CX=n,AX=0,出口参数AX为级数和。程序运行结果存入存储单元中,可使用DEBUG命令核查。

CODE SEGMENT

ASSUME CS: CODE SUM_P PROC NEAR

JCXZ EXIT

ADD AX, CX DEC CX

CALL SUM_P

EXIT: RET

17

《微机原理及应用》实验教程

SUM_P ENDP

START: MOV AX, 2000H

MOV DS, AX

MOV AX, 0 MOV SI, 0 MOV CX, 7 CALL SUM_P MOV [SI], AX MOV AH, 4CH

INT 21H

CODE ENDS

END START

四、实验步骤

参考前面相关实验内容

五、实验报告要求

参考前言内相关部分内容。 ● 总结子程序递归调用的基本规律 ● 注释实验程序

六、思考题

利用子程序的嵌套和递归调用,实现N!的运算。

N!=N(N-1)(N-2)(N-3)?

0!=1

18