多模块程序设计与混合编程汇总课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《多模块程序设计与混合编程汇总课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模块 程序设计 混合 编程 汇总 课件
- 资源描述:
-
1、第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 第第9章章 多模块程序设计与混合编程多模块程序设计与混合编程 9.1 多模块程序设计的基本概念多模块程序设计的基本概念 9.2 汇编语言程序的多模块连接汇编语言程序的多模块连接 9.3 汇编语言与高级程序的连接汇编语言与高级程序的连接习题习题9 第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 9.1 多模块程序设计的基本概念多模块程序设计的基本概念 在汇编语言程序设计中,源程序所涉及的标识符(变量、标号、段名和过程名等)都在本程序中定义,它与本程序之外的标识符不发生任何关系,这种程序设计称为单模块程序设计。本章
2、将介绍多模块程序设计方法,也称为模块化程序设计方法。所谓模块,从功能上讲它可以是整个大程序中较为独立的一个部分,从源程序结构形式上讲它是由END结束的一个完整程序。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 一个源模块可以单独汇编,形成自己的目标模块。最后,由连接程序将各个目标模块连接成一个可执行程序。采用模块化程序设计有下面一些优点:(1)一个复杂程序可以分成若干个模块,可由不同人员分头完成;(2)每个模块的任务明确,便于理解;(3)单个模块易于编写和调试;(4)便于程序的维护和修改;(5)可以直接利用已有的模块。第第9 9章章 多模块程序设计与混合编程多模块程序设计与
3、混合编程 采用模块化程序设计时,必须合理分割模块,严格定义各模块的输入、输出参数和各模块间的通信方式。在单模块程序设计时,模块内所用到的段、变量及标号等各种标识符都必须在本模块内给予定义,否则汇编时将会给出错误信息。多模块程序设计时,由于各个模块都是整个程序的一个部分,因此,各模块之间不仅会有数据上的传递,而且会出现各模块间的变量、标号等标识符的交叉引用。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 如何实现这种交叉引用,如何实现各模块间各段的连接是汇编语言多模块程序设计的重要问题,也是本章要叙述的主要内容。此外,多程序模块的连接不仅适用于汇编语言的程序模块,也适用于汇编语
4、言程序模块与高级语言的程序模块的连接。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 9.2 汇编语言程序的多模块连接汇编语言程序的多模块连接 9.2.1 多模块之间段的连接 1SEGMENT语句提供的连接信息 段定义的完整语句为 段名SEGMENT 定位类型 组合类型 类别 段名ENDS第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 在第4章中已指出,段定义后,段名有段地址、偏移地址、定位类型、组合类型和类别 5个属性,前3个属性在第4章中已作过介绍,本节要介绍后两个属性,它们用来为连接过程提供多模块间段连接的有关信息。第第9 9章章 多模块程序设计与混合
5、编程多模块程序设计与混合编程 1)组合类型 组合类型告诉汇编程序应为连接程序提供本段与其他段连接的有关信息,如本段与其他段是否组合为同一段,一旦组合后,本段信息与其他段信息的关系如何等等。组合类型有6种不同的类型:NONE、PUBLIC、COMMON、AT表达式、STACK和MEMORY。段定义时,组合类型若被省略,则隐含为NONE类型。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 NONE类型表示本段与不同模块中的其他段在逻辑上不发生关系,连接后各模块中的各段都有自己的段地址(也称基地址)。PUBLIC类型表明连接时,应把不同模块中属于该类型的同名同类别的段相继地连成一个
6、段,其中所有的变量或标号都有相同的段地址,连接的顺序与LINK时用户所提供的各模块的顺序一致(本节的最后将给出连接的基本方法)。各模块中属于PUBLIC类型的同名同类别的各段的总长度不能超过64 KB。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 STACK类型与PUBLIC类型的处理方法一样,只是组合后的这个段用作堆栈。当段定义中指明了STACK类型后,说明堆栈段已经确定,所以,在可执行文件装入内存后段寄存器SS中已是该段的段地址,堆栈指针SP已指向堆栈栈底。故在一般示例中的这两个寄存器传送初值的指令可以省去。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编
7、程 COMMON类型表明连接时,应将不同模块中属于该类型的同名同类别的各段连接成一段,它们共用一个基地址,且互相覆盖。连接后,段的长度取决于最长的COMMON段的长度。AT表达式类型表明连接时,应将本段装在根据表达式求值得到的16位段地址上,表达式也可以是一个有效的常数。该类型可以将我们要定义的段设定在固定的地址范围内。必须注意,定义AT类型的段内不应包括任何指令语句或有初值的变量定义语句,但该段内允许设定标号,与标号有相同属性的过程定义语句或无初值的变量定义语句,这种类型仅仅用来将该段指向内存区中的某个段,第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 使该段的段名及段内的
8、变量与指向的内存区的段地址有关。例如,若要用一个过程名SUB1代表BIOS中的某段子程序,我们可以这样定义一个段和过程:CODEBSEGMENT AT表达式1 ORGN SUB1 PROCFAR SUB1ENDP CODEBENDS第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 其中,表达式1的值即为某子程序所在段的段地址,N即为该子程序在段内的偏移地址。这样定义后,程序中调用过程名SUB1时,即调用BIOS中对应的子程序。其中也可以定义一个标号,并用ORG指定该标号的偏移地址,这样,该标号就与该段内的这个偏移地址相关。第第9 9章章 多模块程序设计与混合编程多模块程序设计与
9、混合编程 MEMORY类型表明连接时应把本段装在被连接的其他所有段之上(地址高端),当有多个段为此类型时,只有汇编程序遇到的第1个段才认为是MEMORY段,而其他段则当作COMMON类型。图9.1给出了不同模块中组合类型为PUBLIC和COMMON时的连接结果。图中两个模块的数据段都为COMMON类型,连接后,这两个段组合成一个段,并且互相覆盖,其长度取两个模块中段长度长的段,即为第2模块的长度。由于COMMON类型的段组合后,相互覆盖,所以,只有不同模块采用公用缓冲区时才使用这种类型。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 图9.1中两个模块的代码段为PUBLIC类
10、型,因此,连接后,两个模块的代码段也组合成一个段,但它们并不覆盖,而且两个代码段相邻地连接在一起,其顺序也与LINK时提供的目标模块的顺序一致。组合后段的长度应是两个代码段长度的和。图9.1中两个源模块中的数据段和代码段都没有给出类别,这也是允许的,但若某个模块中给出了类别而另一模块中不给出类别,那么,这两个模块中的同名段将不能组合成一个段,它们被认为不是同类别的段。模块1和模块2如下:第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 图9.1 PUBLIC和COMMON的连接结果 连接后的数据段连接后的代码段模块1用的数据段模块2用的数据段模块1的代码段模块2的代码段第第9
11、9章章 多模块程序设计与混合编程多模块程序设计与混合编程 模块1:DATA SEGMENTCOMMOM DW20H DUP(?)DATA ENDSCODE SEGMENTPUBLIC CODE ENDS第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 模块2:DATA SEGMENTCOMMOM DW30H DUP(?)DATA ENDSCODE SEGMENTPUBLIC CODE ENDS第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 2)类别 类别可以是任何一个合法的名称,但必须用单引号括起来。连接时,将把不同模块中相同类别的各段在物理上相邻地连接在一起
12、,其顺序亦与LINK时提供的各模块顺序一致。当类别相同的各段的段名不同时,它们连接后虽在同一物理段内,但实际上它们仍不属于同一个段,也就是说它们的段基址不相同。这样做的一个好处仅是便于程序的固化。在编程时,它们都是独立的代码段,各段有各自的段基地址,但连接后,它们却在同一物理段,从而可以把各段程序固化在一起。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 2.GROUP伪指令 GROUP伪指令格式为 段组名 GROUP 段名,段名,格式中的段组名是用户自己定义的一个标识符,其定义规则和语句名的定义规则相同,格式中的段名是本模块中已定义的段的名称。第第9 9章章 多模块程序设计
13、与混合编程多模块程序设计与混合编程 GROUP伪指令提供了段的另一种组合形式。它把多个由SEGMENT语句定义的段组合在同一段组中,用一个段组名表示。同一段组内的各段将装在同一物理段内,它们有相同的段基址。同一段组内,段的数目不受限制,但总字节数不能超过64 KB,同一段组内的各段的组合类型和类别可以不同。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-1】GROUP伪指令应用举例。模块1:AGROUPGROUP CODE1,CODE2 ;定义了一个段组AGROUPCODE1SEGMENTASSUME CS:AGROUPSTART:CODE1 ENDSCODE2 SE
14、GMENTASSUME CS:AGROUP第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 CODE2ENDSENDSTART模块2:AGROUP GROUP CODE3CODE3SEGMENT ASSUME CS:AGROUP CODE3ENDSEND第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 例中有2个模块3个段,连接后这3个代码段都将组合在同一物理段内,各模块中的CS都指向该段组名(AGROUP所代表的段地址),3个代码段中的所有标号或变量都有相同的段基地址。从上面的介绍我们看到,段定义中的组合类型、类别和段组定义都为多模块之间段的连接提供了必要的信
15、息,但它们又不完全相同。组合类型中的PUBLIC、STACK和COMMON类型都指出将把各模块中的相应段组合成一个段,且有相同的段基址,但前提是这些段的段名和类别必须相同。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 段组定义同样也指出将把各模块中的相应段组合成一个段,且有相同的段基址,但它对各段的段名和段的类型没有限制,并且各段还可以有自己的段基址,这对于将分头编写的多个模块组合成一个段提供了方便,也就是说只要在各模块中加一条段组名相同的段组定义语句即可。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 类别则指出了各模块中凡是类别相同的各段不论其段名和组
16、合类型如何,都将它们组合在同一物理段内,但它们的段地址却不一定是相同的,只有当段名相同且组合类型为PUBLIC、STACK和COMMON之一时,段地址才相同。类别的这一功能对程序的固化带来了方便,我们可以把编程时并不属于同一段的程序或数据组合在一起(同一物理段内)。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 此外,组合类型还为连接程序提供了当这些段组合成一段后,段内信息关系的有关信息。如PUBLIC和STACK类型是将各模块中的所有信息都顺序地连接在一起,互不覆盖,而COMMON类型组合后各模块中的信息互相覆盖,这对当各模块需要一个公共缓冲区时是十分有用的。第第9 9章章
17、 多模块程序设计与混合编程多模块程序设计与混合编程 9.2.2 模块间的交叉访问 模块间的交叉访问是指一个模块中要引用另一个模块中定义的变量、标号等标识符。例如,主模块中要调用的过程名是在另一个子模块中定义的,子模块中要用到的变量可能是在主模块中定义的。这样,一个源模块中定义的标识符就可能有两类:一类是供本模块使用的,我们称它们为局部标识符;另一类是同时可供本模块和其他模块使用的,我们称这类标识符为外部标识符或全局标识符。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 那么,如何告诉汇编程序本模块中哪些标识符是全局的(也就是可以被其他模块引用的),哪些标识符是要引用外部的(也
18、就是本模块中没有定义的),以及出现了交叉访问后,汇编语言程序编程又应注意些什么问题,这些都是本节所要讨论的主要内容。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 1.伪指令PUBLIC和EXTRN 1)伪指令PUBLIC 伪指令PUBLIC的功能是指明本模块中所定义的标识符有哪些是可以提供其他模块调用的外部标识符。格式如下:PUBLIC 标识符,标识符,其中,PUBLIC是伪指令操作码助记符,其后的标识符就是本模块内定义的可供其他模块调用的标识符,它可以是变量名,也可以是标号或过程名。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 2)伪指令EXTRN 伪
19、指令EXTRN的功能是指出本模块中用到的哪些标识符是由其他模块定义的。格式如下:EXTRN 标识符:类型,标识符:类型,其中,EXTRN是伪指令操作码助记符,其后的标识符就是本模块中要引用的外部标识符。这里,标识符必须指出其类型,这是在汇编时为了生成正确的机器码所必需的。变量的类型可以是BYTE、WORD或DWORD,标号的类型可以是NEAR或FAR。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 各模块中语句由PUBLIC和EXTRN提供的标识符必须互相呼应。连接时,连接程序将检查各模块中EXTRN语句中的每个标识符是否与PUBLIC语句中的标识符相配合。若EXTRN语句中
20、出现的标识符在PUBLIC语句中找不到,说明该标识符未定义,连接程序将给出错误信息,如例9-2所示。例9-2各模块中要引用的外部变量有VAR1、VAR2、VAR3和VAR4,但在PUBLIC语句中说明可以提供给其他模块引用的外部变量为VAR1、VAR2、VAR3和VAR5,说明变量VAR4没有定义,从而出错;而变量VAR5是由模块3定义的外部变量,第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 例中没有被其他模块引用,这是允许的。此外,模块1与模块2的代码段连接后是一个段,所以,在模块1中要用到的标号EX1虽不在同一模块中,但却是NEAR类型。标号EX2在模块3中定义,连接后
21、它与模块1的代码段不在同一段,因而EX2为FAR类型。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-2】模块间交叉定义示例一。语句PUBLIC和EXTRN提供的标识符必须互相呼应。模块1:EXTRN VAR3:WORD,EX1:NEAR EXTRN EX2:FAR PUBLIC VAR1,VAR2 DATA SEGMENT VAR1 DB?VAR2 DW?第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 DATA ENDSCODE SEGMENTPUBLICCODESTART:CODE ENDS END START模块2:EXTRN VAR1:BYT
22、E,VAR2:WORD,VAR5:WORDPUBLIC EX1,VAR3DATA SEGMENTVAR3 DW?第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 DATA ENDSCODE SEGMENT PUBLIC CODEEX1:CODE ENDS END模块3:EXTRN VAR4:BYTEPUBLIC VAR5,EX2DATA SEGMENTVAR5 DW?第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 DATA ENDS CODE3 SEGMENTEX2L:CODE3 ENDS END第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程
23、 2模块间交叉访问时的编程考虑 伪指令PUBLIC和EXTRN为不同模块之间的有关变量和标号建立了联系,从而使模块间的交叉访问成为可能。但是不同模块中引用同一个变量(或标号)时,它们的基地址必须一致,这是多模块程序设计时应考虑的主要问题,否则程序运行时就会出错。基地址的一致有两层含义:一是每个变量(或标号)的偏移地址所对应的段的基地址应一致;二是在使用这些变量(或标号)时,段寄存器的内容必须是该变量(或标号)所对应的段地址。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 我们首先说明第1个问题,即不同模块中交叉引用变量(或标号)时,变量的偏移地址对应的段基址是什么。一般地说,
24、不同模块中的各段(代码段或数据段)在连接后不论是在同一段还是不在同一段,在不同模块中取某变量的偏移地址时,其段基地址都是相对于变量所在段的段地址的。如例9-3给出3个模块,汇编连接后有2个代码段(CODE和CODE1)和3个数据段(DATA1、DATA2和DATA3),各段中的变量(或标号)的偏移地址都是相对于它们所在段的段地址的,例如VAR1和VAR2的基地址为DATA1段的段地址,不论是在模块1还是在模块2中访问它们都是一样的。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 但是有时也有不同的情况,例如当不同模块中的有些段连接后不在一个段内,而把有关伪指令EXTRN却放在
25、了某个段内,此时就可能出现在不同模块中访问同一个变量,这个变量的偏移地址却是不同的。如例9-3中,若在模块1中将伪指令EXTRN VAR3:WORD放在DATA1段内,那么在模块1和模块3中访问VAR3时,其偏移地址就不同了,因为在模块1中VAR3的段基址是DATA1的段地址,而在模块3中VAR3的段基址是DATA2的段地址。也就是说,在这种情况下同一个变量(VAR3)在两个不同的模块中其段基址是不同的,从而它的偏移地址也不同,在访问这样的变量时就应特别注意。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-3】模块间交叉定义示例二。不同模块中引用相同标识符时其基地址必
展开阅读全文