INF: Positioning External Declarations in Assembly

ID Number: Q81327

5.00 5.10 5.10a 6.00 6.00a 6.00b | 5.00 5.10 5.10a 6.00 6.00a 6.00b

MS-DOS | OS/2

Summary:

Microsoft Macro Assembler (MASM) versions 5.1 and 6.0 and Microsoft

QuickAssembler versions 2.01 and 2.51 place several restrictions on

the placement of EXTRN and EXTERN statements. The assembler also

makes assumptions on where the declarations are placed.

Because of these assumptions, the code may assemble correctly, but

cause the following link errors:

Warning: L4004 Possible fixup overflow at <addr> in segment <name>

-or-

Error L2002: fixup overflow at <addr> in segment <name>

More Information:

Here are the rules you should follow when declaring externals:

1. If you know which segment defines an external symbol, put the

EXTRN statement in that segment.

2. NEAR code labels (including procedures) must be declared in

the code segment from which they are accessed.

3. If you know the group but not the segment, position the EXTRN

statement outside any segment and reference the variable with

the group name. For example, if var1 is in DGROUP, you would

reference the variable as

mov DGROUP:var1, 10

4. If you know nothing about the location of an external

variable, put the EXTRN statement outside any segment. You can

use the SEG directive to access the external variable like

this:

mov ax, SEG var1

mov es, ax

mov ax, es:var1

5. If the symbol is an absolute symbol or a far code label, you

can declare it external anywhere in the source code.

While following these rules will help to avoid L2002 and L4004 fixup

overflow errors, the above rules are not absolute. Using groups,

ASSUME statements, and .MODELS you can often work around these errors.

EXTERN is the MASM 6.0 version of EXTRN. For more information about

EXTERN see pageS 222 to 224 of the MASM version 6.0 Programmer's

Guide. For more information on EXTRN see pageS 161 to 163 of the MASM

version 5.1 Programmer's Guide, or pages 169 to 171 of the Microsoft

QuickAssembler's Programer's Guide.

Additional reference words: 5.00 5.10 5.10a 6.00 6.00a 6.00b