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.
Eine Komprimierung mit PKLITE kann per Kommandozeile nachgeschoben werden.
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.
;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.