18 Stimmen

Wie lädt DOS ein Programm in den Speicher?

Welche Schritte führt MS-DOS durch, um eine COM- oder EXE-Datei in den Speicher zu laden? Gibt es im Internet noch Hinweise darauf, wie dies geschieht? Das Beste, was mir einfällt, ist möglicherweise ein Verweis auf die Dosbox-Quellen.

30voto

Nick Sonneveld Punkte 3286

Wenn command.com aufgefordert wird, eine .com- oder .exe-Datei auszuführen, wird der Interrupt-Dienst 21h/AH=4B, der EXEC-Dienst, aufgerufen. Es ist Sache des aufrufenden Programms, dies zu tun:

  • einen DOS-EXEC-Parameterblock erstellen (siehe http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html ) (enthält Informationen über Umgebungsvariablen, Befehlszeilenargumente, FCBs und Registerwerte bei der Rückkehr)
  • den gesamten vom aufrufenden Programm nicht verwendeten Speicher freigeben
  • Einrichten der Register für das aufrufende Argument
    • ah = 4Bh ('EXEC'-Dienstart)
    • al = 00h (Funktion "Laden und Ausführen")
    • ds:dx -> Programmname
    • es:bx -> ptr zum Ausführungsparameterblock
  • Anrufunterbrechung 21h
  • bei Rückkehr Stapelzeiger zurücksetzen und auf Fehler prüfen.

Wenn der Interrupt 21h aufgerufen wird (hier wird es für mich unklar):

  • ein seitenorientierter Speicherblock wird zugewiesen
  • die Dateierweiterung wird ignoriert, stattdessen prüft DOS die ersten beiden Bytes der Datei auf die Signatur "MZ" oder "ZM", wenn es sich um eine EXE handelt, und keine Signatur für COM.

für Exe:

  • exe-Header wird für anfängliche Registerwerte gelesen
  • Codeabschnitt aus der Exe in den Speicher kopieren
  • Umzugsliste (siehe http://en.wikipedia.org/wiki/Relocation_table ) wird gelesen und Fernzeiger werden im Speicher angepasst
  • Setup-Registerwerte
  • Sprung zu CS:IP -> Einstiegspunkt (definiert im Exe-Header, relativ zum Programmstart)

für com:

  • Kopieren der gesamten .com-Datei in den Speicher
  • Setup-Registerwerte
    • AL,AH Laufwerksbuchstabenstatus
    • CS,DS,ES,SS -> PSP-Segment
    • SP = Offset des letzten verfügbaren Worts im ersten 64k-Segment
  • Sprung zu IP=100h

Das Programm sollte nun ausgeführt werden.


Anmerkungen:

In Microsofts KB-Dokument "Order of Precedence in Locating Executable Files" wird erwähnt, dass die Verwendung der "MS-DOS EXEC-Funktion (Interrupt 21h Service 4Bh)" für die Ausführung von .com- und .exe-Dateien http://support.microsoft.com/kb/35284

Wir können uns also die Interrupt-Liste von Ralph Brown auf Int 21/AH=4Bh ansehen

und ein Beispiel für die Verwendung:

und das Dos-Exe-Header-Format:

(dies basiert auf einigem Googeln, also bitte fügen Sie gerne Vorschläge hinzu)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X