Speichermodelle

Es wurde bereits davon gesprochen, daß ein Programm in Segmente unterteilt ist. TASM bietet eine einfache Möglichkeit festzulegen, welche Segmente angelegt werden sollen. Zu diesem Zwecke dient die Anweisung MODEL.
Die genaue Syntax dieser Anweisung lautet:

MODEL [model_modifier] memory_model [codesegment_name] [, [language_modifier]
	language] [, model_modifier]
Wie Sie sehen, ist memory_model der einzige wirklich benötigte Parameter. Die folgende Tabelle listet die möglichen Speichermodelle auf.


Speichermodelle
Modell Code Daten Beschreibung
TINY near near Code und Daten liegen in einem Segment, das DGROUP genannt wird.
Dieses Modell wird für .COM-Programme verwendet.
SMALL near near Der Code liegt in einem Segment, die Daten werden in einer Gruppe DGROUP zusammengefasst. Die Segmentadresse dieser Gruppe entspricht dem Datensegment.
Dieses Modell wird am häufigsten für Stand-alone-Assemblerprogramme verwendet.
MEDIUM far near Es werden mehrere Codesegmente verwendet, die Daten liegen alle in der Gruppe DGROUP.
COMPACT near far Der Code befindet sich in einem Segment, alle near-Daten befinden sich in der Gruppe DGROUP. Die Daten werden über Far-Zeiger referenziert.
LARGE far far Der Code befindet sich in mehreren Segmenten, die near-Daten in der Gruppe DGROUP. Die Daten werden über FAR-Zeiger referenziert.
HUGE far far Soweit es TASM betrifft gilt hier das gleiche wie beim LARGE-Modell.
TCHUGE far far Das gleiche wie im LARGE-Modell, allerdings wird von anderen Annahmen über die Zuordnung von Segmenten zu ihren Registern ausgegangen.
TPASCAL near far Mit diesem Modell werden frühe Versionen von Borland Pascal unterstützt. Für neuere Versionen wird es nicht mehr benötigt.
FLAT near near Wie im SMALL-Modell werden für Code und Daten je ein Segment verwendet, dieses Modell ist allerdings für die Verwendung in 32-Bit-Systemen wie Win95 oder OS/2 vorgesehen.

Am ehesten bedürfen jetzt wohl die Begriffe near und far einer Erklärung, aber die ist schnell gegeben:
Bei der sogenannten NEAR-Adressierung werden die Daten (unter Daten seien hier echte Daten sowie der Code verstanden) über einen Offset adressiert. Abgesehen vom Modell FLAT hat der Offset immer eine Größe von 16 Bit, kann also maximal 65536 Bytes adressieren. Im FLAT-Modell hat der Offset eine Größe von 32 Bit, kann also 4 GB adressieren.
Bei der FAR-Adressierung werden die Daten über eine Segment:Offset-Kombination adressiert. Dies bedeutet, daß auch Daten angesprochen werden können, die nicht mehr im aktuellen Segment liegen.
Es soll erwähnt werden, daß die Adressierungsarten in den einzelnen Modellen den Standard darstellen. Natürlich können auch im Modell SMALL Daten über FAR-Zeiger referenziert werden.

Folgende model_modifier stehen zur Auswahl:
Model Modifier
Model Modifier Funktion
NEARSTACK Zeigt an, daß das Stacksegment in DGROUP (falls vohanden) eingefügt werden soll und SS auf DGROUP zeigt.
FARSTACK Zeigt an, daß das Stacksegment auf keinen Fall in DGROUP eingefügt werden soll und das SS auf nichts zeigt.
USE16 Falls ein Prozessor höher als 80286 als Zielplattform angegeben wurde, dann zeigt diese Direktive, daß alle Segmente als 16-Bit-Segmente behandelt werden sollen.
USE32 Falls ein Prozessor höher als 80286 als Zielplattform angegeben wurde, dann zeigt diese Direktive, daß alle Segmente als 32-Bit-Segmente behandelt werden sollen.
DOS, OS_DOS Gibt an, daß die Ausführungsplattform DOS ist. (Standard)
NT, OS_NT Gibt an, daß die Ausführungsplattform Win32 ist (Win95, Win NT)
OS2, OS_OS2 Gibt an, daß die Ausführungsplattform OS/2 ist

Language und language_modifier spezifizieren die Vorgabeaufrufkonventionen von Unterprogrammen. Ebenso steuern diese Angaben die Erzeugung bestimmter Codeabschnitte in den Unterprogrammen.
Für language sind folgende Angaben möglich: BASIC, C, CPP (C++), FORTRAN, NOLANGUAGE, PASCAL, PROLOG, STDCALL und SYSCALL. Wird language nicht angegeben, nimmt TASM NOLANGUAGE an.
Language_modifier können Sie verwenden, wenn Sie zusätzlichen Code für Unterprogramme für Windows oder den Borland Overlay Loader erstellt haben möchten. Möglichkeiten sind: NORMAL, ODDFAR, ODDNEAR und WINDOWS. Wird kein language_modifier angegeben, geht TASM von NORMAL aus.

Wie Sie in unserem ersten Programm sehen können, haben wir als Speichermodell SMALL und kein Sprachmodell gewählt. Die Wahl des Sprachmodells hätte in diesem kleinen Programm noch keine Auswirkungen. Wenn es aber später an die Erstellung von Unterprogrammen geht, dann kann ein in der MODEL-Direktive gewähltes Sprachmodell die Programmierung erheblich vereinfachen. Sie haben natürlich bei der Definition eines Unterprogramms die Möglichkeit, ein eigenes Sprachmodell festzulegen oder ein bestehendes zu überschreiben.

Allein aufgrund des festgelegten Speichermodells mittels MODEL-Direktive wird uns die Möglichkeit gegeben, durch die einfache Angabe von DATASEG oder CODESEG ein Segment anzulegen oder fortzusetzen. Der Assemblierer kümmert sich selbständig darum, die Segmente so anzuordnen, daß sie dem gewählten Speichermodell entsprechen.
Für die fortgeschritteneren Assembler-Programmierer oder spezielle Situationen gibt es noch die herkömmliche Art der Segmentdefinition, die auf der einen Seite deutlich unkomfortabler ist, auf der anderen Seite Anpassungen ermöglicht, die die Speichermodelle unterbinden würden.