多模块程序设计与混合编程汇总课件.ppt

上传人(卖家):晟晟文业 文档编号:4145921 上传时间:2022-11-14 格式:PPT 页数:218 大小:791.51KB
下载 相关 举报
多模块程序设计与混合编程汇总课件.ppt_第1页
第1页 / 共218页
多模块程序设计与混合编程汇总课件.ppt_第2页
第2页 / 共218页
多模块程序设计与混合编程汇总课件.ppt_第3页
第3页 / 共218页
多模块程序设计与混合编程汇总课件.ppt_第4页
第4页 / 共218页
多模块程序设计与混合编程汇总课件.ppt_第5页
第5页 / 共218页
点击查看更多>>
资源描述

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】模块间交叉定义示例二。不同模块中引用相同标识符时其基地址必

26、须一致。模块1:EXTRNVAR2:WORD,SROUT:FAR EXTRN VAR3:WORD,VAR4:WORD DATA1 SEGMENT PUBLIC DATA VAR1 DW?DATA1 ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA1第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 START:MOV AX,DATA1MOV DS,AX MOV AX,VAR2 ;VAR2的段地址在DS中MOV AX,SEG VAR3 ;ES中为VAR3的段地址MOVES,AXMOVBX,ES:VAR3 MOVAX,SEG VAR4MOVES,AX第第

27、9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 MOVCX,ES:VAR4CALL FAR PRT SROUTCODEENDS END START第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 模块2:PUBLICVAR2DATA1SEGMENT PUBLIC DATVAR2DW?DATA1 ENDS第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 模块3:PUBLICVAR3,VAR4DATA2SEGMENT VAR3 DW?DATA2ENDSDATA3SEGMENT VAR4 DW?第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合

28、编程 DATA3ENDSPUBLICSROUTCODE1SEGMENTASSUME CS:CODE1SROUTPROC FARRETSROUTENDPCODE1ENDSEND第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 上面的第2个问题主要是段寄存器的管理问题。当不同模块中的有关段连接后为同一段时,问题就十分简单,不论在哪个模块中访问该段中的变量,段寄存器的内容都可以不变,如例9-3中要访问DATA1段中的变量VAR2,不论在模块1还是在模块2中它们的段地址是一样的,因此在这两个模块中DS的内容不须改变。但当不同模块中的某些段连接后不在同一段内时,必须注意段寄存器内容的正确

29、设置,如例9-3模块1中要访问变量VAR3或VAR4时,应首先取出它们的段地址送入相应的段寄存器,由于变量VAR3和VAR4不在模块1中,取相应变量的段地址可有两种方法,如例9-3和例9-4中所示。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-4】模块间交叉定义示例三。不同模块连接后不在同一段时段寄存器地址的正确设置方法。模块1:CODATASEGMENTPUBLIC EXTRNVAR1:WORD,VAR2:BYTE CODATAENDS DATASEGMENT DB?第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 DATAENDSCODESEGM

30、ENTASSUMECS:CODE,DS:DATA,ES:CODATASTART:MOVAX,DATAMOVDS,AX MOVAX,CODATAMOVES,AXMOVBX,VAR1MOVVAR2,DL第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 CODEENDSENDSTART模块2:CODATASEGMENT PUBLICPUBLICVAR1,VAR2VAR1DW?VAR2DB?CODATAENDSEND第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 在例9-3的模块1中,我们是采用属性操作符(SEG)来获取VAR3和VAR4的段地址的。在例9-4中给出了

