Über TASM

Programmier-Modi

TASM kann in drei verschiedenen Modi arbeiten, dem MASM-Modus, dem Quirks-Modus und dem Ideal-Modus.
Ohne weitere Angaben wird der MASM-Modus verwendet, in dem TASM den Quelltext so erwartet, wie es der MASM aus dem Hause Microsoft tut.

Im Quirks-Modus wird dem Programmierer die Möglichkeit gegeben, mit TASM bekannte Fehler von MASM zu simulieren. Sollten Sie also über Quellcode verfügen, der MASM-Fehler ausnutzt, dann ist dieser Modus der richtige für Sie. Die Fehler werden im MASM-Modus als Fehler erkannt, eine Kompilierung würde also fehlschlagen.

Der Ideal-Modus schließlich, um den es in diesem Tutorial gehen wird, bietet bei vielen Konstrukten eine erweiterte Syntax und ermöglicht es dem Programmierer, Anweisungen zu schreiben, die genau das machen, was er von ihnen erwartet. Speziell bei den vielfältigen Adressierungsarten, die in Assembler möglich sind, kommen schnell Befehle zusammen, die nicht das tun, wonach sie aussehen. Hier bügelt der Ideal-Modus also Ungereimtheiten aus. Auch sonst hilft dieser Modus dabei, lesbareren Code zu erzeugen, wo klar die Unterscheidung zwischen Konstanten und Variablen möglich ist und bereits am Zeilenanfang erkennbar ist, um welche Daten- oder Codestruktur es im Augenblick geht.

Um in die verschiedenen Modi zu wechseln, müssen Sie lediglich eine dem Modus entsprechende Direktive in eine Zeile schreiben, also IDEAL für den Ideal-Mode, MASM für den MASM-Mode (bzw. MASM51 für einige Erweiterungen, die MASM 5.1 brachte) oder QUIRKS für den Quirks-Modus.

TASM ist ein sogenannter Ein-Pass-Assembler, d. h. er durchläuft den gesamten Quelltext nur einmal und versucht, daraus ein Kompilat zu erstellen.
Nun ist es möglich, daß Sie ein Symbol verwenden, das aber erst hinter der Stelle, an der Sie es verwenden, definiert wird. Dem Assemblierer ist dieses Symbol zum Verwendungszeitpunkt natürlich noch unbekannt, was dazu führt, daß er von Standardannahmen ausgeht. Um diese Annahmen jedoch den Tatsachen anzupassen, ist ein weiterer Durchlauf nötig (Mehr-Pass-Assembler). Dieses Verhalten erhält TASM über den Kommandozeilenparameter /m2. Dabei spiegelt die Zahl (hier: 2) die Anzahl der Durchläufe wider, die TASM durchführen soll. Natürlich kann statt der Zwei auch eine höhere Zahl eingetragen werden, allerdings leidet darunter die Übersetzungsgeschwindigkeit.

Standardmäßig erzeugt TASM EXE-Dateien. Diese haben eine Mindestgröße von 512 Byte (der sogenannte EXE-Header). Bestimmte Programmiersituationen (z. B. TSR-Programme) erfordern aber Dateien, die ohne einen solchen Header funktionieren. Dies sind die sogenannten COM-Dateien (prominentes Beispiel: COMMAND.COM). Sie sind nicht nur kleiner als EXE-Dateien, sie werden auch ein Quentchen schneller geladen (was heutzutage nicht mehr ins Gewicht fällt). Nachteil: Sie können maximal 64 KB groß werden, weil der gesamte Code und die Daten und der Stack in ein Speichersegment passen muß und ein Speichersegment hat eine Maximalgröße von 64 Kilobyte (Erklärungen später). Nicht jeder Quelltext ist automatisch dazu geeignet, als EXE oder COM kompiliert zu werden. COM-Dateien müssen auch anders geschrieben werden.
Im Verlaufe dieses Tutorials werden hauptsächlich EXE-Dateien geschrieben.

