子程序及模块化程序设计

上传人:宝路 文档编号:49944274 上传时间:2018-08-05 格式:PPT 页数:29 大小:137.16KB
返回 下载 相关 举报
子程序及模块化程序设计_第1页
第1页 / 共29页
子程序及模块化程序设计_第2页
第2页 / 共29页
子程序及模块化程序设计_第3页
第3页 / 共29页
子程序及模块化程序设计_第4页
第4页 / 共29页
子程序及模块化程序设计_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《子程序及模块化程序设计》由会员分享,可在线阅读,更多相关《子程序及模块化程序设计(29页珍藏版)》请在金锄头文库上搜索。

1、第8章 子程序及模块化程序设计主讲人:8.1 子程序设计方法子程序:在许多应用程序中,常常需要多 次使用某功能的指令序列。这时,为了减 少重复编写程序,节省内存空间,把这一 功能的指令序列组成一个相对独立的程序 段。在程序运行时,如果需要使用这个给 定的功能,就转移到这个独立的程序段, 待这个独立的程序段指令序列执行完后, 又返回到原来位置继续运行程序。我们把 这个相对独立的程序段就叫子程序或过程 。调用程序:编制程序时,按需要转向子程序 ,称为子程序调用,或称为过程调用。调 用子程序的程序称为调用程序或主程序。 主、子程序是相对而言的。但子程序一定 是受调用程序或主程序调用的。n8.1.1

2、子程序定义 格式:过程名 PROC NEAR/FAR过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。一般过程名同标号一样,具有三种属性,即段属性、 偏移地址属性以及类型属性。而类型属性可指定为 NEAR或FAR两种类型。具有NEAR属性的子程序与 调用程序应在同一个逻辑段中,而具有FAR属性的子 程序和调用程序不在同一个逻辑段内。若为NEAR类 型属性时可以省略“NEAR”。n8.1.2 子程序的调用与返回1段内调用子程序调用可以在段内调用,也可以在段间 调用。如果是段内调用,则在过程定义时 ,必须定义为NEAR类型。这时,过程定 义可放在代码段中,置于主程序体之前或

3、 之后。 n2段间调用子程序如果段间调用时,必须定义为FAR类型。段间调用通常用于不同模块之间的调用。编写不同模块的段间调用程序,应该注意以下几个 个问题:(1)主程序模块和子程序模块分别汇编,然后用 连接程序将它们连接在一起。(2)在主程序模块中,主程序所调用的外部过程 名必须用EXTRN伪指令说明。(3)在过程模块中,提供给外段调用的过程名必 须用PUBLIC伪指令说明。(4)模块间其它公用符号名及外部符号名的定义 不可缺少。 n8.1.3 现场保护与恢复 要保护的寄存器:应该是在子程序中将被使用,返回调用程序后 仍然需要使用其原有内容的那些寄存器。即保 护调用程序和子程序两者在使用上发生

4、冲突的 那些寄存器。但在编程时,一时很难弄清哪些 是有冲突的寄存器,一种较为简单的方法是把 所有的寄存器均加以保护。n8.1.4 主程序与子程序的参数传递主程序在调用子程序前,必须把需要子程序处 理的原始数据传递给子程序,即为子程序准备 入口参数。子程序根据入口参数进行一系列处 理之后得到处理结果,该结果必须送给调用它 的主程序,即提供出口参数以便主程序使用。 这种主程序为子程序准备入口参数,子程序为 主程序提供出口参数的过程称为参数传递。n主程序与子程序之间传递参数的方式是事先约 定好的。每一个子程序设计之前,必须确定其 入口参数到哪里去取,处理后的结果送往何处 。一旦子程序按此约定设计出来

5、,无论在何处 对它进行调用都必须满足子程序的要求,否则 ,子程序将无法正常运行,或者得不到正确的 结果。n传递参数的多少反映程序模块间的耦合程度。 根据实际情况,子程序可以只有入口参数或只 有出口参数,也可以入口参数和出口参数同时 存在。常用的参数传递方式有三种:寄存器传 递、存储单元传递和堆栈法传递。n1利用寄存器传递参数n 用寄存器传递参数就是将子程序的入口 参数和出口参数都放在约定的寄存器中。 此法的优点是信息传递快,编程也较方便 ,并且节省内存单元。但由于寄存器个数 有限,而且在处理过程中要经常使用寄存 器,如果要传递的参数很多,将导致无空 闲寄存器供编程用,所以此法只适用于要 传递的

6、参数较少的情况。 n2利用存储器传递参数n 用存储单元传递参数就是将入口参数和 出口参数都放到事先约定好的存储单元之 中。此法的优点是参数传递的数量不受限 制,每个参数都有独立的存储单元,编写 程序时不易出错。缺点是要占用一定数量 的存储单元。 n3利用堆栈传递参数n该方法是利用堆栈作为主程序和子程序之间传递参 数的工具。优点是参数不占用寄存器,也无需另开 辟存储单元,将参数存放在公用的堆栈区,处理完 之后堆栈恢复原状,不影响其他程序段使用堆栈。 缺点是由于参数和子程序的返回地址混杂在一起, 访问参数时必须准确地计算它们在堆栈内的位置。 如果操作不慎,在执行RET指令时,栈顶存放的可 能不是返