31、另一种方法,因为模块1中要访问的变量VAR1和VAR2不在本模块的DATA段中,为了取得这两个变量的段地址,我们在模块1中定义了一个与模块2中同名的段CODATA。在这个段中只定义了两个外部变量VAR1和VAR2,由于两个模块中的CODATA段的组合类型均为PUBLIC,所以连接以后它们是同一段,这样在模块1中就可以直接取CODATA段的段地址了。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 并且可用ASSUME语句指出哪个段寄存器将指向该段(如例中为ES),于是源程序中有关语句的段前缀也可以省略,如例中的指令MOV BX,VAR1中就省略了段前缀ES:(注意,该指令的机器

32、码中仍有段前缀字节)。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 3建立完整的可执行文件 上面我们说明了多模块的源程序的设计方法和应注意的问题。由于每个模块还只是整个完整程序的一部分,因此在多个模块的源程序写好后我们还必须建立一个完整的可执行文件。建立一个完整的可执行文件的方法如下:第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 (1)将各源程序模块分别汇编,并建立各自的目标模块(即建立各自的.OBJ文件)。(2)用连接程序LINK将这些目标模块连接成一个可执行文件。此时,在回答连接程序询问目标文件的文件名时,可用如下形式回答:第第9 9章章 多模块程序

33、设计与混合编程多模块程序设计与混合编程 模块1文件名+模块2文件名+模块3文件名+这里,一方面给出了要连接的各模块目标文件的文件名,同时也给出了各模块间的连接顺序。可执行文件的文件名有两种提供方式:一种方式是在连接程序询问可执行文件的文件名时直接以回车回答,此时,提供的第1个目标文件的文件名就是可执行文件的文件名;另一种方式是在连接程序询问可执行文件的文件名时另外提供一个指定的可执行文件的文件名。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-5】C:LINKOBJECT MODULES.OBJ:MFILE+SFILE1+SFILE2 RUN FILE MFILE.E

34、XE:MFILE1LIST FILE NUL.MAP:LIBRARIES.LIB:第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 上述各行冒号以后的内容是LINK时回答的信息。第1行的回答表示有3个目标模块要连接成一个可执行文件;第2行的回答表示连接后的可执行文件名为MFILE1.EXE;第3行的回答表示不需要建立列表文件;第4行回答表示没有专用的库文件。若第2行回答的是一个回车(),即没有另指定文件名,那么,连接后的可执行文件名将是MFILE.EXE。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 最后,还需指出,多个模块连接成一个可执行文件后,该文件只有

35、一个启动地址,所以,连接成一个完整程序的各个源模块中只能有一个源模块中的结束伪指令END可以带表达式,以指出整个程序的启动地址。下面我们给出两个多模块程序设计的例子。例9-6给出了多模块程序的一个例子。程序的功能是利用多个程序模块实现指定字符串的显示。程序中共有两个模块,模块1为主程序模块(称主模块),模块2为子程序模块(也称过程模块)。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-6】多模块程序设计例一。利用多个程序模块实现指定字符串的显示。模块1:STACK SEGMENT PARA STACK STACKDW 256 DUP(?)STACKENDSCODESE

36、GMENTPUBLICCODEEXTRNOUT_ROUTINE:NEAREXTRNOUT_CHAR:BYTEMESSE DBTHIS IS A ROUTINE,13,10 第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 ASSUMEDS:CODE,CS:CODE MAIN:CLD MOVAX,CS MOVDS,AX MOVSI,OFFSET MESSE LOOP1:LODSB MOVOUT_CHAR,AL第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 CALL OUT_ROUTINE CMPOUT_CHAR,10 JNELOOP1 MOVAH,4CH INT

37、21HCODEENDS ENDMAIN第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 模块2:CODESEGMENT PUBLIC CODEASSUME CS:CODE,DS:CODEPUBLICOUT_CHARPUBLICOUT_ROUTINEOUT_CHAR DB?OUT_ROUTINE PROC NEAR MOVDL,OUT_CHAR第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 MOVAH,02INT21HRETOUT_ROUTINE ENDPCODE ENDS END第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 例9-6中主模块

