如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
5.1汇编语言程序的多模块连接5.2结构与记录5.3汇编语言程序与高级语言程序的连接第5章多模块程序设计(1)一个复杂程序可以分成若干个模块,可由不同人员分头完成;(2)每个模块的任务明确,便于理解;(3)单个模块易于编写和调试;(4)便于程序的维护和修改;(5)可以直接利用已有的模块。采用模块化程序设计时,必须合理分割模块,严格定义各模块的输入、输出参数及各模块间的通讯方式。在单模块程序设计时,模块内所用到的段、变量及标号等各种标识符都必须在本模块内给予定义,否则汇编时将会给出错误信息。多模块程序设计时,由于各个模块都是整个程序的一个部分,因此,各模块之间不仅会有数据上的传递,而且会出现各模块间的变量、标号等标识符的交叉引用。如何实现这种交叉引用,如何实现各模块间各段的连接是汇编语言多模块程序设计的重要问题,也是本章要叙述的主要内容。此外,多程序模块的连接不仅适用于汇编语言的程序模块,也适用于汇编语言程序模块与高级语言的程序模块的连接。因此,本章还将介绍汇编语言与两种高级语言(BASIC和TURBO-C)之间连接的基本方法。5.1汇编语言程序的多模块连接1)组合类型组合类型告诉汇编程序应为连接程序提供本段与其它段连接的有关信息,如本段与其它段是否组合为同一段;组合后,本段信息与其它段信息的关系如何,等等。为了提供这样一些信息,组合类型有如下6种不同的类型:NONE、PUBLIC、COMMON、AT表达式、STACK、MEMORY。段定义时,组合类型若被省略,隐含为NONE类型。(1)NONE类型:表示本段与不同模块中的其它段在逻辑上不发生关系。连接后各模块中的各段都有自己的段地址(也称基地址)。(2)PUBLIC类型:表明连接时,应把不同模块中属于该类型的同名同类别的段相继地连成一个段,其中所有的变量或标号都有相同的段地址。连接的顺序与LINK时用户所提供的各模块的顺序一致(本节的最后将给出连接的基本方法)。各模块中属于PUBLIC类型的同名同类别的各段的总长度不能超过64KB。(3)STACK类型:与PUBLIC类型同样处理,只是组合后的这个段用作堆栈。当段定义中指明了STACK类型后,说明堆栈段已经确定,所以,在可执行文件装入内存后段寄存器SS中已是该段的段地址,堆栈指针SP已指向堆栈底。这样,第4章例中为这两个寄存器传送初值的指令可以省去。(4)COMMON类型:表明连接时,应将不同模块中属于该类型的同名同类别的各段连接成一段,它们共用一个基地址,且互相覆盖。连接后,段的长度取决于最长的COMMON段的长度。(5)AT表达式类型:表明连接时,应将本段装在根据表达式求值得到的16位段地址上,表达式也可以是一个有效的常数。该类型可以将我们要定义的段设定在固定的地址范围内。必须注意,定义AT类型的段内不应包括任何指令语句或有初值的变量定义语句。但该段内允许设定标号或与标号有相同属性的过程定义语句或无初值的变量定义语句。它仅仅用来将该段指向内存区中的某个段,使该段的段名及段内的变量与指向的内存区的段地址有关。例如,若要用一个过程名SUB1代表BIOS中的某段子程序,我们可以这样定义一个段和过程:CODEBSEGMENTAT表达式1ORGNSUB1PROCFARSUB1ENDPCODEBENDS其中,表达式1的值即为某子程序所在段的段地址,N即为该子程序在段内的偏移地址。这样定义后,程序中调用过程名SUB1时,即调用BIOS中对应的子程序。其中也可以定义一个标号,并用ORG指定该标号的偏移地址,这样,该标号就与该段内的这个偏移地址相关。(6)MEMORY类型:表明连接时应把本段装在被连接的其它所有段之上(地址高端)。当有多个段为此类型时,只有汇编程序遇到的第1个段才认为是MEMORY段,而其它段则当作COMMON类型。图5.1给出了不同模块中组合类型为PUBLIC和COMMON时的连接结果。图中两个模块的数据段都为COMMON类型,连接后,这两个段组合成一个段,并且互相覆盖,其长度取两个模块中段长度长的,即为第2模块的长度。由于COMMON类型的段组合后,相互覆盖,所以,只有不同模块采用公用缓冲区时才使用这种类型。图5.1中两个模块的代码段为PUBLIC类型,因此,连接后,两个模块的代码段也组合成一个段,但它们并不覆盖,而是两个代码段相邻地连接在一起,其顺序也与LINK时提供的目标模块的顺序一致。组合后段的长度应是两个代码段长度的和。图5.1中两个源模块中的数据段和代码段都没有给出类别,这也是允许的,但若某个模块中给出了类别而另一模块中不给出类别,那么,这两个模块中的同名段将不能组合成一个段,它们被认为不是同类别的段。模块1和模块2如下:模块1:DA