[net.micro.pc] Accessing External STRUC in 8086 MS-DOS Assembler

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.