XA.W51%STANFORD.BITNET%Berkeley@sri-unix.UUCP (02/13/84)
From: Robert & Carol Lerche <XA.W51%STANFORD.BITNET@Berkeley>
In order to get addressability to data, the assembler must know
the SEGMENT the data are defined in. Define a COMMON SEGMENT as
follows:
(FOODEFN.INC)
; FIRST, THE STRUCTURE DEFINITION
FOO STRUC
A DW ?
B DW ?
FOO ENDS
; NEXT, THE ACTUAL ALLOCATION OF A FOO
DATA SEGMENT COMMON
FOOBAR FOO <0,0>
DATA ENDS
Then simply include the definition in all referencing modules.
The linker will overlay the definitions due to the COMMON
combine type.
(FOO1.ASM)
PAGE 59,120
INCLUDE FOODEFN.INC
;
DATA2 SEGMENT 'DATA'
STUFF DB 'PRIVATE DATA FOR BLAH (NOT BLAH2)'
DATA2 ENDS
;
DGROUP GROUP DATA,DATA2
CODE SEGMENT PUBLIC BYTE 'CODE'
ASSUME CS:CODE
EXTRN BLAH2:FAR
BLAH PROC FAR
MOV AX,DGROUP
MOV DS,AX
ASSUME DS:DGROUP
CALL BLAH2
MOV AX,FOOBAR.A
MOV BX,FOOBAR.B
MOV CX,OFFSET(DGROUP:STUFF)
BLAH ENDP
CODE ENDS
;
END BLAH
(FOO2.ASM)
PAGE 59,120
INCLUDE FOODEFN.INC
CODE SEGMENT PUBLIC BYTE 'CODE'
DGROUP GROUP DATA
ASSUME CS:CODE
ASSUME DS:DGROUP
PUBLIC BLAH2
BLAH2 PROC FAR
MOV CX,FOOBAR.A
MOV DX,FOOBAR.B
RET
BLAH2 ENDP
CODE ENDS
END
NOTES:
1. This is a "work around." In principle, there is no reason
why you can't just have a STRUC with an external name. In
practice, *sigh*.
2. Note use of OFFSET(DGROUP:STUFF) in FOO1. If you forget the
DGROUP, you will just get the offset from the start of the DATA2
segment, which will probably not be what you want.