home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
SS0288.ZIP
/
SS0288_4.TXT
< prev
next >
Wrap
Text File
|
1992-06-01
|
32KB
|
784 lines
96H LNAMES--LIST OF NAMES RECORD
================================
Description
-----------
The LNAMES record is a list of names that can be referenced by
subsequent SEGDEF and GRPDEF records in the object module.
The names are ordered by occurrence and referenced by index from
subsequent records. More than one LNAMES record may appear. The names
themselves are used as segment, class, group, overlay, and selector
names.
History
-------
This record has not changed since the original Intel 8086 OMF
specification.
Record Format
-------------
1 2 1 <--String Length--> 1
96 Record String Name String Checksum
Length Length
<-----------repeated----------->
Each name appears in <count, char> format, and a null name is valid.
The character set is ASCII. Names can be up to 254 characters long.
NOTE: Any LNAMES records in an object module must appear before the
records that refer to them. Because it does not refer to any other
type of object record, an LNAMES record usually appears near the
start of an object module.
Examples
--------
The following LNAMES record contains the segment and class names
specified in all three of the following full-segment definitions:
_TEXT SEGMENT byte public 'CODE'
_DATA SEGMENT word public 'DATA'
_STACK SEGMENT para public 'STACK'
The LNAMES record is:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 96 25 00 00 04 43 4F 44 45 04 44 41 54 41 05 53 .%...CODE.DATA.S.
0010 54 41 43 4B 05 5F 44 41 54 41 06 5F 53 54 41 43 TACK._DATA._STAC
0020 4B 05 5F 54 45 58 54 8B K._TEXT.
Byte 00H contains 96H, indicating that this is an LNAMES record.
Bytes 01-02H contain 0025H, the length of the remainder of the record.
Byte 03H contains 00H, a zero-length name.
Byte 04H contains 04H, the length of the class name CODE, which is
found in bytes 05-08H. Bytes 09-26H contain the class names DATA and
STACK and the segment names _DATA, _STACK, and _TEXT, each preceded by
1 byte that gives its length.
Byte 27H contains the Checksum field, 8BH.
98H OR 99H SEGDEF--SEGMENT DEFINITION RECORD
============================================
Description
-----------
The SEGDEF record describes a logical segment in an object module. It
defines the segment's name, length, and alignment, and the way the
segment can be combined with other logical segments at bind, link, or
load time.
Object records that follow a SEGDEF record can refer to it to identify
a particular segment. The SEGDEF records are ordered by occurrence,
and are referenced by segment indexes (starting from 1) in subsequent
records.
History
-------
Record type 99H is new for LINK386: the Segment Length field is 32
bits rather than 16 bits, there is one newly implemented alignment
type (page alignment), the B bit flag of the ACBP byte indicates a
segment of 4 GB, and the P bit flag of the ACBP byte is the
Use16/Use32 flag.
Starting with version 2.4, LINK ignores the Overlay Name Index field.
In versions 2.4 and later, command-line parameters to LINK, rather
than information contained in object modules, determine the creation
of run-time overlays.
The length does not include COMDAT records. If selected, their size is
added.
Record Format
-------------
1 2 <variable> 2 or 4 1 or 2 1 or 2 1 or 2 1
98 Record Segment Segment Segment Class Overlay Checksum
or 99 Length Attributes Length Name Name Name
Index Index Index
Segment Attributes Field
------------------------
The Segment Attributes field is a variable-length field;
its layout is:
<-3 bits-> <-3 bits-> <-1 bit-> <-1 bit-> <-2 bytes--> <--1 byte-->
A C B P Frame Number Offset
<conditional> <conditional>
The fields have the following meanings:
A Alignment
A 3-bit field that specifies the alignment required when
this program segment is placed within a logical segment.
Its values are:
0 Absolute segment.
1 Relocatable, byte aligned.
2 Relocatable, word (2-byte, 16-bit) aligned.
3 Relocatable, paragraph (16-byte) aligned.
4 Relocatable, aligned on 256-byte boundary (a "page"
in the original Intel specification).
5 Relocatable, aligned on a double word (4-byte)
boundary. This value is used by the PharLap OMF for
the same alignment.
6 This value is used by the PharLap OMF for page (4K)
alignment. It is not supported by LINK.
7 Not defined.
The new values for LINK386 are A=4 and A=5. Double word
alignment is expected to be useful as 32-bit memory paths
become more prevalent. Page-align is useful for certain
hardware-defined items (such as page tables) and error
avoidance.
If A=0, the conditional Frame Number and Offset fields
are present and indicate the starting address of the
absolute segment. LINK ignores the Offset field.
Conflict: The original Intel specification included
additional segment-alignment values not supported by
Microsoft; alignment 5 now conflicts with the following
LINK386 extensions:
5 "unnamed absolute portion of memory address space"
6 "load-time locatable (LTL), paragraph aligned if not
part of any group"
C Combination
A 3-bit field that describes how the linker can combine the
segment with other segments. Under MS-DOS, segments with
the same name and class can be combined in two ways: they
can be concatenated to form one logical segment, or they
can be overlapped. In the latter case, they have either the
same starting address or the same ending address, and they
describe a common area in memory. Values for the C field
are:
0 Private. Do not combine with any other program
segment.
1 Reserved by IBM. Not supported by Microsoft.
2 Public. Combine by appending at an offset that meets
the alignment requirement.
3 Reserved by IBM. Not supported by Microsoft.
4 As defined by Microsoft, same as C=2 (public).
5 Stack. Combine as for C=2. This combine type forces
byte alignment.
6 Common. Combine by overlay using maximum size.
7 As defined by Microsoft, same as C=2 (public).
Conflict: The Intel specification lists C=1 as Common,
not C=6.
B Big
Used as the high-order bit of the Segment Length field. If
this bit is set, the segment length value must be 0. If the
record type is 98H and this bit is set, the segment is
exactly 64K long. If the record type is 99H and this bit is
set, the segment is exactly 2^32 bytes, or 4 GB, long.
NOTE: A problem in the 286 chip makes code unreliable if
it is executed between bytes 65,500 and 65,535. LINK
warns of this problem if code segments reach that size.
P This bit corresponds to the bit field for segment
descriptors, known as the B bit for data segments and the D
bit for code segments in the Intel documentation.
If 0, then the segment is no larger than 64K (if data), and
16-bit addressing and operands are the default (if code).
This is a Use16 segment.
If nonzero, then the segment may be larger than 64K (if
data), and 32-bit addressing and operands are the default
(if code). This is a Use32 segment.
NOTE: This is the only method for defining Use32 segments
in the Microsoft OMF. The PharLap OMF uses an additional
byte of bit flags at the end of the SEGDEF record to hold
this and other flags (described later in this section).
Even if the P bit is 0, the PharLap OMF assumes all
segments are Use32.
Segment Length Field
--------------------
The Segment Length field is a 2- or 4-byte numeric quantity and
specifies the number of bytes in this program segment. For record type
98H, the length can be from 0 to 64K; if a segment is exactly 64K, the
segment length should be 0, and the B field in the ACBP byte should be
1. For record type 99H, the length can be from 0 to 4 GB; if a segment
is exactly 4 GB in size, the segment length should be 0 and the B
field in the ACBP byte should be 1.
Segment Name Index, Class Name Index, Overlay Name Index Fields
---------------------------------------------------------------
The three name indexes (Segment Name Index, Class Name Index, and
Overlay Name Index) refer to names that appeared in previous LNAMES
record(s). LINK ignores the Overlay Name Index field. The full name of
a segment consists of the segment and class names, and segments in
different object modules are normally combined according to the A and
C values if their full names are identical. These indexes must be
nonzero, although the name itself may be null.
The Segment Name Index field identifies the segment with a name. The
name need not be unique--other segments of the same name will be
concatenated onto the first segment with that name. The name may have
been assigned by the programmer, or it may have been generated by a
compiler.
The Class Name Index field identifies the segment with a class name
(such as CODE, FAR_DATA, or STACK). The linker places segments with
the same class name into a contiguous area of memory in the run-time
memory map.
The Overlay Name Index field identifies the segment with a run-time
overlay. It is ignored by current versions of the linker.
PharLap Extensions to This Record
---------------------------------
In the PharLap 32-bit OMF, there is an additional optional field that
follows the Overlay Name Index field. The reserved bits should always
be 0. The format of this field is
<------------5 bits----------------> <--1 bit--> <--2 bits-->
Reserved U AT
where AT is the access type for the segment and has the following
possible values
0 Read only
1 Execute only
2 Execute/read
3 Read/write
and U is the Use16/Use32 bit for the segment and has the following
possible values:
0 Use16
1 Use32
Conflicts: The Microsoft-defined OMF has Use16/Use32 stored as the P
bit of the ACBP field. Microsoft's OMF does not specify the access
for the segment--it is specified in the .DEF file given to LINK.
NOTES
LINK imposes a limit of 255 SEGDEF records per object module.
Certain name/class combinations are reserved for use by CodeView and
have special significance to the linker: name $$TYPES with class
name DEBTYP, and $$SYMBOLS with class name DEBSYM. See Appendix 1
for more information.
Examples
--------
The following examples of Microsoft assembler SEGMENT directives show
the resulting values for the A field in the corresponding SEGDEF
object record:
aseg SEGMENT at 400h ; A = 0
bseg SEGMENT byte public 'CODE' ; A = 1
cseg SEGMENT para stack 'STACK' ; A = 3
The following examples of assembler SEGMENT directives show the
resulting values for the C field in the corresponding SEGDEF object
record:
aseg SEGMENT at 400H ; C = 0
bseg SEGMENT public 'DATA' ; C = 2
cseg SEGMENT stack 'STACK' ; C = 5
dseg SEGMENT common 'COMMON' ; C = 6
In this first example, the segment is byte aligned:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 98 07 00 28 11 00 07 02 01 1E ....(.....
Byte 00H contains 98H, indicating that this is a SEGDEF record.
Bytes 01-02H contain 0007H, the length of the remainder of the record.
Byte 03H contains 28H (00101000B), the ACBP byte. Bits 7-5 (the A
field) contain 1 (001B), indicating that this segment is relocatable
and byte aligned. Bits 4-2 (the C field) contain 2 (010B), which
represents a public combine type. (When this object module is linked,
this segment will be concatenated with all other segments with the
same name.) Bit 1 (the B field) is 0, indicating that this segment is
smaller than 64K. Bit 0 (the P field) is ignored and should be 0, as
it is here.
Bytes 04-05H contain 0011H, the size of the segment in bytes.
Bytes 06-08H index the list of names defined in the module's LNAMES
record. Byte 06H (the Segment Name Index field) contains 07H, so the
name of this segment is the seventh name in the LNAMES record. Byte
07H (the Class Name Index field) contains 02H, so the segment's class
name is the second name in the LNAMES record. Byte 08H (the Overlay
Name Index field) contains 1, a reference to the first name in the
LNAMES record. (This name is usually null, as MS-DOS ignores it
anyway.)
Byte 09H contains the Checksum field, 1EH.
The second SEGDEF record declares a word-aligned segment. It differs
only slightly from the first.
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 98 07 00 48 0F 00 05 03 01 01 .. H......
Bits 7-5 (the A field) of byte 03H (the ACBP byte) contain 2 (010B),
indicating that this segment is relocatable and word aligned.
Bytes 04-05H contain the size of the segment, 000FH.
Byte 06H (the Segment Name Index field) contains 05H, which refers to
the fifth name in the previous LNAMES record.
Byte 07H (the Class Name Index field) contains 03H, a reference to the
third name in the LNAMES record.
9AH GRPDEF--GROUP DEFINITION RECORD
===================================
Description
-----------
This record causes the program segments identified by SEGDEF records
to be collected together (grouped). For OS/2, the segments are
combined into a logical segment that is to be addressed through a
single selector. For MS-DOS, the segments are combined within the same
64K frame in the run-time memory map.
History
-------
The special group name "FLAT" was added for LINK386.
Record Format
-------------
1 2 1 or 2 1 1 or 2 1
9A Record Group Name FF Segment Checksum
Length Index Index Definition
<-----repeated----->
Group Name Field
----------------
The Group Name field is specified as an index into a previously
defined LNAMES name and must be nonzero.
Groups from different object modules are combined if their names are
identical.
Group Components
----------------
The group's components are segments, specified as indexes into
previously defined SEGDEF records.
The first byte of each group component is a type field for the
remainder of the component. LINK requires a type value of FFH and
always assumes that the component contains a segment index value. See
the "Notes" section below for other types defined by Intel.
The component fields are usually repeated so that all the segments
constituting a group can be included in one GRPDEF record.
NOTES
LINK imposes a limit of 31 GRPDEF records in a single object module
and limits the total number of group definitions across all object
modules to 31.
This record is frequently followed by a THREAD FIXUPP record.
The most common group is DGROUP, which is used to group the default
data segments (_DATA, CONST, and _BSS).
LINK does special handling of the pseudo-group name FLAT for LINK386
only. All address references to this group are made as offsets from
the Virtual Zero Address, which is the start of the memory image of
the executable.
The additional group component types defined by Intel and the fields
that follow them are:
FE External Index
FD Segment Name Index, Class Name Index, Overlay Name Index
FB LTL Data field, Maximum Group Length, Group Length
FA Frame Number, Offset
None of these types is supported by LINK.
Examples
--------
The example of a GRPDEF record below corresponds to the following
assembler directive:
tgroup GROUP seg1,seg2,seg3
The GRPDEF record is:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 9A 08 00 06 FF 01 FF 02 FF 03 55 .....U
Byte 00H contains 9AH, indicating that this is a GRPDEF record.
Bytes 01-02H contain 0008H, the length of the remainder of the record.
Byte 03H contains 06H, the Group Name Index field. In this instance,
the index number refers to the sixth name in the previous LNAMES
record in the object module. That name is the name of the group of
segments defined in the remainder of the record.
Bytes 04-05H contain the first of three group component descriptor
fields. Byte 04H contains the required 0FFH, indicating that the
subsequent field is a segment index. Byte 05H contains 01H, a segment
index that refers to the first SEGDEF record in the object module.
This SEGDEF record declared the first of three segments in the group.
Bytes 06-07H represent the second group component descriptor, this one
referring to the second SEGDEF record in the object module.
Similarly, bytes 08-09H are a group component descriptor field that
references the third SEGDEF record.
Byte 0AH contains the Checksum field, 55H.
9CH OR 9DH FIXUPP--FIXUP RECORD
===============================
Description
-----------
The FIXUPP record contains information that allows the linker to
resolve (fix up) and eventually relocate references between object
modules. FIXUPP records describe the LOCATION of each address value to
be fixed up, the TARGET address to which the fixup refers, and the
FRAME relative to which the address computation is performed.
History
-------
Record type 9DH is new for LINK386; it has a Target Displacement field
of 32 bits rather than 16 bits, and the Location field of the Locat
word has been extended to 4 bits (using the previously unused higher
order S bit) to allow new LOCATION values of 9, 11, and 13.
Record Format
-------------
1 2 <------from Record Length-----> 1
9C Record THREAD subrecord or Checksum
or 9D Length FIXUP subrecord
<--------repeated------------->
Each subrecord in a FIXUPP object record either defines a thread for
subsequent use, or refers to a data location in the nearest previous
LEDATA or LIDATA record. The high-order bit of the subrecord
determines the subrecord type: if the high-order bit is 0, the
subrecord is a THREAD subrecord; if the high-order bit is 1, the
subrecord is a FIXUP subrecord. Subrecords of different types can be
mixed within one object record.
Information that determines how to resolve a reference can be
specified explicitly in a FIXUP subrecord, or it can be specified
within a FIXUP subrecord by a reference to a previous THREAD
subrecord. A THREAD subrecord describes only the method to be used by
the linker to refer to a particular target or frame. Because the same
THREAD subrecord can be referenced in several subsequent FIXUP
subrecords, a FIXUPP object record that uses THREAD subrecords may be
smaller than one in which THREAD subrecords are not used.
THREAD subrecords can be referenced in the same object record in which
they appear and also in subsequent FIXUPP object records.
THREAD Subrecord
----------------
There are four FRAME threads and four TARGET threads; not all need be
defined, and they can be redefined by later THREAD subrecords in the
same or later FIXUPP object records. The FRAME threads are used to
specify the Frame Datum field in a later FIXUP subrecord; the TARGET
threads are used to specify the Target Datum field in a later FIXUP
subrecord.
A THREAD subrecord does not require that a previous LEDATA or LIDATA
record occur.
The layout of the THREAD subrecord is as follows:
<--------------1 byte--------------------> <---1 or 2 bytes--->
0 D 0 Method Thred Index
1 1 1 3 2 (bits) <---conditional---->
where:
0 The high-order bit is 0 to indicate that this is a THREAD
subrecord.
D Is 0 for a TARGET thread, 1 for a FRAME thread.
Method Is a 3-bit field.
For TARGET threads, only the lower two bits of the field
are used; the high-order bit of the method is derived from
the P bit in the Fix Data field of FIXUP subrecords that
refer to this thread. (The full list of methods is given
here for completeness.) This field determines the kind of
index required to specify the Target Datum field.
T0 Specified by a SEGDEF index.
T1 Specified by a GRPDEF index.
T2 Specified by a EXTDEF index.
T3 Specified by an explicit frame number (not
supported by LINK).
T4 Specified by a SEGDEF index only; the displacement
in the FIXUP subrecord is assumed to be 0.
T5 Specified by a GRPDEF index only; the displacement
in the FIXUP subrecord is assumed to be 0.
T6 Specified by a EXTDEF index only; the displacement
in the FIXUP subrecord is assumed to be 0.
The index type specified by the TARGET thread
method is encoded in the Index field.
For FRAME threads, the Method field determines the
Frame Datum field of subsequent FIXUP subrecords
that refer to this thread. Values for the Method
field are:
F0 The FRAME is specified by a SEGDEF index.
F1 The FRAME is specified by a GRPDEF index.
F2 The FRAME is specified by a EXTDEF index.
LINK determines the FRAME from the external
name's corresponding PUBDEF record in
another object module, which specifies
either a logical segment or a group.
F3 Invalid. (The FRAME is identified by an
explicit frame number; this is not
supported by LINK.)
F4 The FRAME is determined by the segment
index of the previous LEDATA or LIDATA
record (that is, the segment in which the
location is defined).
F5 The FRAME is determined by the TARGET's
segment, group, or external index.
F6 Invalid.
NOTE: The Index field is present for FRAME
methods F0, F1, and F2 only.
Thred A 2-bit field that determines the thread number (0 through
3, for the four threads of each kind).
Index A conditional field that contains an index value that
refers to a previous SEGDEF, GRPDEF, or EXTDEF record. The
field is present only if the thread method is 0, 1, or 2.
(If method 3 were supported by LINK, the Index field would
contain an explicit frame number.)
FIXUP Subrecord
---------------
A FIXUP subrecord gives the how/what/why/where/who information
required to resolve or relocate a reference when program segments are
combined or placed within logical segments. It applies to the nearest
previous LEDATA or LIDATA record, which must be defined before the
FIXUP subrecord. The FIXUP subrecord is as follows
2 1 1 or 2 1 or 2 2 or 4
Locat Fix Frame Target Target
Data Datum Datum Displacement
<conditional> <conditional> <conditional>
where the Locat field has an unusual format. Contrary to the usual
byte order in Intel data structures, the most significant bits of the
Locat field are found in the low-order, rather than the high-order,
byte
<-----low-order byte----><----high-order byte--->
1 M Location Data Record Offset
1 1 4 10 (bits)
where:
1 The high-order bit of the low-order byte is set to
indicate a FIXUP subrecord.
M Is the mode; M=1 for segment-relative fixups, and M=0
for self-relative fixups.
Location Is a 4-bit field that determines what type of LOCATION
is to be fixed up:
0 Low-order byte (8-bit displacement or low byte
of 16-bit offset).
1 16-bit offset.
2 16-bit base--logical segment base (selector).
3 32-bit Long pointer (16-bit base:16-bit
offset).
4 High-order byte (high byte of 16-bit offset).
LINK does not support this type.
5 16-bit loader-resolved offset, treated as
Location=1 by the linker.
Conflict: The PharLap OMF uses Location=5 to
indicate a 32-bit offset, whereas Microsoft
uses Location=9.
6 Not defined, reserved.
Conflict: The PharLap OMF uses Location=6 to
indicate a 48-bit pointer (16-bit base:32-bit
offset), whereas Microsoft uses Location=11.
7 Not defined, reserved.
9 32-bit offset.
11 48-bit pointer (16-bit base:32-bit offset).
13 32-bit loader-resolved offset, treated as
Location=9 by the linker.
Data Indicates the position of the LOCATION to be fixed up
Record in the LEDATA or LIDATA record immediately preceding
Offset the FIXUPP record. This offset indicates either a byte
in the Data Bytes field of an LEDATA record or a data
byte in the Content field of a Data Block field in an
LIDATA record.
The Fix Data bit layout is
F Frame T P Targt
1 3 1 1 2 (bits)
and is interpreted as follows:
F If F=1, the FRAME is given by a FRAME thread whose
number is in the Frame field (modulo 4). There is no
Frame Datum field in the subrecord.
If F=0, the FRAME method (in the range F0 to F5) is
explicitly defined in this FIXUP subrecord. The method
is stored in the Frame field.
Frame A 3-bit numeric field, interpreted according to the F
bit. The Frame Datum field is present and is an index
field for FRAME methods F0, F1, and F2 only.
T If T=1, the TARGET is defined by a TARGET thread whose
thread number is given in the 2-bit Targt field. The
Targt field contains a number between 0 and 3 that
refers to a previous THREAD subrecord containing the
TARGET method. The P bit, combined with the two low-
order bits of the Method field in the THREAD subrecord,
determines the TARGET method.
If T=0, the TARGET is specified explicitly in this FIXUP
subrecord. In this case, the P bit and the Targt field
can be considered a 3-bit field analogous to the Frame
field.
P Determines whether the Target Displacement field is
present.
If P=1, there is no Target Displacement field.
If P=0, the Target Displacement field is present. It is
a 4-byte field if the record type is 9DH; it is a 2-byte
field otherwise.
Targt A 2-bit numeric field, which gives the lower two bits of
the TARGET method (if T=0) or gives the TARGET thread
number (if T=1).
Frame Datum, Target Datum, and Target Displacement Fields
---------------------------------------------------------
The Frame Datum field is an index field that refers to a previous
SEGDEF, GRPDEF, or EXTDEF record, depending on the FRAME method.
Similarly, the Target Datum field contains a segment index, a group
index, or an external name index, depending on the TARGET method.
The Target Displacement field, a 16-bit or 32-bit field, is present
only if the P bit in the Fix Data field is set to 0, in which case the
Target Displacement field contains the offset used in methods 0, 1,
and 2 of specifying a TARGET.
NOTES
FIXUPP records are used to fix references in the immediately
preceding LEDATA, LIDATA, or COMDAT record.
The Frame field is the translator's way of telling the linker the
contents of the segment register used for the reference; the TARGET
is the item being referenced whose address was not completely
resolved by the translator. In protected mode, the only legal
segment register values are selectors; every segment and group of
segments is mapped through some selector and addressed by an offset
within the underlying memory defined by that selector.
Examples
--------
Due to the incredible length of the FIXUPP examples in "The MS-DOS
Encyclopedia," they are not repeated here. However, the examples are
highly recommended if you want to understand what is happening.