8086 Assembler (MS-DOS):
Assemblieren und Linken für .COM-Dateien beim MASM 4.00 und beim ML - Assembler

Dies ist eine Anregung zum Assemblieren und Linken von .COM-Dateien mit MASM 4.00 und ML 6.xx.


Für MASM 4.00 mit .BAT-Datei:

Beim Aufruf wird der Dateiname des Quellprogramms ohne Erweiterung mitgegeben, z.B. so:
ASM Hello

Als Linker wird das Programm link.exe (von Microsoft) verwendet. Danach wird das erzeugte .exe-Programm mit exe2bin.exe in ein .com-Programm umgewandelt. Letztlich wird das .com-Programm mit pklite komprimiert.

Falls Fehler auftreten, erfolgt ein entsprechender Abbruch des Vorgangs mit einer Fehlermeldung.

Für die Assemblierung der beiden Quellprogramme gonec und gopc erfolgt eine Sonderbehandlung.

Für den eigenen Gebrauch müssen die Pfadangaben entsprechend angepasst werden. Das in der .bat-Datei angegebene Programm exe2com.com ist funktionsgleich mit exe2bin.exe. Exe2bin.exe residiert normalerweise in WINDOWS\System32.


d:\dos\masm\masm.exe %1,%1,%1,nul.crf;
if errorlevel 1 goto fehler_asm
d:\dos\qb45\link.exe %1;
if errorlevel 1 goto fehler_link
d:\dos\masm\exe2com.com %1
if errorlevel 1 goto fehler_com
del %1.obj %1.exe
goto fertig
:fehler_asm
echo * Fehler bei der Assemblierung - keine Datei erstellt !
goto fertig
:fehler_link
echo * Fehler beim Linken - keine Datei erstellt !
del D:\temp\%1.obj
goto fertig
:fehler_com
echo * EXE Datei kann nicht in COM Datei umgewandelt werden !
:fertig


Für ML 6.11d ist keine .BAT-Datei erforderlich:

Beim ML-Assembler wird der Linklauf und die Wandlung der .EXE-Datei in die .COM-Datei vollständig von ML.EXE abgewickelt. Allerdings muss beim Aufruf der Name des .ASM-Quellprogrammes einschließlich .ASM angegeben werden, z.B. so:
ML hello.asm

Eine Komprimierung mit PKLITE kann per Kommandozeile nachgeschoben werden.


Für ML 6.14 ist eine .BAT-Datei angeraten:

Beim ML-6.14 muss für die Verlinkung von 16-bit Software (und das sind die COM-Programme, wie sie mit dem MODEL TINY erstellt werden) der Linker von MASM 6.11 verwendet werden. Bei mir heißt er LINK16.EXE. Ich verwende zum Assemblieren und Linken die nachfolgende BAT-Datei:

ml /Fl %1.asm /c
if errorlevel 1 goto fehler_asm
link16.exe %1;
if errorlevel 1 goto fehler_link
d:\dos\masm\exe2com.com %1
if errorlevel 1 goto fehler_com
:pklite %1.com
del %1.obj %1.exe
goto fertig
:fehler_asm
echo * Fehler bei der Assemblierung - keine Datei erstellt !
goto fertig
:fehler_link
echo * Fehler beim Linken - keine Datei erstellt !
del D:\temp\%1.obj
goto fertig
:fehler_com
echo * EXE Datei kann nicht in COM Datei umgewandelt werden !
:fertig

Die Übersetzung des Quellprogramms frage.asm sieht bei einem fehlerfreien Durchlauf so aus:

D:\dos\ML\ASSEMBLE>asm frage
D:\dos\ML\ASSEMBLE>ml /Fl frage.asm /c
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.
 Assembling: frage.asm
D:\dos\ML\ASSEMBLE>if errorlevel 1 goto fehler_asm
D:\dos\ML\ASSEMBLE>link16.exe frage;
Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.
LINK : warning L4021: no stack segment
D:\dos\ML\ASSEMBLE>if errorlevel 1 goto fehler_link
D:\dos\ML\ASSEMBLE>d:\dos\masm\exe2com.com frage
D:\dos\ML\ASSEMBLE>if errorlevel 1 goto fehler_com
D:\dos\ML\ASSEMBLE>del frage.obj frage.exe
D:\dos\ML\ASSEMBLE>goto fertig
D:\dos\ML\ASSEMBLE>

Eine Komprimierung mit PKLITE kann per Kommandozeile nachgeschoben werden.



Die Quellprogramme unterscheiden sich zwischen MASM 4.00 und ML 6.xx:

Die Quellprogramme unterschieden sich ein wenig. Die Segmentangabe ist beim ML wesentlich einfacher. Nachfolgend ein kurzes Programm für MASM 4.00 und das gleiche Programm für ML:
;fuer MASM 4.00
print_str macro string        ;;Zeichenkette zum Bildschirm
        mov        dx,offset string
        mov        ah,9
        int        dos
        endm

dos     equ        21h

code    segment
        assume     cs:code,ds:code
        org        100h
start:
        print_str  hallo

;Programmbeendigung
ret0:   mov        ax,4c00h
        int        dos

hallo   db         "Hello World (MASM 4.00)$"

code    ends
        end        start


;fuer ML
.MODEL TINY
print_str macro string        ;;Zeichenkette zum Bildschirm
        mov        dx,offset string
        mov        ah,9
        int        dos
        endm

dos     equ        21h

.CODE
        org        100h
start:
        print_str  hallo

;Programmbeendigung
ret0:   mov        ax,4c00h
        int        dos

hallo   db         "Hello World (Model TINY)$"

        end        start

.MODEL SMALL
print_str macro string        ;;Zeichenkette zum Bildschirm
        mov        dx,offset string
        mov        ah,9
        int        dos
        endm

dos     equ        21h

.STACK  256

.DATA

.CODE
start:  mov        ax,@CODE
        mov        ds,ax

        print_str hallo

;Programmbeendigung
ret0:   mov        ax,4c00h
        int        dos

hallo   db         "Hello World (Model SMALL im Code-Segment)$"

        end        start

Das vorvorige und das vorige Programmbeispiel unterscheiden sich durch die Modellangaben MODEL TINY und MODEL SMALL. Beim MODEL TINY werden Programmcode, Stack und Daten in einem einzigen gemeinsamen Segment untergebracht. Beim MODEL SMALL werden ein Segment für den Programmcode und ein zweites Segment gemeinsam für Stack und Daten eingerichtet. Nur mit MODEL TINY lassen sich .COM-Programme erstellen. Bei allen anderen Modellangaben bleibt man auf dem .EXE- Programm sitzen.

Das vorige Programmbeispiel demonstriert, dass man auch beim MODEL SMALL im Code-Segment Daten unterbringen kann. Das geschieht dadurch, das man den Inhalt des Datensegmentregisters entsprechend füllt. Dazu stehen die Befehle mov ax,@CODE und mov ds,ax. Wollte man auf die Daten des Datensegments zugreifen, stünde: mov ax,@DATA und mov ds,ax.

Letztes Upload: 24.03.2023 um 11:35:16 • Impressum und Datenschutzerklärung