Um den sinnvollen Gebrauch der Kompilate mit einem Debugger zu ermöglichen, ist es nötig, in den Objectdateien (*.obj) sogenannte Debuginformationen zu hinterlegen. Diese können dann vom Linker in die ausführbare Datei übernommen werden. Debuginformationen haben keinen Einfluß auf das Laufzeitverhalten des Programms. Lediglich die Größe der ausführbaren Datei ändert sich.
Um Debug-Informationen in der Objectdatei zu hinterlegen, muß TASM mit der Option '/zi' aufgerufen werden. Diese Informationen werden nur dann in die ausführbare Datei (.exe, .com) übernommen, wenn TLINK mit der Option '/v' aufgerufen wird.
Es ist ratsam, alle Quelldateien mit Debuginformationen zu kompilieren, da die Fehlersuche in Assembler recht mühsam ist und ein Debugger hier wirklich wertvolle Hilfe leisten kann. Ob sie dann auch Eingang in das fertige Programm finden, kann dann durch die Option '/v' von TLINK entschieden werden.

Ohne weitere Angaben erzeugt TASM Maschinencode für den 8086, Sie können also die Befehle und erweiterten Möglichkeiten der neueren Prozessoren nicht nutzen. Dabei kann TASM Befehle bis hin zum Pentium generieren. In der folgenden Tabelle sehen Sie die einzelnen Einstellungen, die Sie bezüglich der Ausführungsplattform machen können

Direktiven zur Prozessorplattform
Ideal-Mode MASM-Mode Bedeutung
P8086 .8086 Dies ist die Standardeinstellung
Es wird nur Code für den 8086 erzeugt.
P8087 .8087 Das ist die Standardeinstellung, wenn Code für den numerischen Koprozessor erzeugt wird.
Es wird nur 8087-Code erzeugt.
P186 .186 Gestattet die Erzeugung von 80186-Code
P286 / P286P .286P Ermöglicht die Assemblierung aller Befehle (inkl. Protected-Mode-Befehle) für den 80286 sowie Befehle für den 80287
P286N .286 / .286C Ermöglicht die Assemblierung von Real-Mode-Befehlen für den 80286 sowie Befehle für den 80287
P287 .287 Ermöglicht die Assemblierung von Befehlen für den 80287
P386 / P386P .386P Ermöglicht die Assemblierung aller Befehle (inkl. Protected-Mode-Befehle) für den 80386 sowie Befehle für den 80387
P386N .386 / .386C Ermöglicht die Assemblierung von Real-Mode-Befehlen für den 80386 sowie Befehle für den 80387
P387 .387 Ermöglicht die Assemblierung von Befehlen für den 80387
P486 .486P Ermöglicht die Assemblierung aller Befehle (inkl. Protected-Mode-Befehle) für den 80486 sowie Befehle für den 80487
P486N .486 / .486C Ermöglicht die Assemblierung von Real-Mode-Befehlen für den 80486 sowie Befehle für den 80487
P487 .487 Ermöglicht die Assemblierung von Befehlen für den 80487
P586 .586P Ermöglicht die Assemblierung aller Befehle (inkl. Protected-Mode) sowie Koprozessor-Instruktionen für den Pentium
P586N .586 / .586C Ermöglicht die Assemblierung von Real-Mode-Befehlen sowie Koprozessor-Instruktionen für den Pentium
P587 .587 Ermöglicht die Assemblierung von Koprozessor-Instruktionen für den Pentium

Die Direktiven, die hier für den Ideal-Mode angegeben wurden, können auch im MASM-Mode verwendet werden. Da aber im Ideal-Mode die Direktiven nicht mit einem Punkt beginnen dürfen, ist es nicht möglich, die ausdrücklich für den MASM-Mode angegebenen Direktiven im Ideal-Mode zu verwenden

Wenn Sie Befehle für den 80386 verwenden wollen, dann müssen Sie mindestens eine Anweisung wie P386 angeben. Da die neueren Prozessoren Befehle der älteren verarbeiten können, ist es natürlich möglich, nach einer Anweisung wie P586 mit allen Prozessorbefehlen zu arbeiten . Da allerdings ab der Einstellung für den 80386 erweiterter Code produziert wird, laufen Programme mit dieser Einstellung nicht mehr auf älteren Prozessoren.

