Assembler bieten ein Maximum an Geschwindigkeit, das kaum zu überbieten ist. Wir testen vier Assembler für den Atari ST.
Trotz zahlreicher Hochsprachen, die es derzeit für den Atari ST gibt, bleibt Assembler ein Muß für jeden, der alles aus seinem Computer herausholen will. Was aber bringt Assembler? Vor allem Geschwindigkeit. Da Assembler die Sprache ist, die der reinen Maschinensprache des Computers am nächsten steht, sind die Programme sehr schnell. Allerdings gibt es bereits einige Hochsprachen-Compiler, die annähernd so schnell sind wie Assembler. In Assembler geschriebene Programme sind außerdem sehr kompakt, da bei der Übersetzung in Maschinensprache die Programme optimal umgesetzt werden.
Das wichtigste Argument für Assembler ist, daß man sich keinerlei Beschränkungen unterwerfen muß. Ein Hochsprachen-Programmierer wird dagegen häufiger an die Grenzen seiner Computersprache stoßen. So besitzt gerade der 68000-Mikroprozessor Eigenschaften, die nur dem Assembler-Programmierer zugänglich sind.
Ein wichtiger Bestandteil vieler Assembler sind Makros, die es erlauben, häufig auftretende Befehlsfolgen zu einem Befehl zusammenzufassen. So kann man sich Bibliotheken von Makros aufbauen und muß Routinen nicht immer wieder neu schreiben. Es gibt eine Reihe von Standardbefehlen, die von 68000-Assemblern benutzt werden: Mit SET und EQU weist man Symbolen Werte zu, DC (define constant) reserviert Speicher und beschreibt ihn mit den angegebenen Werten, DS (define storage) definiert Speicherplatz, ohne ihn zu initialisieren, END beendet die Assemblierung und muß als letzte Anweisung im Quelltext stehen.
Wie sieht nun die Assembler-Programmierung auf einem benutzerfreundlichen System wie dem Atari ST aus? Vier verschiedene Assembler sind derzeit für den Atari ST verfügbar: »AS68« von Digital Research, »ASSEM« von Metacomco, »GSTASM« von GST Systems und »SEKA« von Kuma.
Der Oldie unter diesen vier Programmen ist der »AS68«. Er ist ursprünglich für das Betriebssystem CP/M-68K entwickelt worden und lag dem Entwicklungspaket des Atari ST bei. Seine Hauptaufgabe besteht darin, den Sourcecode des C-Compilers zu assemblieren. Es verwundert deshalb auch nicht, daß Makros nicht implementiert sind. Was der »AS68« sonst noch zu bieten hat, läßt das Programmiererherz höher schlagen. So ist »AS68« in der Lage, viele kleine Mängel im Sourcecode zu beheben. Bei den Branch-Befehlen zum Beispiel entscheidet der Assembler, ob der Befehl mit kurzer oder langer Distanz generiert werden soll. Das nimmt dem Programmierer viel lästige Arbeit ab. Aus einem JSR Qump to Sub-Rou-tine) macht »AS68« ein BSR (Branch to Sub-Routine), wenn dies möglich ist. Programme werden dadurch schneller und kürzer. »AS68« besitzt neben den oben aufgeführten Direktiven DC, DS, END, EQU und SET umfangreiche Funktionen zur bedingten Assemblierung und zum Aufbau von Libraries.
So kann man Ausdrücke auf Gleichheit, Ungleichheit und Größe untersuchen und danach das Programm assemblieren lassen. Mit XDEF definiert man seine Marken extern, um von anderen Programmen aus diese Marken aufzurufen. Man darf auch sein Programm in verschiedene Segmente unterteilen, einzeln assemblieren und dann zusammen linken. »AS68« gibt deutliche Fehlermeldungen aus, die zusätzlich die Zeilennummer der fehlerhaften Zeile angeben. Bei entsprechender Befehlseingabe wird ein formatiertes Listing auf den Bildschirm, den Drucker oder auf Diskette ausgegeben. »AS68« bietet also alles, was man zum Programmieren in Assembler braucht. Außerdem kann man den Sourcecode, den der Compiler liefert, verarbeiten und so komplexe Probleme wie beispielsweise Rekursionen in einer höheren Sprache schreiben. Der »AS68« ist leider nicht separat erhältlich. Er wurde nur mit dem Entwicklungspaket ausgeliefert.
»ASSEM« ist ein Makro-Assembler der englischen Softwarefirma Metacomco, die auch schon den Editor ED für das Entwicklungspaket entwickelte. Dieser Editor und einige Files des Entwicklungspaketes liegen dem Assembler ebenfalls bei. Bei den Files handelt es sich um den Linker »LINK68«, »RELMOD« und einige Libraries. Die 80seitige englische Dokumentation ist übersichtlich gegliedert und läßt keine Fragen offen. In drei Kapiteln werden Editor, Assembler und Linker beschrieben. Der Anhang enthält neben dem alphabetischen Index zwei Beispielprogramme, die den Umgang mit Makros und den Libraries verdeutlichen. Der Editor bietet alle Funktionen, die man von einem Editor erwartet. Die Funktionstasten sind mit den wichtigsten Befehlen belegt, wobei diese auch über die Control-Taste erreichbar sind. Durch Drücken der ESC-Taste gibt man ganze Kommandozeilen ein, um zum Beispiel Blockoperationen durchzuführen.
Gegenüber dem »AS68« bietet »ASSEM« eine Fülle neuer Möglichkeiten und Befehle. Den definierten Makros können mehrere Parameter übergeben werden, wodurch die Makros noch vielseitiger werden. Neu ist auch eine formatierte Ausgabe. So kann man Papierlänge und Zeilenbreite über Direktiven im Quellcode einstellen, die Seiteneinteilung bestimmen und Leerzeilen einfügen. Ebenso läßt sich ein Titel für das Listing festlegen. Mit NOLIST schaltet man das Listen ab und mit LIST wieder ein. Möchte man einen Testlauf machen, unterdrückt der Befehl NOOBJ die Ausgabe des Objektcodes auf Diskette. Über die Direktive INCLUDE lassen sich andere Sourcecodes von der Diskette einbinden. So ist man in der Lage, große Programme zu unterteilen, um den Überblick zu behalten. Schon beim Aufruf von »ASSEM« darf der Programmierer viele Parameter einstellen, zum Beispiel kann er die Ausgabe des Listings und der Fehlermeldungen auf die Diskette umleiten. Mit INC lassen sich, ähnlich wie bei INCLUDE, externe Quellcodes einfügen. OPT erlaubt dem Benutzer, Symboltabellen und Cross-Reference-Tabellen ausgeben zu lassen. Die Labels im Quellcode dürfen bis zu 30 Zeichen lang sein, womit sich auch sehr lange Namen wie beispielsweise »BILDSCHIRM_BASIS_ADRESSE« unterbringen lassen und eine Dokumentation fast überflüssig machen. Ist das letzte Zeichen eines Labels ein Dollarzeichen ($), so ist dieses Label lokal definiert. Die Definition reicht bis zum nächsten »normalen« Label und erlaubt es, einen Labelnamen mehrfach zu nutzen. An Rechenoperationen stehen +, @, *, /, AND, OR, Links- und Rechtsschieben, NOT und Monadisches Minus zur Verfügung. Es kann mit dezimalen, hexadezimalen, oktalen und binären Zahlen oder auch mit ASCII-Zeichen gearbeitet werden. Die beigefügten Libraries erleichtern die GEM-Programmierung, da alle Routinen durch einfache Unterprogrammaufrufe erreichbar sind. Die Parameter werden dabei auf dem Stack abgelegt. Leider ist zur GEM-Programmierung keinerlei Dokumentation beigefügt, auch fehlt dem Programmpaket ein Debugger, um Fehler in Programmen zu finden. Ansonsten ist »ASSEM« für 180 Mark ein komplettes Paket, das dem Assembler-Programmierer bietet, was er zur Programmentwicklung auf dem Atari ST benötigt.
Ein ganz anderes Konzept ist in »SEKA« von Kuma Computers verwirklicht. Editor, Assembler, Linker und Debugger sind in einem Programm von 17 (in Worten; siebzehn) KByte Länge untergebracht. Diese spartanische Kürze steht allerdings in keiner Relation zur Leistungsfähigkeit des Programms. Auch die, in dem ebenso etwas kurz geratenen Handbuch, versprochene Verarbeitungsgeschwindigkeit des Assemblers von 30000 Zeilen pro Minute entspricht der Realität. Der integrierte Zeileneditor ist allerdings nicht sehr komfortabel. Zum schnellen Korrigieren von Fehlern eignet er sich aber sehr gut. Eine kleine Enttäuschung gab es, als das erste kleine Programm durch den Assembler lief. »SEKA« verarbeitet keine Befehle, die eine Adressierungsart im Mnemonic enthalten (ADDA oder ADDI), sondern generiert diese beim Assemblieren selbst. Das erleichtert zwar oft die Programmierung, verringert aber die Kompatibilität zu anderen Assemblern. Mit »SEKA« kann man, wie mit »ASSEM«, Makros definieren, wobei in jedem Makro lokale Labels erlaubt sind.
Statt der DC-Direktive benutzt »SEKA« den Befehl BLK. Der zu reservierende Speicher kann damit noch mit einem beliebigen Wert initialisiert werden. Bedingte Assemblierung erfolgt mit den Befehlen IF, ELSE und ENDIF. Zur Ausgabe eines formatierten Listings stehen die Befehle LIST, NLIST und PAGE zur Verfügung. ORG und CODE bestimmen, ob das Programm absolut oder relocatibel (im Speicher verschiebbar) sein soll. An Rechenoperationen besitzt »SEKA« +,*,/, AND, OR, XOR und NOT. Sie arbeiten mit den vier Basen 16, 10, 8, 2 und mit ASCII-Zeichen. Hat man nun seinen Quellcode fertig im Speicher stehen, drückt man einfach die Taste »A« zum Assemblieren. »SEKA« fragt nach den Angaben, die es dem Benutzer erlauben, ein formatiertes Listing auf den Drucker oder den Bildschirm auszugeben oder aber einen linkbaren Code zu erzeugen. Das lauffähige Programm kann sofort von »SEKA« gestartet und getestet werden. Der eingebaute Debugger besitzt Einzelschrittverarbeitung, bei der man nach einer beliebigen Anzahl von Maschinenbefehlen die Kontrolle über den Computer zurückbekommt. Sollten bei der Ausführung Fehler auftreten, wie beispielsweise Bus- oder Adreßfehler oder illegale Opcodes, wird die Kontrolle ebenfalls wieder dem Benutzer übergeben. Natürlich können auch Speicherbereiche auf dem Bildschirm oder Drucker angezeigt und disassembliert werden. Da sich alle Schritte ohne Diskettenzugriff vollziehen, sind die Arbeitsgänge Editieren, Übersetzen und Austesten sehr kurz und lassen die Entwicklungszeit der Programme stark sinken. Der Preis beträgt etwa 180 Mark.
Nun gibt es im Atari ST aber die gute Fee GEM, die selbst komplizierte Aufgaben am Computer für den Benutzer kinderleicht gestaltet. Diese Eigenschaft haben sich auch die Entwickler des GST-Assemblers (Bild 1) zunutze gemacht. Das Programmpaket schöpft die Fähigkeiten von GEM voll aus. Die Steuerung aller Funktionen geschieht mit der Maus und erfordert nur sehr kurze Eingewöhnungszeiten. Nach dem Start befindet man sich in der Shell Log, aus der alle nötigen Funktionen erreicht werden können. Durch Anwählen von EDIT FILE gelangt man in den Editor, der auch unter GEM läuft und allen erdenklichen Komfort bietet. Editor, Assembler und Linker werden durch Anklicken des entsprechenden Menüpunktes in den Pulldown-Menüs aktiviert. Darüber hinaus können auch andere Programme gestartet werden. So wird ein Kopierprogramm geladen und gestartet, um den Objektcode beispielsweise auf eine andere Diskette zu kopieren. Ebenfalls läßt sich durch Anklicken in Menüs einstellen, ob man ein formatiertes Listing, eine Cross-Reference-Tabelle, eine Fehlerliste oder eine Symboltabelle ausgeben möchte. Listings lassen sich auf Bildschirm, Drucker, Diskette und über die RS232-Schnittstelle ausgeben. Der Assembler verarbeitet alle Mnemonics des 68000-Mi-kroprozessors. Für Listingkontrolle, bedingte Assemblierung, Rechenoperatoren und Makros gilt dasselbe wie für die oben beschriebenen Assembler. Eine Besonderheit von »GSTASM« sind die hochsprachlichen Elemente, die als Makros auf Diskette beiliegen. Mit den Kombinationen FOR, ENDFOR, REPEAT, UNTIL, WHILE, ENDWHILE und FOREVER kann man Schleifen komfortabel programmieren. Mit den Makros GASE, SWITCH, ENDSWITCH, ENDC und DEFAULT lassen sich auch komplexe Kontrollstrukturen realisieren. Weitere Makros sind für den Umgang mit Strings vorgesehen. »GSTASM« ist ein hervorragendes Werkzeug zur Assembler-Programmierung (Preis umgerechnet etwa 120 Mark), dem eigentlich nur ein Debugger fehlt.
Wer das Entwicklungspaket besitzt und ohne Makros auskommen kann, ist mit dem »AS68« gut bedient. Da die anderen drei Produkte unterschiedliche Ausstattungen haben und auch verschiedene Schwerpunkte setzen, ist es jedem selbst überlassen, für welches Werkzeug er sich entscheidet. Bild 2 zeigt noch die Assemblierzeiten für einen 70 Zeilen langen Quellcode. Mit einer RAM-Disk läßt sich also viel Zeit sparen. (M. Bernards/wb)
Assemblierzeiten für einen 70-zeiligen Quellcode
Ladezeiten für Assembler sind enthalten
Programm Mit Disk Mit Ram-Disk
AS68 40 sec 11 sec
ASSEM 17 sec 13 sec
SEKA - 1 sec*
GSTASM 18 sec 10 sec
* SEKA assembliert nur in RAM
Bild 2. Die vorgestellten Assembler im Geschwindigkeitsvergleich