[net.micro.pc] Loading problem - More info

stekas@hou2g.UUCP (12/05/83)

The problem with with loading concerns segment location as in
the following example:

       DATA    SEGMENT
                   .      Data goes here
                   .
       DATA    ENDS

       DELTA   EQU   {Difference between DATA and CODE segments}

       CODE    SEGMENT
       ENTRY   PUSH  BP
               MOV   AX, CS      ; Set up DATA reference using
               SUB   AX, DELTA   ; constant offset from CODE
               MOV   DS, AX      ; so DATA&CODE can go anywhere
                   .
               RET   FAR
       CODE    ENDS

As long as DATA and CODE are loaded contiguously, the above
code will work anywhere in memory if entered at ENTRY.
The problem is that there is no (easy) way to get the linker to load
DATA before CODE. If one reverses the order of CODE and DATA
in the assembler listing, then CODE has forward references and
assembly bombs.  The only way of getting DATA loaded first is to
declare it as COMMON, assemble a copy of it seperately and link it
seperately as in - LINK DATA.OBJ+CODE.OBJ

It seems there should be an easier way to do this.   -  Jim

jph@whuxle.UUCP (12/10/83)

#R:hou2g:-12300:whuxle:22700008:000:548
whuxle!jph    Dec  5 18:42:00 1983

The easier way is not to use separate CODE and DATA
segments. In that case the program would look like:

	cseg	segment
	entry:	jmp	init
		 :
		 :
		 :
	   data goes here so that it
	   is defined before referenced
		 :
		 :
	init:  ......real start of program
		push	cs
		pop	ds	; address data
		 :
		 :
	cseg	ends


This puts everything in the same segment and makes
relocation on setting up of addressability very easy. I have
noticed that the linker will concatenate the segments
together in alphabetical order if they have the same
attributes.