7、回地址,从而导致运行混乱。由此可见, 使用该方法编制程序比较复杂。8.2子程序设计举例n见教材8.3子程序的嵌套与递归 n1.子程序的嵌套主程序可以调用子程序,子程序还可以再去 调用另一个子程序,这种情况称为子程序 的嵌套。子程序嵌套的层数没有限制,只 要堆栈空间允许即可。嵌套子程序的设计与调用方法与前面介绍的 子程序设计与调用方法一致。要特别注意以下几点:n调用指令CALL与返回指令RET必须成对使用 。n用寄存器传递参数或作为工作单元时,要及时 保存和恢复寄存器内容。n若程序中用到堆栈,要注意堆栈的正确操作方 法。n2.子程序的递归调用n子程序的递归调用是指一个子程序直接或 间接地调用自己

8、。递归子程序一般对应于 数学上对函数的递归定义,它往往能设计 出效率较高的程序,完成相当复杂的计算 ,递归调用要注意必须有结束递归调用的 判断语句。这里以阶层函数为例,说明递 归子程序的设计方法。8.4 模块化程序设计 模块化程序设计在编程中有重要的作用。当 多人要合作编写一个较大的软件时,要把 软件划分为多个模块,再定义各模块之间 的接口,然后各自完成自己的模块,最后 还要把各模块链接在一起组成软件。n8.4.1 基本思想和主要步骤模块化程序设计的本质思想是自顶向下、 逐步求精。在完成一个大的任务时,将大 任务划分为多个功能模块,必要时还要将 这些模块划分为更小的功能模块。n 模块化程序设计

9、的步骤: ()根据整个程序应达到的功能,将其划分为不同 层次的功能模块,并画出层次图。 ()确定每个功能模块的任务,确定如何在功能模 块中建立段,以及确定各个定位方式、组合方式和“类 别”,以便与其他的段适当组合。 ()确定每个功能模块与其他相关功能模块之间如 何通信。 ()编制各个程序模块,包括给出程序模块的说明 ;将各个程序模块分别做汇编,生成各自的模块和可 执行模块并调试。 ()使用连接程序将各个目标模块连接起来形成一 个可执行模块并做整体调试。 n8.4.2 模块间通信的基本方法n在多个模块间的协同工作中,一个模块 可能要引用另一模块中定义的符号常量、 变量、标号及过程名等标识符。在定

10、义了 可为其他模块引用的标识符的模块中使用 PUBLIC伪指令;在需引用其他模块所定 义的标识符的模块中使用EXTRN伪指令。 n1. PUBLIC伪指令 PUBLIC 标识符,标识符; 说明公共标识符表示这些标识符是本模块定义、可被外部模 块引用的公共标识符,可以是变量名、标 号、过程名以及由EQU(或=)定义的符 号名。 n2. EXTRN伪指令EXTRN 标识符:类型,标识符:类型 ;说明 外部标识符表示这些标识符是外部模块定义、本模块要引用 的外部标识符,主要类型包括:NEAR和FAR(用于过程)。BYTE、WORD、DWORD等(用于变量)。 下面我们通过实例来说明模块间通信的方式。

11、n8.4.3子程序库建立和使用的方法n库文件对学过C/C+语言程序设计的读者 来说应该是不会陌生的,该语言的程序设 计环境提供了大量的库文件,也就是说, 提供了大量的标准函数或过程。假设现有目标文件sub1.obj、sub2.obj和 sub3.obj,要用它们建立库文件mylib.lib。 可用下列方法来建立该库文件:方法1:所有目标文件都准备好了,可一次性把 它们加入到库文件中lib mylib +sub1 +sub2 +sub3方法2:随着目标文件的逐个生成,而依次把它 们加入到库文件中lib mylib +sub1 lib mylib +sub2 lib mylib +sub3假如源文

12、件sub3.asm已修改,并也生成了新的目 标文件sub3.obj,这时,就需要把库文件 mylib.lib中的sub3.obj替换成新的目标文件。于 是,可用下面命令来实现替换:lib mylib -+sub3当提示输入目标库文件名(Output library)时, 可按“回车”用默认的原库文件名。如果想查看库文件mylib.lib中各文件的大小和存放 的先后次序,可用下列命令:lib mylib, list ;把库文件mylib.lib中的 文件结构生成到文件list中 type listn8.4.4 汇编语言与高级语言的接口C/C+语言是一个被广泛使用的程序设计 语言,它不仅具有良好的

13、高级语言特征, 而且还具有一些低级语言的特点,如:寄 存器变量、位操作等。所以,C语言的程序 与汇编语言程序之间能很平滑地衔接。另 外,目前主要的C语言程序开发环境,也都 提供了很好的混合编程手段。n在C语言中,嵌入汇编语言的语法如下(*) : nasm n注意:这里的分号;不是汇编语言中起注 释作用的分号,而是作为语句的分隔符。 n若C语言源程序中嵌入一条汇编语句,则可按 下列方式来做: asm mov ax, data若要嵌入一组汇编语句,则需要用括号和 把它们括起来。 asm mov ax, data1xchg ax, data2mov data1, ax /实现整 型变量data1和data2之值的交换

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

当前位置:首页 > 中学教育 > 教学课件

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