ID Number: Q38216
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:
If a variable is referenced externally in an assembler routine
in the following manner:
.model large, c
.data
EXTRN Var:WORD
and declared globally in a large model C program as follows:
int Var;
the following error is generated:
error L2002: fixup overflow
This error occurs because the assembler would expect to find Var in
the segment _DATA in DGROUP. The C declaration, however, will put var
in the segment FAR_BSS, since it is an uninitialized global data
item in the large memory model.
Note that the same is true for the compact memory model.
More Information:
One way to eliminate this error is to initialize Var in the C code:
int Var=0;
This will put it in the _DATA logical segment in DGROUP.
Another work-around is to delcare Var in the Assembly code so that
the assembler would expect to find Var in FAR_BSS, as follows:
.model large, c
.fardata?
EXTERN Var:WORD
In addition, be sure to use a segment override to access Var:
MOV ax, SEG Var
MOV es, ax
MOV bx, es:Var