home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best of German Only 1
/
romside_best_of_german_only_1.iso
/
anwender
/
sim
/
sim51_04.arj
/
OMF51.DOC
< prev
next >
Wrap
Text File
|
1993-02-01
|
18KB
|
487 lines
OMF51 : Intel Objekt-Modul-Format für 8051 Code:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dieser Text enthät eine Beschreibung des Intel Objekt Modul Formats beim
MCS51-Assembler ASM51, soweit er mir bekannt ist. Der Inhalt ist ohne Ge-
währ für Richtigkeit und Vollständigkeit. Hingegen bin ich für Hinweiße auf
Fehler und Ergänzungen dankbar: Werner Hennig-Roleff, Sulzgrieser Str. 101
73733 Esslingen, 0711/376718.
Laut telefonischer Auskunft von Intel (München) gab es vor Jahren eine Dok-
umentation von Intel zum OMF, jetzt aber nichts mehr. Laut Auskunft von
einem Mitarbeiter von Hitex (entwickelt 8051-Emulatoren) wäre der OMF von
Intel nicht veröffentlicht worden. Sie hätten den Code auch erst selbst ent-
schlüsseln müssen.
Das Objekt-Modul-Format OMF51 wird bei 8051 Entwicklungsumgebungen verwen-
det vom
Assembler (ASM51 von Intel / A51 von Keil) für Objekt-File Output
C-Compiler (C51 von Keil) für Objekt-File Output
Libary Manager (LIB51 von Intel oder Keil) für Libery-File
Linker und Locator (RL51 von Intel / L51 von Keil) für Absolut-File Output
Emulatoren (von Hitex und Intel ICE51)
Simulatoren (natürlich SIM51 !!!)
Objekt- und Libary-Files enthalten Code, der noch keiner festen Codeadresse
zugeordnet sein muß (relocateable Segmente). In Absolut-Files ist jedes
Code-Byte einer festen Adresse zugeordnet. Adressangaben in Absolut-Files
sind absolute Werte. In Objekt- und Libary-Files sind Adressangaben nur
Offsetwerte bezüglich des Segmentstarts.
Ein Absolut- sowie ein Objektfile ist aus einer Aneinanderreihung von Re-
cords definiert. Jedes Record schließt sich direkt an das vorige an. Sie
besitzen folgenden prinzipiellen Aufbau:
┌─────┬──────────┬────────────────────┬─────┐
│ Typ │ Length │ ... body ... │ CHK │
└─────┴──────────┴────────────────────┴─────┘
(Byte) (Word) (n - Bytes) (Byte)
Length gibt die Länge des Records in Bytesanzahl an. Der Wert wird aus
der Bytesanzahl des Record-body's und der Checksumme gebildet
(Length = n+1). An erster Position steht das Low-Byte, danach das
High-Byte. Es können so maximal 0FFFBh Code-Bytes in einen Record ge-
schrieben werden (siehe Typ 06). Programme wie OH.EXE (Absolut- zu
Hex-File Konverter) bearbeiten jedoch nur Records mit bis zu ca. 500h
Code-Bytes.
Der Aufbau des Record-body's ist je nach Record-Typ verschieden.
CHK wird gebildet aus: die Quersumme über alle Bytes des Records außer CHK
selbst. Davon das Zweierkomplement, wobei anschließend das high Byte
vernachlässigt wird. (Zweierkomplement durch NEG AX beim 8086).
Der oben definierte Aufbau eines Records wird bei vielen Compilern zur Er-
stellung von Objekt-Files verwendet. Die Objekt-Files von Compiler für ver-
schiedene CPU's unterscheiden sich im für sie definierten Satz von gültigen
Record-Typen. Im folgenden werden die für den 8051 Assembler und C-Compiler
definierten Record-Typen beschrieben (soweit bekannt und ohne Garantie).
1
** Modul-Start:
---------------
Dieser Record definiert den Modul-Namen und steht am Anfang von Absolut-
und Objekt-Files.
┌────┬────────┬────┬──────────────┬────────┬────┐
│ 02 │ Length │NaL │ .. Name .. │ ? │CHK │
└────┴────────┴────┴──────────────┴────────┴────┘
In NaL steht die Länge des folgenden Namens (Byteanzahl).
In den dem Namen folgenden Word (?) steht meißt
00FF bei einem Absolut-File (RL51-Output) oder
00FD bei einem Objekt-File (ASM51-Output) oder
01FE bei einem C-Compiler-Objekt-File.
** Modul-End:
-------------
Dieser Record steht am Ende von Absolut-, Objekt- und Libary-Files.
┌────┬────────┬────┬──────────────┬────────┬────┬────┬────┐
│ 04 │ Length │NaL │ .. Name .. │ ? │RegB│ ? │CHK │
└────┴────────┴────┴──────────────┴────────┴────┴────┴────┘
In NaL steht die Länge des folgenden Namens (Byteanzahl).
Im Feld RegB sind die verwendeten Register-Banks gekennzeichnet: das lowest
Bit kennzeichnet Registerbank 0 das nächste RegBnk 1, usw. Steht eine 1 in
diesem Bit, so ist die Registerbank selektiert (USING Direktrive).
Beispiel: 0001b selektiert nur RegBnk 0
1001b selektiert RegBnk 0 und 3
In dem mit ? gekennzeichneten BYTE steht meißt 00.
In den dem Namen folgenden WORD steht meißt 0000.
** Hex-Code:
------------
┌────┬────────┬────┬────────┬───────────────┬────┐
│ 06 │ Length │SNr │ Adr │ .... c .... │CHK │
└────┴────────┴────┴────────┴───────────────┴────┘
Im mit ... c ... gekennzeichneten Feld steht der Hex-Code (mehrere Byte).
Im Feld Adr (Word: low Byte zuerst) ist die Adresse des ersten Codebytes in
diesem Record angegeben.
SNr enthält die Segment-Nummer zu dem dieser Code gehört (siehe Typ 0E).
2
** Debug-Info Heater:
---------------------
┌────┬────────┬────┬────┬──────────────┬────┐
│ 10 │ Length │ K │NaL │ .. Name .. │CHK │
└────┴────────┴────┴────┴──────────────┴────┘
War bei der Assemblierung die Option Debug gewählt, so geht jeder Gruppe
von Records ein Heater vorraus. Der Heater gibt den Modul-Namen bekannt, zu
dem die folgenden Records gehören. Beim C51 gibt es auch Heater mit Funk-
tiuonsnamen.
In dem mit K gekennzeichneten Feld steht meißt
00 wenn globale Symbol-Definitionen folgen
03 wenn globaler Code folgt
02 wenn lokale Symbol-Definitionen folgen
05 wenn lokaler Code folgt
Die Unterscheidung in K = 02 oder 05 wurde nur beim C-Compiler beobachtet.
Beim Assembler wurde nur K = 00 oder 03 beobachtet. K = 01 trat nur bei er-
weiterten OMF51 auf.
Üblicherweise hat ein Objekt-File folgenden Aufbau:
02 Modulstart
0E Segmentdefinitionen
18 EXTRN-Definitionen
16 PUBLIC-Definitionen
10 Heater für Symbolnamen
12 Symbolnamen
10 Heater für Code
06 Code
08 Relocation-Informationen
12 Zeilenzuordnungen
04 Modul-Ende
Verschiedene Records können auch mehrfach vorhanden sein. Bei einem
Absolut-File entfallen die Typen 0E, 18, 16, 08. Obwohl Zeilenzuordnungen
vom Typ 12 sind kommen sie unter dem Code-Heater.
** Debug-Info (Symbol-Definition):
----------------------------------
Ein Record kann Definitionen für mehrere Variablen beinhalten. Der mittlere
Teil wiederholt sich dann.
┌────┬────────┬────┐ ┌────┬────┬────────┬────┬────┬──────────────┐
│ 12 │ Length │S/V │ │SNr │ T │ Wert │ ? │NaL │ .. Name .. │
└────┴────────┴────┘ └────┴────┴────────┴────┴────┴──────────────┘
: :
┌────┬────┬────────┬────┬────┬──────────────┐ ┌────┐
│SHr │ T │ Wert │ ? │NaL │ .. Name .. │ │CHK │
└────┴────┴────────┴────┴────┴──────────────┘ └────┘
S/V gibt an, ob die folgende Zuordnung sich auf einen Segmentnamen oder ei-
ne Variable bezieht. Jedem Segmentnamen ist auch ein Wert zugeordnet, näm-
lich der Wert der ersten Variable/Adresse in dem Segment. Achtung: Ist
S/V = 03, so enthält der Record Zeilezuordnungen (siehe unten).
3
S/V = 00 Variablen-Namen folgen
S/V = 01 public deklarierte Variablen-Namen folgen
S/V = 02 Segment-Namen folgen
S/V = 03 Adress-Zeile Zuordnungen folgen
(Achtung! anderer Record-Body!! - siehe unten!)
SNr enthält die Segment-Nummer zu dem dieser Definition gehört (siehe
Typ 0E).
T gibt den Typ an: 00 = CODE
01 = XDATA
02 = DATA
03 = IDATA
04 = BIT
05 = NUMBER (EQU)
Wert (Word: low Byte zuerst) gibt die Adres