Die allgemeine Form der Kommandozeile hat folgendes Aussehen:
TASM Dateisatz1 [; Dateisatz2]
Für jeden Dateisatz können Sie einzelne Optionen festlegen. Dabei hat ein Dateisatz folgendes Aussehen:
[Optionen] Quelldatei [[+]Quelldatei] [,[Objektdatei]] [,[Listing-Datei]] [,[Crossref-Datei]]]]
Als Quelldatei können Sie einen konkreten Namen angeben oder mit den Wildcards '?' und '*' arbeiten.
Um mehrere Dateien gleichzeitig zu übersetzen, schreiben Sie die Dateinamen getrennt durch ein '+' hintereinander (Datei1 + Datei2).
Um alle Dateien im aktuellen Verzeichnis zu kompilieren, schreiben Sie TASM *.*.
Um eine Datei zu kompilieren und daraus eine Objekt-Datei, eine Listing-Datei sowie eine Crossreferenz-Datei zu erzeugen, lautet die Kommandozeile
TASM datei,,,
Dadurch werden die Dateien datei.obj, datei.lst und datei.xrf erzeugt. Um den einzelnen Dateien noch andere Namen zu geben, können Sie an die entsprechende Stelle einen Dateinamen schreiben,z. B. TASM datei,,listing,cross.
Werden keine Endungen angegeben, dann wird bei der Quelldatei .asm angenommen, bei den anderen Dateien jeweils .obj, .lst und .xrf.
Wenn Sie nur die Kommata schreiben, dann wird trotzdem eine Datei erzeugt. Wollen Sie allerdings eine Objekt-Datei, keine Listing-Datei und eine Crossreferenz-Datei, dann schreiben Sie folgendes:
TASM datei,,NUL,
Wollen Sie nur eine Objekt-Datei sowie ein Listing, dann schreiben Sie TASM datei,, (nötigenfalls mit anderen Dateinamen).
Um einfach nur eine Datei zu kompilieren und eine Objekt-Datei zu erhalten, rufen Sie TASM einfach nur mit dem Namen der Quelldatei auf.