38、中要用到子模块中的过程OUT_ROUTINE和变量OUT_CHAR,因此,它们在主模块中为外部变量,在子模块中为全局变量(如例中所示)。两个模块中的代码段为同名同类别且组合类型均为PUBLIC,连接后为同一段,因此过程调用为近调用。例中的变量都在代码段中,因此段寄存器DS的内容在两个模块中也不需改变。请考虑:若要求在连接后这两代码段不是同一段,那么程序该做哪些修改?应注意哪些问题?第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 例9-7给出了多模块程序的第二个例子。程序完成的功能是实现两个32位数相乘。多位数相乘利用了一个子程序MULT,它是一个独立的模块。参数的传递采用指定

39、内存单元方式,两个操作数分别为OPRN1和OPRN2,相乘的结果存入PRDCT中,操作数中包含的字数在NSIZE中。本程序有两个模块,模块1为主模块,变量OPRN1、OPRN2、PRDCT和NSIZE在主模块中定义。模块2是子模块,完成多位数相乘的过程。由于两个模块的代码段的组合类型为NONE类型,所以,该程序中的过程MULT应为FAR类型。此外,过程中要访问的变量是主模块中所定义的,因而主模块在DS中所设定的段地址在过程中可以使用。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 【例9-7】多模块程序设计例二,利用多模块实现两个32位数相乘。模块1:STACKSEGMENT

40、STACK DW 256DUP(?)TOPLABELWORD STACKENDS PUBLICOPRN1,OPRN2,PRDCT,NSIZE EXTRNMULT:FAR DATASEGMENT第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 OPRN1DW8 DUP(?)OPRN2DW8 DUP(?)PRDCTDW16 DUP(?)NSIZEDW?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA 第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 MOVDS,AX MOVAX

41、,STACK MOVSS,AX MOVSP,OFFSET TOP MOVNSIZE,02 CALLMULT MOVAH,4CH INT21HCODEENDS ENDSTART 第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 模块2:EXTRNOPRN1:WORD,OPRN2:WORDEXTRNPRDCT:WORD,NSIZE:WORDPUBLICMULTCODESEGMENT第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 ASSUME CS:CODEMULTPROC FARPUSH SIPUSH DIPUSH BXPUSH CXPUSH AXMOVAX,SE

42、GOPRN1MOVDS,AXLEADI,OPRN1LEASI,OPRN2第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 LEABX,PRDCTMOVCX,NSIZEPUSH BXMOVAX,0SHLCX,01CLD第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 MBMUL1:MOVBX,AX INCBX INCBX LOOP MBMUL1 POPBX MOVCX,NSIZE第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 MBMUL2:PUSH CX MOV DX,SI INC SI INC SI PUSH BX PUSH DI MOVCX,

43、NSIZEMBMUL3:PUSH CX第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 PUSHDXMOVAX,DIINCDIINCDIMULDXADDBX,AXINCBXINCBXADCBX,DXPOPDXPOPCXLOOPMBMUL3第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 POPDIPOPBXINCBXINCBXPOPCXLOOPMBMUL2POPAXPOPCXPOPBXPOPDIPOPSIRET第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 MULTENDPCODEENDSEND第第9 9章章 多模块程序设计与混合编程多模块程序

44、设计与混合编程 9.3 汇编语言与高级语言程序的连接汇编语言与高级语言程序的连接 在实际的软件开发工作中,应用程序往往与应用系统的硬件有着密切的关系。有时会遇到这样的情况:主干程序使用某种高级语言编写,而一些与硬件相关的功能,如运行时间占90而代码只占10的关键部分,运行次数很多的重复部分,对运行速度要求很高的部分,要求直接访问硬件的部分,以及高级语言不支持的其他功能等,则采用汇编语言编写成相应的子程序,这样做会得到事半功倍的效果。把采用这种编程的技术或方法称为汇编语言与高级语言的混合编程。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 汇编语言和高级语言混合编程,需要解决两

