7.1.8 G: Use Alternate Segment Selector
When linking programs using segmented, or bank-switched psects, there are two ways the linker can assign segment addresses, or selectors, to each segment. A segment is defined as a contiguous group of psects where each psect in sequence has both its link and load addresses concatenated with the previous psect in the group. The segment address or selector for the segment is the value derived when a segment type relocation is processed by the linker.
By default the segment selector is generated by dividing the base load
address of the segment by the relocation quantum of the segment, which is based on the
reloc=
flag value given to psects at the assembler level (see 6.1.9.39.16 Reloc Flag). The
-Gspec
option allows an alternate method for calculating
the segment selector. The argument to -G
is a string similar to:
A/10h-4h
where A
represents the load address of the
segment and /
represents division. This means “Take the load address of
the psect, divide by 10 HEX, then subtract 4.” This form can be modified by substituting
N
for A
, *
for /
(to represent multiplication) and adding, rather than subtracting, a constant. The token
N
is replaced by the ordinal number of the segment, which is
allocated by the linker. For example:
N*8+4
means “take the segment number, multiply by 8, then add 4.” The result is the segment selector. This particular example would allocate segment selectors in the sequence 4, 12, 20, ... for the number of segments defined.
The selector of each psect is shown in the map file (see Section 6.4.2.2 “Psect Information Listed by Module”).