Kommandozeilenparameter
Parameter Bedeutung
/a Gibt an, dass die einzelnen Segmente in alphabetischer Reihenfolge geordnet werden. Diese Option benötigen Sie in aller Regel nur, wenn Sie Quellcode kompilieren wollen, der für sehr alte Versionen des IBM- oder Microsoft-Compilers geschrieben wurden.
Sie erreichen den gleichen Effekt, wenn Sie in die Quelldatei die Anweisung .ALPHA einfügen (nur im MASM-Modus).
Normalerweise werden die Segmente in der Reihenfolge ihres Auftretens angeordnet. Die Option /s überschreibt die alphabetische Reihenfolge. Sollten Sie mit der Anweisung .SEQ im Quelltext bereits die sequentielle Reihenfolge eingestellt haben, dann hat die Option /a keine Wirkung.
/b Diese Option wurde nur eingebaut, um die Kompatibilität zu MASM-Versionen zu wahren. Sie hat keinerlei Auswirkung auf die Assemblierung.
/c Ermöglicht die Erstellung einer Cross-Referenz in der Listing-Datei.
In der Cross-Referenz werden alle Symbole einer Quelldatei aufgeführt mit der Zeile, in der sie definiert wurden sowie allen Zeilen, die dieses Symbol referenzieren. Diese Option hat nur dann eine Auswirkung, wenn Sie mit /l die Listing-Erzeugung erzwingen oder die Listing-Datei explizit auf der Kommandozeile angeben.
/d Definiert ein Symbol
Mit dieser Option können sie auf der Kommandozeile Symbole definieren, auf die in der Quelldatei Bezug genommen werden kann. Sie können mehrere Symbole in der Kommandozeile definieren.
Beispiel: TASM /dX=10 /dMWST=16 Datei
/e Generiert Instruktionen für einen Coprozessoremulator.
Die Option /r kehrt die Wirkung wieder um. Die Direktive NOEMUL überlagert die Option /e. Die Option /e hat die gleiche Wirkung wie die Direktive EMUL oder die Option /jEMUL.
/h oder /? Zeigt einen Hilfebildschirm mit Kurzangaben zur Kommandozeilensyntax sowie den möglichen Optionen.
/i Setzt einen Include-Dateipfad.
Sie können zwar auch in der Quelldatei einen Pfad zur Include-Datei angeben, mit dieser Option sind Sie allerdings unabhängiger vom System, auf dem die Dateien liegen. Sie können je Kommandozeile mehrere Pfade angeben, in denen nach Include-Dateien gesucht wird.
Beispiel: TASM /ic:\tasm\include /ic:\bc\include Datei
/j Definiert eine Direktive, die normalerweise in der Quelldatei stehen würde, wie z. B. P386N, IDEAL, JUMPS. Sie können mehrere Direktiven in der Kommandozeile definieren.
Ein Beispiel könnte so aussehen:
TASM /jP386N /jIDEAL Datei
/kh# In der Voreinstellung kann TASM 8192 Symbole je Programm verwalten. Sollten Sie ein Programm schreiben, das mehr Symbole enthält, dann müssen Sie mit dieser Option die Anzahl möglicher Symbole erhöhen. Die maximale Zahl ist 32768. Sie sollten diese Option verwenden, wenn Sie bei der Übersetzung die Meldung Out of hash space bekommen
/l Generiert eine Listing-Datei
Diese Datei erhält den gleichen Namen wie die Quelldatei mit der Endung .lst
/la Anzeigen von High-Level-Code in der Listing-Datei.
Normalerweise wird der Code, den Anweisungen wie die MODEL-Direktive erzeugen, in der Listing-Datei nicht angezeigt. Mit dieser Option können Sie allerdings die Übernahme in die Listing-Datei erreichen.
/m# Diese Option legt die maximale Zahl von Übersetzungläufen fest.
Normalerweise arbeitet TASM als Ein-Pass-Assembler. Mit /m2 können Sie allerdings angeben, daß maximal 2 Durchläufe durchgeführt werden. TASM kann selbst entscheiden, ob weniger als die angegebenen Durchläufe möglich sind. Geben Sie hinter /m keine Zahl an, dann wird ein Standard von 5 Durchläufen angenommen.
/ml Mit dieser Option werden alle Symbole, auch die nichtöffentlichen und nichtexternen als case-sensitiv behandelt, d. h. ABCdef und AbCdEf sind unterscheidliche Symbole. Allerdings können Sie bei Verwendung dieser Option die Schlüsselwörter noch immer so schreiben, wie Sie wollen.
/mu Mit dieser Option werden alle Symbole in Großbuchstaben umgewandelt.
Dies ist die Voreinstellung.
/mv# Setzt die maximale Länge der Symbole.
Wenn Sie beispielsweise mit /mv14 arbeiten, dann werden die Symbole nur unterschieden, wenn innerhalb der ersten 14 Zeichen Unterschiede auftreten. So werden z. B. die Symbole Symbol1234567890 und Symbol1234567890123 nicht mehr unterschieden. Als minimale Symbollänge ist die 12 gestattet.
/mx Weist TASM an, öffentliche (public) und externe (extrn) Symbole case-sensitiv zu behandeln, alle anderen Symbole (innerhalb der Quelldatei) unterliegen nicht dieser Behandlung.
Sie sollten diese Option verwenden, wenn Sie mit Modulen arbeiten, die zum Beispiel von C++-Compilern erzeugt wurden
/n Unterdrückt die Symboltabelle am Ende der Listing-Datei.
Diese Option hat nur dann eine Auswirkung, wenn Sie mit /l die Listing-Erzeugung erzwingen oder die Listing-Datei explizit auf der Kommandozeile angeben.
/o Generiert Overlay-Code für TLINK
/oi Generiert Overlay-Code für den IBM-Linker. Die resultierenden Objekt-Dateien sind mit TLINK nicht kompatibel.
/op Generiert Overlay-Code für den Phar-Lap-Linker. Die resultierenden Objekt-Dateien sind mit TLINK nicht kompatibel.
/os Erzeugt TLINK-kompatible Objekt-Dateien ohne Overlay-Unterstützung. Dies ist die Standardeinstellung.
/p Weist TASM an, Warnungen auszugeben, wenn er beim Kompilieren auf Anweisungen trifft, die im Protected Mode Probleme verursachen könnten. So ist im Protected Mode zum Beispiel das Schreiben in das Code-Segment in aller Regel nicht gestattet. Trifft TASM auf eine solche Anweisung, dann wird eine Warnung ausgegeben.
Diese Option benötigen Sie folglich nur, wenn Sie ein Programm schreiben, das im Protected Mode laufen soll.
/q Durch diese Option werden nur Bestandteile in die Objekt-Datei eingefügt, die für das spätere Linken absolut notwendig sind. Durch diese Option werden das Copyright sowie Abhängigkeitsinformationen unterdrückt. Verwenden Sie diese Option nicht, wenn Sie mit einem Werkzeug wie MAKE arbeiten, da dieses die Abhängigkeitsinformationen benötigt.
/r Generiert echte Fließkomma-Instruktionen
Die Option /e kehrt die Wirkung wieder um. Sollten Sie die Direktive EMUL in Ihrer Quelldatei verwenden, dann überschreibt Sie die Option /r.
Die Option /r hat den gleichen Effekt wie die Direktive NOEMUL und die Option /jNOEMUL.
/s Gibt an, daß die Segmente in der Reihenfolge ihres Auftretens geordnet werden sollen. Dies ist die Voreinstellung. Die Segmentreihenfolge kann mit der Option /a oder der Direktive .ALPHA umgestellt werden. Sollte die Direktive .ALPHA in der Quelldatei stehen, dann überlagert sie die Option /s.
/t Weist TASM an, nur dann Meldungen auszugeben, wenn Warnungen oder Fehler auftauchen. Bei erfolgreicher Übersetzung erscheint keine Meldung.
/u Mit dieser Anweisung können Sie festlegen, mit welcher Version von TASM bzw. MASM Sie den Code übersetzen lassen wollen. Es handelt sich um die Kommandozeilenversion der Direktive VERSION
/utthk Diese Option weist TASM an, Code zu assemblieren, der vom Microsoft Thunk-Compiler generiert wurde. Ein Beispiel finden Sie im Verzeichnis \Examples\Thunk95 unterhalb Ihres TASM-Verzeichnisses.
/v Diese Option wurde nur eingebaut, um die Kompatibilität zu MASM-Versionen zu wahren. Sie hat keinerlei Auswirkung auf die Assemblierung.
/w Kontrolliert die Generierung von Warnungen
Die Warnungen gehören einer bestimmten Warnklasse an, die in der folgenden Tabelle aufgelistet sind. Der Einfachheit halber sind sie in englisch aufgelistet.
Warnklasse Bedeutung
ALN Segment alignment
ASS Assuming segment is 16-bit
BRK Brackets needed
GTP Global type doesn't match symbol type
ICG Inefficient code generation
INT INT 3 generation
LCO Location counter overflow
MCP MASM compatibility pass
OPI Open IF conditional
OPP Open procedure
OPS Open segment
OVF Arithmetic overflow
PDC Pass-dependent construction
PQK Assuming constant for [const] warning
PRO Write-to memory in Protected Mode needs CS override
RES Reserved word warning
TPI Illegal warning
UNI For turning off uninitialized segment warning
Geben sie nur /w an, dann werden "schwache" Warnungen ermöglicht, die meistens kennzeichnen, daß bestimmte Punkte im Bereich der Codeeffizienz verbessert werden könnten.
Normalerweise sind alle Warnungen möglich. Lediglich die Warnklassen ICG und PRO sind ausgeschaltet.
Mit /w+Warnklasse werden die Warnungen der angegebenen Warnklasse ermöglicht. Wird keine Warnklasse angegeben, dann werden alle Warnungen ermöglicht.
Mit /w-Warnklasse werden die Warnungen der Warnklasse ausgeschaltet. Wird keine Warnklasse angegeben, dann werden alle Warnungen ausgeschaltet.
/x Werden bedingte Anweisungen wie IF, IFDEF, IFNDEF usw. verwendet und haben diese Anweisungen das Ergebnis false, dann werden die Codezeilen, die von diesen Anweisungen eingeschlossen werden, entgegen dem Standard in die Listing-Datei übernommen.
Entweder weisen Sie TASM mit der Option /l an, eine Listing-Datei zu generieren oder Sie geben auf der Kommandozeile explizit eine Listing-Datei an.
/z Weist TASM an, bei Fehlern während der Kompilierung vor der Fehlermeldung die Quellcodezeile anzuzeigen, in der der Fehler entdeckt wurde. Ohne diese Option zeigt TASM lediglich eine Meldung an, die den Fehler beschreibt.
/zd Ermöglicht das Einfügen von Zeilennummerninformationen in der Objekt-Datei. Durch diese Information kann der Debugger die Zeile im Quellcode anzeigen, die gerade ausgeführt wird.
/zi Weist TASM an, komplette Debug-Informationen in die Objekt-Datei zu schreiben. Diese Informationen umfassen u. a. Zeilennummern zur Synchronisation zwischen Quellcode und Anzeige im Debugger sowie Datentypinformationen.
/zn Verhindert die Ausgabe von Debug-Informationen in die Objekt-Datei. Nützlich, um den Parameter /zi in einer Konfigurationsdatei zu überschreiben.