ITEEDU

2、伪指令EXTRN

伪指令EXTRN是用来说明:在当前模块所使用的标识符中,哪些标识符是已在其它模块中被定义为指定类型的标识符。如果当前模块使用了其它模块的标识符,而对它又不加以说明的话,那么,在汇编时,汇编程序将会给出下列出错信息:

error nnnnn: undefined symbol : XXXXXX

其中:“nnnnn”是错误号,“XXXXXX”是当前模块中没有定义的标识符。

伪指令EXTRN的一般说明格式如下:

EXTRN 标识符1:类型1, 标识符2:类型2, ……

其中:“标识符”和“类型”之间要用冒号“:”连接。

上面语句说明了标识符1、标识符2等是外部标识符,它们在其它模块中已被分别定义为类型1、类型2等,该类型说明符可以是:NEAR、FAR、BYTE、WORD、DWORD等之一。如果在一条说明伪指令中说明了多个标识符,那么,各标识符之间要用逗号分开。

在一个模块中,可用多条EXTRN伪指令来说明本模块所引用的外部标识符。

注意:伪指令EXTRN中所说明的标识符必须在其定义的模块中被PUBLIC伪指令说明为公共标识符,并且其说明的标识符类型要与该标识符在定义是的类型相一致,否则,要么不能生成其可执行文件,要么其执行文件不能正确运行。

例7.7 把例7.3、7.4和7.5合并在一起生成一个可执行文件,假设它们所对应的源程序名分别为Count.ASM、DispBX.ASM和Main.ASM。

解:由于在源文件Count.ASM中调用了子程序UPPER,所以,例7.1的程序也必须加入到本题中。假设其源文件名为Upper.ASM。

由于生成本题的执行文件需要四个模块,模块之间存在着调用关系,所以,在有关源文件中需要说明某些标识符为外部属性,或说明其为公共属性。

为了把前面例子中的子程序改写成可汇编的程序,需要添加一些简单的说明语句或进行简单修改,其添加或改写的部分已在下面用“下划线”表示出来。


;源文件Upper.ASM

;子程序说明信息:……

PUBLIC UPPER

SegUpr SEGMENT 'code'

UPPER PROC FAR 

…… ;例7.1中的程序段,在此从略 

UPPER ENDP

SegUpr ENDS

END

;源文件DispBX.ASM

;子程序说明信息:……

PUBLIC DISPBX

SubData? SEGMENT

DB 5 DUP('0'), 0ah, 0dh, '$'

SubData? ENDS

SegDisp? SEGMENT?'code'

DISPBX PROC?FAR

…… ;例7.3中的程序段,在此从略 

DISPBX ENDP

SegDisp? ENDS

END

;源文件Count.ASM

;子程序说明信息:……

PUBLIC COUNT

EXTRN UPPER:FAR

SegCount SEGMENT?'code'

COUNT PROC?FAR

…… ;例7.4中的程序段,在此从略 

COUNT ENDP

SegCount ENDS

END

;源文件Main.ASM

EXTRN COUNT:FAR, DISPBX:FAR

.MODEL? SMALL

.DATA

STR? DB 'KSDJ L0984/[]3oiu OIU OIU (*&(5341', 0

.CODE

.STARTUP

LEA? DX, STR

CALL COUNT ;调用子程序统计出各类字符的个数 

CALL DISPBX ;调用子程序显示数字字符的个数 

MOV BX, CX

CALL DISPBX ;调用子程序显示字母的个数 

MOV BX, DI

CALL DISPBX ;调用子程序显示其它字符的个数 

.EXIT 0

END

经过以上改写后,可用下列命令把它们分别汇编成目标文件(假设已安装了MASM编程环境):

…>MASM?upper

…>MASM?dispbx

…>MASM?count

…>MASM?main

有了这些目标文件后,可用以下二种方法来生成可执行文件。

方法1:把所有的目标文件连接在一起

 …>link  main+upper+count+dispbx

方法2:把目标文件upper.obj、count.obj和dispbx.obj加到自己开发的库文件中,然后在连接时,与该库文件连接。


…>lib?mylib +upper +count +dispbx

…>link?main

Microsoft (R) Segmented Executable Linker?Version 5.31.009 Jul 13 1992

Copyright (C) Microsoft Corp 1984-1992.?All rights reserved.

Run File [main.exe]:

List File [nul.map]:

Libraries [.lib]: mylib ;输入要连接的库文件,可用加号“+”连接多个库文件 

Definitions File [nul.def]:

LINK : warning L4021: no stack segment

…>main ;运行生成的文件 
以上各步骤也可由集成开发环境PWB来完成,具体介绍请见附录1。另外,当模块的指令条数较少时,也可以把几个子模块合在一个源文件中。