EXE-DAteiformat - Die Relocation-Table

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Brueggi

EXE-DAteiformat - Die Relocation-Table

Beitrag von Brueggi »

Hallo. Das Internet verwirrt mich zieeemlich, da ich jetzt 3 Dokus über EXE-Dateien habe, und jede schreibt was anderes :-)
Mir geht es um die Tabelle zum Anpassen der Bezüge. Laut Programmierhandbuch zu DOS von G. Born besteht ein Tabelleneintrag aus 2 Bytes Offset und 2 Bytes Displacement (wohingegen andere Dokus sagen, ein Eintrag bestünde aus 2 Bytes Offset und 2 Bytes Segment) - Was stimmt denn nun? Nächste Frage: Wenn es stimmt, das es 2 Bytes Offset und 2 Bytes Displacement sind - dann kommt früher oder später der Fall, das z. B. ein Offset auf $FFA0 zeigt, der nächste Eintrag dann Offset $010A o. ä. beinhaltet - in der Realität bedeutet dies: Wie zähle ich die Segmente weiter? Rechnet man in der Reloc-Table immer mit 64K großen segmenten und ich müsste dann einfach wenn der Offset eines Eintrages auf 0 springt, die Segmente entsprechend weiterrechnen?

Andere Frage: Wenn es stimmt, das es aus Segment und Offset besteht (die Tabelle), wozu dann? Was muss ich dann zu dieser dort verzeichneten Adresse dazuzählen? Das Displacement zu CS?

Warum ich frage: Ich möchte mir die Entwicklung neuer Software erleichtern und dazu eine Turbopascal-Unit verwenden (kein reines ASM mehr) - die EXE-Datei, die TP erzeugt, bekommt ein Lade-Programm vorangestellt, das dafür sorgt, das mein DOS denkt, es sei eine passende Anwendung, sowie das die wichtigsten int $21-Funktionen emuliert und die EXE-DAtei anpasst, bevor sie ausgeführt wird.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: EXE-DAteiformat - Die Relocation-Table

Beitrag von freecrac »

Brueggi hat geschrieben:Hallo. Das Internet verwirrt mich zieeemlich, da ich jetzt 3 Dokus über EXE-Dateien habe, und jede schreibt was anderes :-)
Mir geht es um die Tabelle zum Anpassen der Bezüge. Laut Programmierhandbuch zu DOS von G. Born besteht ein Tabelleneintrag aus 2 Bytes Offset und 2 Bytes Displacement (wohingegen andere Dokus sagen, ein Eintrag bestünde aus 2 Bytes Offset und 2 Bytes Segment) - Was stimmt denn nun? Nächste Frage: Wenn es stimmt, das es 2 Bytes Offset und 2 Bytes Displacement sind - dann kommt früher oder später der Fall, das z. B. ein Offset auf $FFA0 zeigt, der nächste Eintrag dann Offset $010A o. ä. beinhaltet - in der Realität bedeutet dies: Wie zähle ich die Segmente weiter? Rechnet man in der Reloc-Table immer mit 64K großen segmenten und ich müsste dann einfach wenn der Offset eines Eintrages auf 0 springt, die Segmente entsprechend weiterrechnen?
Ich vermute es kommt darauf an, ob die EXE-Datei nur aus einem Codesegment besteht, oder sich aus mehreren Codesegmenten zusammensetzt (siehe dazu auch ein Beispiel von Robert Wessel vom 11 Jun. 2004, 21:16 ).
Auch gibt es verschiedene Arten von Exe-Dateien (MZ, oder NE, PE).

Edit: Folgender Thread "EXE Header File Relocation Tables" könnte dazu hilfreich sein:
http://groups.google.com/group/comp.lan ... c5f3f82671

Dirk
Brueggi

Re: EXE-DAteiformat - Die Relocation-Table

Beitrag von Brueggi »

Danke für die Antwort. Habs offenbar hinbekommen. Ich hol mir die Pointer aus der Reloc-Table und addiere zu dem dort befindlichen Wort einfach das Ladesegment plus Displacement. Offenbar klappt das.
Antworten