




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章模块化程序设计 模块化程序设计概述 段的定义 模块间的通讯 模块的连接 源程序综合举例 10 1 1模块化程序设计概念 在设计大型程序时 常常要将整个问题分解为若干个小问题 必要时还要将小问题再次分解为更小的若干问题 每个小问题编写成独立的源文件 最后将所有的源文件连接起来组合成一个大程序 也就是说 一个程序往往由多个源文件组成 那么构成一个程序的各个相对独立的源文件通常称为模块 这样把一个程序分成多个功能相对独立的程序模块分别编制 调试后 再用连接程序把它们连接在一起生成一个完整的程序的设计的方法称为模块化程序设计 10 1 2模块化程序设计的优点 开发速度快 可维护性与可读性强 可移埴性强 10 1 3模块划分的原则和方法 模块的划分应该是灵活的 但不应是程序的等分 应使各模块具有相对的独立性和完整性 可以单独编程 调试 但也要考虑各个模块之间的联系 模块划分是一个自上而下的过程 主模块是一个总控模块 首先确定主要的模块 也就是说 要把总任务划分成几个主要的子任务 一般来说 可以分成输入任务 输出任务和一个或多个进行处理或计算的子任务 在划分子模块的过程中应该明确每个模块的功能 数据结构及相互之间的关系 第二步 对这些主要的子模块根据需要再划分成下一层的子模块 第三步 重复上述过程 一直到程序分成易于理解和易于实现的小模块为止 1 模块划分的原则 1 一个主模块完成对各子模块的调用 实现总体任务 而每个子模块完成相应的子任务 各模块间除应在功能上分开 逻辑上独立 减少横向联系外 不能使用转移指令在模块间转来转去 避免逻辑上的混乱 2 子模块大小应适中 模块过大就失去了模块化的意义 也会给编程和调试带来一定困难 模块过小 会在的时间和空间上造成浪费 3 差别很大的两个程序段应作为两个模块 4 当一些数据被多个程序段所公用 那么这些数据所在的程序段应作为一个模块 5 当某些程序功能片段为多个模块所公用时 应将它们作为公用子程序模块 6 各个模块的结构最好能设计为单入口 单出口的形式 各模块间的接口应该简单 要尽量减少公共标识符的个数 2 模块划分的方法 1 层次图层次图是表示模块与模块之间关系的方块图 层次图的顶端是主模块 即一个总控制块 直接控制位于其下一层的各个模块的执行 而各主要的子模块再去控制其下一层的子模块 2 模块说明模块说明是对模块的功能 算法 模块输入和输出以及它们的数据结构的简单说明 应该考虑程序中哪些数据应该放在公共数据区 供所有模块访问 哪些数据可在有直接从属关系的模块间传送 返回 10 2段的定义 SEGMENT伪指令的完整的格式为 段名SEGMENT 定位类型 组合类型 类别 段名ENDS10 2 1定位类型定位类型用于指定该段的段起始地址的特性 也称为定位属性或对齐属性 连接程序连接目标文件时 根据定位类型来确定段的开始地址 一共有5种选择 1 PAGE 页 段的起始地址从页边界开始 也就是说必须为256的倍数 即该地址的最后8位二进制位应为0 2 PARA 节 段的起始地址必须从段边界开始 也就是说必须为16的倍数 即该地址的最后4位二进制位应为0 3 DWORD 双字 段的起始地址必须从双字边界开始 也就是说必须为4的倍数 即该地址的最低两位二进制位应为0 4 WORD 字 段的起始地址必须从字边界开始 也就是说必须为偶数地址 即该地址的最低一位二进制位应为0 5 BYTE 字节 段的起始地址从字节边界开始 也就是说可以从任意单元地址起 也就是说为下一个可用的字节地址开始 当段定义中没有指定段的定位类型时 定位类型的缺省方式为PARA 10 2 2组合类型 组合类型也称为组合属性 组合类型标明本段与其他模块中同名段的组合连接关系 是用于控制本段与其他模块中的同名 同类型段的组合连接方式 有五种可选的组合类型 1 PUBLIC连接程序将不同模块中的具有PUBLlC属性的同名段连接在一起 形成一个新的段 公用一个段基址 2 STACKSTACK与PLIBLIC的处理方式一样 只是连接后的段为堆栈段 连接程序在连接过程中自动将新段的段基址送到堆栈段寄存器SS 新段的长度送到堆栈指针寄存器SP 当堆栈段定义时没有说明为STACK类型 就要在程序中用指令给堆栈段寄存器SS和堆栈指针寄存器SP赋值 不然连接程序时就会产生警告信息 3 COMMONCOMMON类型会产生一个覆盖段 连接程序把该类型的同名段指定相同的段地址 段的长度取决于最长的COMMON段的长度 4 MEMORY连接程序不单独区分MEMORY类型 把MEMORY与PUBLIC类型同等对待 MASM程序允许使用它主要是为了与其他支持IntelMEMORY类型的连接程序兼容 5 AT表达式连接程序将具有AT类型的段装在表达式值所指定的段地址边界上 这个类型可以为标号或变量赋予绝对地址 以便程序以标号或变量的形式存取这些存储单元的内容 一般在AT类型的段中不定义指令或数据 只说明一个地址结构 6 NONENONE为默认值 表示该段是独立的 与其他同名段无组合关系 每段都有自己的段起始地址 10 2 3类别 类别 用于控制各段的存放顺序 类别名相同的所有段要相邻存放 类别名可以是用单引号括起来任何合法的名称 若 类别 选择项省略 则表明该段类别为空 典型的类别名有 用于代码段的 CODE 用于数据段的 DATA 和用于堆栈段的 STACK 返回 10 3模块间的通讯 10 3 1各模块之间的通信方式当程序由几个模块组成时 势必存在一个模块使用另一个模块中定义的变量 标号以及子程序等问题 由于子程序与调用它的语句 定义变量 标号及使用变量 标号的语句分别在不同的模块中 汇编是分开进行的 汇编程序无法知道子程序入口地址及变量 标号的地址 因此 要由连接程序汇集各模块送来的地址信息 综合决定各个调用指令的转移地址及变量 标号地址 因此 汇编语言提供了几种伪指令来完成不同模块间的通讯 1 TITLE格式 TITLE 标题 功能 给原程序指定一个标题 而后 LST文件每页的头都会出现这个标题 2 NAME和END在模块化程序设计中 常要用到模块定义伪指令 模块定义使用NAME和END两条伪指令 模块定义伪指令的一般格式为 格式 NAME模块名 END 标号 模块名为本模块的名称 是NAME的操作数 END表示源程序到此结束 若程序包含多个模块 则每个模块的最后必须有END 如果是主模块 其END语句中可以指定一个标号 这个标号表示程序的启动地址 只有主模块的END语句后有标号 3 PUBLIC伪指令格式 PUBLIC标识符 标识符 功能 表明本模块中所定义的标识符能够提供给其他模块引用 在一模块中 PUBLIC伪指令语句一般放在程序的开头 只能说明一次 PUBLIC伪指令其后的标识符是本模块定义的可供其他模块调用的标识符 这些标识符是在本模块中定义的符号常量 标号 过程名或变量 各名字之间用逗号隔开 注意 寄存器名或其值为实数及其值超过两个字节的整数的符号常量均不能作公共标识符使用 一旦经过PUBLIC伪指令定义 EXAM子程序就成为公共子程序 即可被多个不同模块调用 4 EXTRN伪指令格式 EXTRN标识符 类型 标识符 类型 功能 用来说明本模块中用到的标识符是由其它模块定义的 即本模块要引用其他模块定义的标识符 EXTRN是伪指令 其后的标识符就是本模块中要引用的外部标识符 而且标识符必须指出其类型 变量的类型可以是BYTE WORD或DWORD 标号和过程名的类型可以是NEAR或FAR 所有的标识符类型必须与原定义时的类型一致 被EXTRN伪指令说明的标识符必须是在它所定义的模块中被PUBLIC伪指令说明过的标识符 返回 10 4模块的连接 在模块化程序设计中 一个大的程序分成了若干子模块 每个模块具有完整的结构和独立的功能 并且能单独汇编和调试 在实际使用时如何将这些具有独立功能的模块连接成一个完整的整体呢 一般分两种情况 源程序级间的装配连接和目标文件级间的装配连接 10 4 1源程序级间的装配连接将若干个源文件 ASM 连成一个完整的文件 汇编后形成一个目标模块 OBJ 方式 称为源程序装配连接 源程序级间的装配连接常常是被装配的若干模块分别以源文件的形式存在 当需要在源主程序中插入一个已存在的子程序文件 或是多个源文件要合成一块的时候使用 10 4 2目标文件级间的装配连接 目标模块连接就是通常所说的模块连接 是多模块程序设计的主要形式 目标模块连接是把被装配的各个模块分别汇编后生成各自的目标文件 obj 经连接成一个可执行文件 它的实现比源文件连接复杂 1 目标模块连接目标模块的连接时要使用连接程序LINK 通过LINK将各模块连接成一个可执行程序 命令格式如下 LINK模块l文件名十模块2文件名十模块3文件名十 在LINK执行时 向使用者询问可执行文件名时 回答一个指定的文件名 则连接后的可执行文件名就是回答中所指定的文件名 如果没有回答指定文件名 则连接后可执行文件名将取所提供的第一个目标文件名 假设MASM程序在D盘MASM目录下 目标模块为file 1 obj file 2 obj和file 3 obj 则D MASM LINKfile 1 file 2 file 3ObjectModeles obj RunFile file 1 exe mainfile ListFile nul map mainfile Libraries lib 2 段的组合与定位 连接程序在执行时要对目标模块做两遍扫描 第一遍扫描是对所有段分配段地址 并建立一张外部符号表 第二遍扫描是确定与这些外部符号有关的指令机器码值 连接完成后建立了装入模块 再由装入程序把该模块装入内存等待执行 对所有段分配段地址 涉及到段定义中的属性以及PC机的可重定位技术 汇编程序汇编成的目标模块均是以浮动的零作为段起始地址 理论上讲该模块可以定位在主存中的任何地方 而连接程序可实现多个目标模块的连接 并按各段的新定位地址修改有关的目标代码 使之成为一个整体来运行 在用连接程序将多个目标模块连接在一起时 被连接模块要向连接程序提供两个方面的信息 各段之间的组合方式和各模块之间的通信方式 各段之间的组合方式由段定义中的组合类型和类别确定 LINK程序连接时 先处理组合类型 后处理定位类型 再处理 类别 因此 各模块中具有同一种组合形式的段 其定位类型不得相互矛盾 类别 名或者省略 或者相同 L1NK程序连接时把 类别 名相同的所有段 段名未必相同 放在连续的存储区内 但仍然是不同的段 类别 名相同的各个段在连接时 先出现的在前 后出现的在后 每段都有自己的超始地址 没有类别名的逻辑段 与其它没有类别名的逻辑段一起连续装入内存 若多个模块的段都为COMMON组合类型 连接后组合成一个互相覆盖的段 段的长度取二者的长者 这种连接方法只有当各模块需要公共数据区时才使用 否则各数据段内容相互覆盖便会出错 若多个模块的段都为PUBLIC组合类型 连接后组合成一个相邻连接的段 互不覆盖 连接顺序由连接程序确定 组合后形成的段的长度约等于各个段长度之和 返回 10 5源程序综合举例 例10 4 从键盘输入的一个长度不超过50个字符的字符串 将其中的小写字母转变为大写字母输出 非字母字符不变 解 可按题意和前面讲述的原则 把整个程序分成3个模块 模块1是主程序 通过调用模块2和模块3定义的子程序实现接收字符串以及小写字母转换大写字母的任务 模块2定义子程序IN SUB接收输入的字符串及子程序OUT SUB输出字符串 模块3定义子程序TRANS将串中的大写字母转换成小写字母 应用例子层次图 主模块BLOCK 1 NAMEBLOCK 1 模块1PUBLICBUF 本模块缓冲区 其它模块要使用EXTRNIN SUB FAR OUTSTR FAR TRANS FAR 使用其它模块的子程序STACKSEGMENTSTACK STACK DW32DUP 0 STACKENDSDATASEGMENTBUFDB50 50DUP DATAENDSCODESGSEGMENTMAINPROCFARASSUMECS CODE DS DATA SS STACKMOVAX DATAMOVDS AXCALLFARPTRIN SUB 调输入字符子程序IN SUBCALLFARPTRTRANS 调转换字符子程序TRANSCALLFARPTROUT SUB 调输入字符子程序OUT SUBMOVAX 4C00H 返回INT21HMAINENDPCODESGENDSENDMAIN 主模块结束 子模块2BLOCK 2NAMEBLOCK 2 命名模块2EXTRNBUF BYTE 使用其它模块的缓冲区PUBLICIN SUB OUT SUB 其它模块要使用CODESEGMENTASSUMECS CODEIN SUBPROCFAR 输入子程序PUSHDXPUSHAXLEADX BUFMOVAH 10INT21H 输入字符POPAXPOPDXRETIN SUBENDPOUT SUBPROCFARPUSHDXPUSHAXLEADX BUF 2MOVAH 9INT21H 输出字符POPAXPOPDXRETOUT SUNENDPCODEENDSEND 模块2结束 子模块3BLOCK 3NAMEBLOCK 3 命名模块3EXTRNBUF BYT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公共场所紧急疏散设施年度检测与维护服务协议
- 2025年医疗器械质量安全主体责任监督管理规定培训考试试题(含答案)
- 2025年二级建造师《工程法规》考试试题与答案
- 2025年执业药师药事管理与法规模拟题及答案
- 牙科考试题库及答案详解
- 2025年医护普法知识题库及答案
- 2025年护理核心制度培训试卷(含答案)
- 2025年药事管理法规试题及答案
- 防止石材裂纹的加工措施方案
- 幼儿早教线上教学计划
- 镀锌钢带增强聚乙烯(PE)双色螺旋波纹管
- UL塑料燃烧测试培训
- 温度计的前世今生
- 产后骨盆修复培训课件
- 给排水检验批容量一览表
- 小区业主公约
- 初中综合实践课程活动教案5篇(初中综合实践活动课件)
- 旗袍英文介绍课件
- 模块二-化肥减施增效基础知识课件
- 咽喉科内镜诊疗技术管理规范
- 小学各项安全管理制度汇编
评论
0/150
提交评论