45、个主要的技术问题:一是不同语言程序模块之间的连接;二是调用过程中参数的传递方法。对此不同的高级语言或同一种高级语言的不同版本所采取的具体方法不尽相同。本节主要介绍汇编语言与C/C+语言接口的基本方法。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 9.3.1 调用协议 调用协议是指在进行子程序调用时,主程序向子程序传递参数以及从子程序获得返回值的约定方式。通常参数传递的方法是:主程序使用系统堆栈向子程序传递入口参数,子程序使用CPU内部寄存器来保存向主程序的返回值。此外调用协议还将确定哪些寄存器的内容需要保护,哪些寄存器可以自由使用。汇编语言和不同的高级语言混合编程采用不同的

46、调用协议:C/C+语言使用C语言调用协议。采用何种调用协议则使用完全段定义来指定,还可以用段的简化定义方式在MODEL语句中或者与PROC语句相联系的OPTION指示符中指定。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 1.入口参数传递规则 1)C语言调用协议 采用C语言调用协议调用一个子程序时,是按照调用参数表自右向左的顺序将子程序入口参数压入堆栈的。例如,在C语言源程序中有一条子程序调用语句为:call sub(a,b,c);则参数的入栈顺序是,c先入栈,然后是b入栈,最后是a入栈。图9.2说明了采用C语言调用协议下,汇编语言近调用和远调用是如何通过堆栈传递入口参数的

47、。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 图9.2 C语言调用协议通过堆栈传递入口参数情况IP(返回地址)参数1参数2参数nSP低地址端高地址端堆栈生长方向IP(返回地址)参数1参数2参数nSP低地址端高地址端堆栈生长方向CS(返回地址)(a)NEAR型近调用(b)FAR型远调用第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 C语言调用协议允许使用可变个数的参数,此时,第一个压入堆栈的参数通常是用来说明后续有多少个参数的数值。需要注意的是,在C语言中有些类型的变量是先转换成另外一种类型后才压入堆栈的。如字符型变量(char)转换成整型变量(int);

48、无符号字符型变量(unsigned char)转换成无符号整型变量(unsigned int);浮点型变量(float)转换成双精度型变量(double);第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 结构型变量(structure)则是按照域变量的相反顺序整体压入堆栈。对于数组变量,压入堆栈的内容是指向数组起始地址的指针。近指针占16位,只包括段内偏移地址;远指针占32位,先压入段寄存器的段地址,然后再压入段内偏移地址。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 2)PASCAL语言调用协议 与C语言调用协议恰好相反,当采用PASCAL语言调用协议调

49、用一个子程序时,参数压栈的顺序是按照调用参数表自左向右将子程序入口参数压入堆栈的。例如,在PASCAL语言源程序中有一条调用语句为 call sub(a,b,c);则参数入栈的顺序是:a先入栈,然后是b入栈,最后是c入栈。图9.3说明了PASCAL语言调用协议是如何通过堆栈传递入口参数的过程。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 图9.3 PASCAL语言调用协议通过堆栈传递入口参数的情况IP(返回地址)参数n参数2参数1SP低地址端高地址端堆栈生长方向IP(返回地址)参数1参数2参数nSP低地址端高地址端堆栈生长方向CS(返回地址)(a)NEAR型近调用(b)FA

50、R型远调用第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 2.返回值传递规则 不论是C语言调用协议还是PASCAL语言调用协议,汇编语言子程序均是按照如下原则保存子程序返回值的。(1)果返回值为单字节数,则放入AL;(2)如果返回值为单字,则放入AX;(3)如果返回值为双字,则放入DX:AX,其中DX中存放高字,AX中存放低字;(4)如果返回值大小超过双字则存放在系统静态变量存储区中,指向这个静态变量存储区的指针值在AX(近指针)或者DX:AX(远指针)内。第第9 9章章 多模块程序设计与混合编程多模块程序设计与混合编程 在子程序完成预先定义的功能返回主程序时,C语言调用协议

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(多模块程序设计与混合编程汇总课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|