.com Datei "nachladen" und ausführen..



  • Hallo Gemeinde,

    Ich weiß das es etwas umständlich klingt aber ich möchte gern wissen ob folgendes möglich ist.

    Ich erstelle eine normale .com Datei dessen Aufgabe es ist eine andere Datei zu öffnen und an eine bestimmte Stelle im Speicher abzulegen.

    Die zu ladende Datei ist ebenfalls eine .com Datei, jedoch mit der Anweisung
    ORG 0h
    am Anfang und nicht ORG 100h.
    Ich hoffe und glaube das der PSP erst von DOS beim laden vor die Datei geschrieben wird und nicht beim erstellen.

    Da alle Adressen nun bei Null beginnen sollten, müsste ein Far Jump unter Angabe des richtigen Segments möglich sein oder?

    Ich benutze MASM und der kann keine .bin Dateien erstellen. Wobei ich bei den .bin und .com Dateien keinen großen Unterschied erkennen kann.
    Deshalb meine Frage.

    Danke und Gruß

    Nicky



  • ORG 100h ist nur eine Anweisung an den Assembler, alle Adressen (Labels, Sprungbefehle) so aufzulösen, als ob das COM-Programm (COM = Copy Of Memory) an Offset-Adresse 100h beginnen würde. Das PSP wird vom Lader erstellt. Deine Annahmen treffen also alle zu. Noch ein Stolperstein: Wenn der Lader ein COM-Programm lädt, reserviert er sämtlichen Speicher für dieses Programm. Solltest Du mit einem DOS-Interrupt Speicher anfordern wollen, musst Du zuerst Speicher freigeben.

    viele grüße
    ralph



  • Hallo nochmal,

    ich habs versucht und es geht.
    Selbst einen Bootloader kann man auf diesem Weg erstellen.

    Gruß,

    Nicky



  • Zum Ausführen von *.com und auch *.exe Dateien aus einer laufenden Anwendung heraus (ggf. auch mit Übergabe von Parametern) kann man auch folgende Funktion von DOS verwenden:

    RBIL->inter61b.zip->Interrup.g

    --------D-214B-------------------------------
    INT 21 - DOS 2+ - "EXEC" - LOAD AND/OR EXECUTE PROGRAM
    AH = 4Bh
    AL = type of load
    00h load and execute
    01h load but do not execute
    03h load overlay (see #01591)
    04h load and execute in background (European MS-DOS 4.0 only)
    "Exec & Go" (see also AH=80h)
    DS:DX -> ASCIZ program name (must include extension)
    ES:BX -> parameter block (see #01590,#01591,#01592)
    CX = mode (subfunction 04h only)
    0000h child placed in zombie mode after termination
    0001h child's return code discarded on termination

    Return: ..... bitte im RBIL weiterlesen, da etwas länger.....

    (SS und SP müssen vorher gerettet und danach restauriert werden.)

    Die Anwendungen können damit als Child-Anwendung ausgeführt werden und kehren nach deren Beendigung zur Eltern-Anwendung zurück.

    Beispiel Parameter-Block:

    PARBLOCK  equ THIS WORD                ; Parameter-Block für die EXEC-Funktion
    
              DW 0                         ; gleicher Environment-Block
              DW OFFSET COMLINE            ; Offset- und Segmentadresse der
              DW SEG CODE                  ;      Kommandozeile
              DD 0                         ; keine Daten in PSP #1
              DD 0                         ; keine Daten in PSP #2
    
    COMLINE   DB 80h dup (0)               ; Kommandozeile
    

    Dirk


Anmelden zum Antworten