Here is the format of object files generated by the macro assembler
and Microsoft C Compiler.
+---------------------------------------+
| BYTE Record type |
| 80 Module name |
| 82 |
| 84 |
| 86 |
| 88 |
| 8A End of module |
| 8C External symbols |
| 8E |
| 90 Public symbols |
| 92 |
| 94 Line number info |
| 96 Segment/Group symbols |
| 98 Info for specific seg |
| 9A Info for specific group |
| 9C Relocation list |
| 9E |
| A0 Segment data |
| A2 Duplicated Segment Data |
+---------------------------------------+
| WORD Count of bytes in record, inc- |
| luding the record checksum, but |
| not including record type or |
| byte count |
+---------------------------------------+
| .... Record Data .... |
| See specific record for details |
+---------------------------------------+
| BYTE Checksum of all characters in |
| record, including record type |
+---------------------------------------+
Now for each one of the record types. In the following descriptions,
certain terminology will be used. Many of these record use a number
which relates some particular field to a value. These numbers range
from 1-255. In some cases, this number will relate an instantiation
of a symbol to the name of the symbol. In other cases, this number
will relate the segment or group instance with the actual segment or
group of the instantiation.
Module Name record (80) This record specifies the name of the module.
The record data field will be filled in as follows:
+---------------------------------------+
| BYTE Length of Module name |
+---------------------------------------+
| (Length) BYTES Module Name |
+---------------------------------------+
End of Module record (8A)
This record specifies the end of the module. The record data field
will be filled with a zero byte
+---------------------------------------+
| BYTE Zero |
+---------------------------------------+
External Symbols Record (8C)
This record specifies the names of the external symbols. The record
data field is filled in as follows, and record data fields defining
the symbols may appear more than once.
+---------------------------------------+
| BYTE Length of external symbol |
+---------------------------------------+
| (Length) BYTES External symbol name|
+---------------------------------------+
| BYTE Zero |
+---------------------------------------+
Public Symbols Record (90)
This record defines the symbols declared as public symbols. Only one
symbol will appear per record data field. The record data field is
defined as follows:
+---------------------------------------+
| BYTE Zero |
+---------------------------------------+
| BYTE Segment number in which symbol |
| is defined |
+---------------------------------------+
| BYTE Length of symbol |
+---------------------------------------+
| (Length) BYTES Public Symbol Name |
+---------------------------------------+
| WORD Offset where symbol defined |
+---------------------------------------+
| BYTE Zero |
+---------------------------------------+
Line Number Information Record (94)
This record defines line number debugging information. This
information is in the form of the line number of the source file, and
the address at which the code corresponding to that line number
starts. The record data field will be filled in as follows:
+---------------------------------------+
| BYTE Zero |
+---------------------------------------+
| BYTE Segment number |
+---------------------------------------+
| WORD Line number in source file |
+---------------------------------------+
| WORD Offset of start of line |
+---------------------------------------+
For this record, the last two field may be repeated any number of
times.
Segment/Group Symbols Record (96)
This record defines the names of the symbols used in the module name,
segment names, and group names. The segment symbol numbers the relate
the segment numbers to this name. The record data field will be
filled in as follows:
+---------------------------------------+
| BYTE Zero |
+---------------------------------------+
| BYTE Length of symbol name |
+---------------------------------------+
| (Length) BYTES Symbol Name |
+---------------------------------------+
The last two field may be repeated any number of times.
Segment Specific Information Record (98)
This record defines the combine and alignment classes of a specific
segment. Segment numbers are assigned in the order in which these
records may appear. The first occurrence of this record defines the
first memory segment, and so on. The record data field will be filled
in as follows:
+---------------------------------------+
| BYTE Combine/Alignment Class: |
| is defined as 0AAXPS00 |
| where AA is the alignment class |
| 00=AT (Specific segment |
| alignment) |
| 01=BYTE boundary |
| 10=WORD boundary |
| 11=PARAGRAPH boundary |
| X is unknown: used in stk |
| P is a public segment |
| S is a stack segment |
+---------------------------------------+
| WORD Segment size in bytes |
+---------------------------------------+
| BYTE Segment/Group Symbol Number |
+---------------------------------------+
| BYTE Not sure just yet. |
+---------------------------------------+
| BYTE Not sure just yet: usually 1 |
+---------------------------------------+
Group Specific Information Record (9A)
This record defines the memory segments which will be contained in a
group. The format of the record data field is defines as follows:
+---------------------------------------+
| BYTE Segment/Group Symbol Number |
+---------------------------------------+
| BYTE FF |
+---------------------------------------+
| BYTE Segment number |
+---------------------------------------+
The last two field will be repeated for every segment in a group.
Relocation List Record (9C)
This record defines the offsets in the just previously defined memory
segment which need fixing up. Multiple fixups may occur in the data
record field, and is defined as follows:
+---------------------------------------+
| BYTE Attributes needed/Relocation |
| offset MSB and is defined as: |
| 1A00SOFFF where |
| A means absolute address needed |
| S means segment number needed |
| O means offset needed |
| FFF is the 3 Least Significant |
| bits of the MSB of fixup |
| offset |
+---------------------------------------+
| BYTE LSB of fixup offset |
+---------------------------------------+
| BYTE Relocation type and is defined |
| as 00LG0AE0 where |
| L means length of symbol needed |
| G means group override |
| A means the address is needed |
| E means the symbol is external |
+---------------------------------------+
| BYTE Group/Segment number. If Bit 4 |
| of the previous byte was set, |
| this will be a group number, |
| otherwise it is segment number |
+---------------------------------------+
| BYTE Destination Segment Number |
+---------------------------------------+
| BYTE Source Symbol/Segment Number |
+---------------------------------------+
| WORD Destination offset if Relocation|
| type byte is zero, otherwise |
| nonexistant. |
+---------------------------------------+
Memory Segment Information Record (A0)
This record defines the contents of a memory segment. One record
for each segment will appear for each segment which has locations to
be defined. For program code, this will be the actual code. For
data, this will be the initial contents of the data. No memory
segment record will exceed 1024 bytes, because of the relocation list
which may follow. The format of the data record field is defined as
follows:
+---------------------------------------+
| BYTE Memory segment number |
+---------------------------------------+
| WORD Origin in segment |
+---------------------------------------+
| ..... Data for Segment ..... |
+---------------------------------------+
Duplicate Memory Segment Information Record (A2)
This record defines the contents of duplicated memory segment, such as
when the assembler encounters a DUP in DB directive. The format of
the data record field is defines as follows:
+---------------------------------------+
| BYTE Memory Segment Number |
+---------------------------------------+
| WORD Origin in Segment |
+---------------------------------------+
| WORD Number of Duplication times |
+---------------------------------------+
| WORD 1 |
+---------------------------------------+
| WORD 1 |
+---------------------------------------+
| WORD 0 |
+---------------------------------------+
| BYTE Length of DUP item |
+---------------------------------------+
| (Length) BYTES DUP data |
+---------------------------------------+
±S