GFA-Assembler - der Traum-Assembler?

Mit einer Programmiersprache startete das Softwarehaus GFA-Systemtechnik seine erfolgreiche Karriere in der Atari-Szene. Weitere Anwendungsprogramme folgten und nun kommt die nächste Programmiersprache aus der Düsseldorfer Softwareschmiede: GFA-Assembler.

Rolf Hilchner, Prokurist bei GFA-Systemtechnik, schilderte uns die Anfänge: »Als GFA-Systemtechnik ein Assembler angeboten wurde, stürzte sich Frank Ostrowski, Chefprogrammierer und Entwickler von GFA-Basic, sofort auf dieses Produkt. Als absoluter Fachmann für diese schnellste aller Programmiersprachen hat ihn keiner der bisher angebotenen Assembler richtig überzeugt. Das Konzept seines Testmusters überzeugte ihn schnell: Hier waren Profis am Werk. Ostrowski entwarf mit beiden den Assembler seiner Träume. Seine Ideen flossen in ihre Arbeit ein, und was entstand, sollte der beste Assembler für den Atari ST werden.«

Haben wir hier wirklich den Non-Plus-Ultra-Assembler für den Atari ST vor uns?

Der GFA-Assembler wird in einem Ringordner geliefert, der dem des GFA-Basic 3.0 entspricht. Auf der beiliegenden Diskette befinden sich das Hauptprogramm, bestehend aus Assembler, Editor, Linker und Archivverwaltung, sowie der Debugger und einige Hilfs- und Beispiel-Programme. Diskette ins Laufwerk und los geht's. Der Assembler ist etwa 150 KByte lang. Nach dem Start fordert er den Dateinamen des Textes, den man bearbeiten möchte. Sofort erscheint die ungewöhnliche Bedienoberfläche des GFA- Assemblers.

Die Programmierer verzichteten auf GEM und entwickelten stattdessen eine eigene, mit Maus steuerbare Oberfläche. Statt der normalen Dateiauswahl-Box bietet der GFA-Assembler einen Dateiauswahl-Bildschirm, der bis zu 69 Dateinamen gleichzeitig auf dem Bildschirm anzeigt. Die gewünschte Datei wählt der Anwender wie gewohnt mit der Maus. Laufwerk, Pfad und Extension wechselt man wie bei der normalen Dateiauswahl-Box durch Mausklick. Der Editor verfügt über zwei Arbeitsmodi. Während der eine Modus ASCII- Texte verarbeitet, wurde der andere Modus ganz auf das Schreiben von Assembler-Texten zugeschnitten. Der Editor prüft jede Eingabezeile sofort auf korrekte Syntax, formatiert sie und setzt die Eingaben in Token (Befehlswörter) um. Vergessene Operanden oder illegale Adressierungsarten erkennt der intelligente Editor sofort. Darauf kann ein erfahrener Programmierer zwar verzichten, für einen Anfänger und Gelegenheitsprogrammierer ist diese Hilfe traumhaft.

Das Tokenisieren komprimiert die Texte auf zirka 30 bis 50 Prozent gegenüber dem ASCII-Format. Außerdem unterscheidet der Editor zwischen Label, Makro und Opcode. Um die Formatierung des Textes braucht sich der Programmierer keine Gedanken machen: Der Editor rückt alle Eingaben ein, genau wie man es von der Assembler-Schreibweise gewohnt ist. Die Labels erscheinen ab der ersten Spalte, die Opcodes ab dem ersten Tabulatorsprung, die Operanden ab dem zweiten Tabulatorsprung.

In punkto Geschwindigkeit nahmen sich die Programmierer des GFA-Assembler den Editor »Tempus« zum Vorbild. Es gibt wohl derzeit nur wenige Editoren, die genauso schnell beim Scrolling sind, wie unser Testkandidat. Wenn man bedenkt, daß er ebenfalls sehr schnell scrollt, obwohl er im Assembler-Modus den Text erst decodiert um ihn anzuzeigen, dann muß man den Programmierern hohen Respekt zollen. Die Bedienung ist dabei sehr komfortabel. Um den Text in die jeweilige Richtung zu scrollen, steuert man den Mauszeiger einfach zum oberen oder unteren Textrand.

Über einen ähnlichen »Turboantrieb« verfügen die Funktionen Suchen und Ersetzen. Als Maßstab diente ein zirka 4500 Zeilen langer Text, in dem wir alle »e« durch »ß« ersetzen ließen. Tempus benötigte 8, GFA-Assembler 14 und »1st Word plus« 115 Sekunden.

Daß Tempus in manchen Funktionen Pate stand, merkt man spätestens, wenn man die Boxen für Suchen und Ersetzen sieht. Sie sind nahezu identisch, obwohl der GFA-Assembler keinerlei GEM-Objekte benutzt.

In den Suchmasken können sogenannte Wildcards oder Joker verwendet werden. Anders als bei vielen anderen Suchfunktionen, ist man hier in der Lage, die Zeichen für die Joker frei zu wählen. Wer also in einer Zeichenketten ein » * « oder »?« suchen möchte, ändert nur das Zeichen für den entsprechenden Joker. Dem Suchen von Zeichenketten wurden aber noch einige Besonderheiten zugedacht. Klickt man mit der Maus eine Zahl oder einen Symbolaufruf an, so springt der Cursor in die entsprechende Zeile. Wenn man zum Beispiel in der Zeile »BEQ test« das Wort »test« mit einem Doppelklick anwählt, sucht der Editor die Zeile, die in den ersten vier Spalten dieses Wort enthält. Befindet sich das angeklickte Wort am Anfang der Zeile, erscheint auf dem Bildschirm die Dialogbox der Funktion Suchen. Auf komfortable Weise lokalisiert man so Label und die Aufrufe. Wem das noch nicht genügt,'dem listet der Editor eine übersichtliche Cross-Referenz-Tabelle auf, in der alle Labels und Aufrufe mit Zeile und Spalte aufgeführt sind.

Quelltexte anderer Assembler lädt man im ASCII-Modus, da es sich im allgemeinen um gewöhnliche ASCII-Texte handelt. Schaltet man nun in den Assembler-Modus, so wandelt der Editor den Text in das interne Format des GFA- Assemblers. Das ist allerdings eine Achillesferse des Editors. Die Konvertierung geschieht sehr langsam. Das Umsetzen langer Programme kann zu einer Geduldsprobe werden. Da dies aber normalerweise nur einmal pro Text geschieht, ist es noch tragbar.

Unangenehmer ist es da schon, wenn die Syntax nicht mit der des GFA-Assemblers übereinstimmt. Manche Assembler, wie »MadMac« oder auch unser Testkandidat, benötigen als Abschluß für ein gesetztes Label einen Doppelpunkt. Andere Assembler kommen ohne diesen aus, wie zum Beispiel »AS68« und »Devpac«. Trifft nun der Editor bei der Konvertierung oder bei der Eingabe auf ein Label, das nicht mit einem Doppelpunkt abgeschlossen ist, interpretiert er diese Zeile als Makro-Aufruf und formatiert sie entsprechend. Beim Blättern durch den formatierten Text sind solche Zeilen nur sehr schwer auszumachen, da sie sich nahtlos einfügen. Diese Schwäche haben die Programmierer erkannt und entsprechend reagiert: Der endgültigen Version liegt ein kleines Hilfsprogramm bei, das die fehlenden Doppelpunkte automatisch setzt. Die meisten Befehle lassen sich sowohl mit Maus als auch über Tastatur abrufen.

Etwas befremdend ist die Arbeit mit Funktionen, die nur über Pull-Down-Menüs erreichbar sind. Dies liegt wohl daran, daß die Pull-Down-Menüs etwas anders implementiert sind, als man es von anderen Programmen kennt. Beim normalen Editieren ist die Menüleiste nicht sichtbar. Erst wenn man den rechten Mausknopf oder die Escape-Taste drückt, erscheint die Menüleiste.

Eine Besonderheit des GFA-Assemblers ist die Steuerung der Menüleiste mit der Tastatur. Zu diesem Zweck sind die Menütitel und die einzelnen Einträge numeriert. Drückt man nun eine der Funktionstasten oder eine Zifferntaste auf dem Haupttastaturfeld, klappt das entsprechende Menü herunter. Mit einem weiteren Tastendruck wählt man den gewünschten Menüeintrag. Durch diesen Kunstgriff erreicht man jede Funktion des Editors auch mit der Tastatur.

Beeindruckend ist auch, daß die Anzahl der ladbaren Texte nur durch die Speicherkapazität beschränkt ist. 20 oder 30 Texte gleichzeitig im Speicher zu haben, ist für den GFA-Assembler kein Problem. Modulare Programmierung gerät damit zum Kinderspiel.

Die Syntax entspricht weitgehend der des AS68 von Digital Research und MadMac von Atari. Darüber hinaus sind noch einige Erweiterungen enthalten, die vor allem in der Makro-Verarbeitung zur Geltung kommen. Der GFA-Assembler läßt als Parameter alle Adressierungsarten des MC68000 zu. Da aber viele Adressierungsarten vom Prozessor nicht in jeder Befehlskombination zugelassen sind (zum Beispiel darf PC-relative Adressierung nicht Zieladresse sein), fragt der Assembler auf Wunsch die Adressierungsart jedes Makro-Parameters ab. Für jeden einzelnen Parameter ermittelt er, ob er im MakroAufruf gesetzt wurde oder nicht. So ist man in der Lage, innerhalb des Makros auf das Weglassen eines Parameters beim Aufruf zu reagieren.

Eine sehr nützliche Einrichtung ist der PATH-Befehl. Mit ihm gibt der Anwender Suchpfade auf Diskette vor, auf die sich der Include-Befehl bezieht. Häufig verwendete Include-Dateien - zum Beispiel Einbindungen von AES und VDI-Aufrufen - versteckt man in einem Ordner und teilt dem Assembler über den PATH-Befehl mit, in welchem Ordner er die Include-Dateien findet. Hat man sich durch seinen Quelltext gearbeitet, geht es ans Assemblieren. Zwei Menüs beeinflussen das Übersetzen. Im Parametermenü setzt man die Ausgabeparameter.

Der letzte Punkt birgt ein Novum: Hier wählt man, ob der Atari ST die Assemblierung im Hintergrund durchfuhrt. Die ersten Versuche führten dazu, daß erst einmal nichts geschah. Erst intensives Studium des Handbuches und Gespräche mit den Programmierern des GFA-Assemblers lüfteten das Geheimnis dieser Funktion. Hat man das Programm auf Hintergrund-Assemblierung eingestellt, beginnt der Assembler, sobald die Tastatur einen Moment nicht berührt wurde, den Quelltext zu übersetzen. Die Aktivität des Assemblers erscheint in der Menüzeile. Der Benutzer merkt nichts von der Hintergrundarbeit und kann weiter seinen Text editieren. Ist der Assembler fertig, zeigt er das ebenfalls in der Menüzeile an. Den Objektcode speichert man nun mit der Taste FIO. Jede weitere Änderung im Quelltext hat zur Folge, daß der Assembler seine Arbeit von neuem aufnimmt.

Die Optimierungsfähigkeiten unseres Testkandidaten übertreffen alle anderen Assembler. Während die meisten Assembler bestenfalls in der Lage sind, Brauches zu optimieren, bietet der GFA-Assembler fünf weitere Arten der Programmoptimierung an. So kann er zum Beispiel JMP- und JSR-Befehle in Branches wandeln, wenn die zu überbrückende Differenz kleiner 32 KByte ist. Absolute Adressierungen lassen sich in PC-relative optimieren. Im Test wurden manche Programme bis zu 30 Prozent kürzer, wenn alle Optimierungsflags gesetzt waren.

Manche Optimierungen sind allerdings mit Vorsicht zu genießen. Vor allem die Optimierung der absoluten nach PC-relativen Adressierung hat ihre Tücken, wenn man die Assembler-Programme an Hochsprachenprogramme anbinden möchte. Hier passiert es nämlich leicht, daß das DATA- oder BSS-Segment, das im Source direkt hinter dem Text-Segment steht, nach dem Linken mehr als 32 KByte entfernt ist.

Der GFA-Assembler bietet zwei Objektformate an. Zum einen erzeugt er ausführbare Programme, zum anderen ist er in der Lage, Objektcode im DRI- kompatiblen Format zu entwickeln. Wünschenswert wäre noch das vor allem in England verbreitete GST-Format.

In punkto Geschwindigkeit läßt der GFA-Assembler jeden anderen derzeit erhältlichen Assembler im Regen stehen. Mit einem Durchsatz von über 165 000 Zeilen pro Minute ist er doppelt so schnell wie der bisherige Rekordhalter MadMac. Diese hohe Zeilenzahl erreicht er allerdings nur, wenn alle Zeilen des Programms aus NOPs bestehen. Aber auch bei komplexen Programmen, mit Makros und Berechnungen, schafft der GFAAssembler einen Durchsatz von über 50000 Zeilen pro Minute und ist dann immer noch fast doppelt so schnell wie die Konkurrenz. Man darf gespannt sein, wann dieser Rekord gebrochen wird.

Viele Programmierer schreiben ihre Assembler-Programme nicht in einem Guß, sondern unterteilen sie in viele überschaubare Dateien, die separat assembliert und später zusammengelinkt werden. Es wäre lästig, müßte man nach jeder Änderung den Assembler verlassen um den Linker aufzurufen. Zu diesem Zweck ist im GFA-ASsembler der Linker eingebaut. In groben Zügen entspricht der Linker dem Atari-Linker des Entwicklungspaketes. Er verarbeitet nicht nur die Objektfiles von DRI, sondern auch die Archive (Libraries) und die Indexdateien der Archive. Sollte eine solche Indexdatei nicht vorhanden sein, wird sie vom Linker erzeugt. Durch die Verwendung der Indexfiles, in denen genaue Informationen über die Library stehen, gestaltet sich der Linkvorgang zu einem Vergnügen. Selbst lange Programme, die mehrere Libraries benötigen, verbindet der Linker in wenigen Sekunden.

Die Steuerung des Linkers ist denkbar einfach. In einem Textfile gibt der Anwender an, welche Objekt- und Archivdateien zum Linken benötigt werden. In diesem Linkfile darf er auch Assembler-Quelltexte angeben. Trifft der Linker auf eine solche Zeile, wird zuerst der Assembler aktiviert und dann der Text übersetzt. Sollte sich der Text im Speicher befinden, wird er assembliert und anschließend der Linkvorgang fortgesetzt. Der Vorteil dieses Schemas ist, daß alle Teilprogramme eines Programms im Speicher bleiben, und durch Starten des Linkers komplett übersetzt werden.

Ein Mangel ist hier aber auch zu verzeichnen. Wenn ein Programm in viele Module unterteilt ist, übersetzt der GFA-Assembler prinzipiell alle Quelltexte, die im Linkerfile angegeben sind, auch wenn nur in einem Änderungen stattfanden. Es wäre hilfreich, wenn es eine kleine Funktion geben würde, die vor dem Assemblieren kontrolliert, ob der entsprechende Quelltext Oberhaupt eine Ände- rung enthält.

Ein weiteres Programm, das in den GFA-Assembler eingebaut ist, ist eine Archiv- Verwaltung. Damit können einzelne Module einer Library hinzugefügt, extrahiert oder wieder gelöscht werden. Die gesamte Steuerung geschieht mit der Maus. Zum Paket gehört der GFA-Debugger, der in zwei verschiedenen Versionen beiliegen soll. Eine dieser Version lag uns zum Test vor. Leider hatte dieses Programm noch nicht die Reife des Assemblers und stürzte häufig ab. An einen Härtetest war nicht zu denken, so daß wir hier nur kurz aufzeigen, was der Debugger leistet.

Der GFA-Debugger scheint eine Weiterentwicklung des legendären SID68K von Digital Research zu sein, auf den noch heute einige Programmierer schwören. So ist fast der komplette Befehlsumfang des SID implementiert. Allerdings ist der Debugger seinem Vorbild in nahezu allen Belangen überlegen. Die Eingabe ist nicht wie bei vielen anderen Programmen Zeilen-, sondern Bildschirmorientiert. Das heißt, daß man sich mit dem Cursor auf dem ganzen Bildschirm bewegen und so seine Änderungen durchfuhren kann. Der GFA-Debugger geht soweit, daß man mit der Maus den Cursor positionieren kann.

Die Maus hat noch einige Funktionen erhalten. Es ist zum Beispiel machbar, wie im Editor, mit der Maus ein Disassembler-Listing oder einen Hexdump zu scrollen. Man braucht nur den Mauszeiger an den oberen oder unteren Bildschirmrand zu steuern. Befindet sich in der ersten beziehungsweise der letzten Zeile Disassembler- oder HexListing, wird an der entsprechenden Adresse das Listing fortgesetzt. Wer lieber mit Tastatur arbeitet, scrollt mit den Cursortasten. Klickt man ein Symbol im Disassembler-Listing an, wird ab der entsprechenden Adresse disassembliert. Sollte sich die Adresse außerhalb des Textsegmentes befinden, gibt der GFA-Debugger einen Hexdump aus. Mit der letzten Mausfunktion lassen sich Bildschirmausschnitte markieren und an der aktuellen Cursorposition einfügen. Längere Eingaben stellt man so mit der Maus zusammen.

Mit dem GFA-Assembler kommt ein Entwicklungspaket auf den Markt, das den meisten Assembler-Programmierern das Herz höher schlagen läßt. Im Preis von knapp 150 Mark sind viele Komponenten enthalten, die bei anderen Produkten erst hinzugekauft werden müssen. Die Geschwindigkeit und viel Komfort - trotz der gewöhnungsbedürftigen Oberfläche - machen den GFA-Assembler zu einem Traum-Assemblerpaket, das der Konkurrenz das Fürchten lehrt.

Produktname: GFA-Assembler
Preis: 149 Mark
Hersteller: GFA-Systemtechnik

Stärken:

Schwächen:


Michael Bernards hb
Aus: ST-Magazin 08 / 1988, Seite 62

Links

Copyright-Bestimmungen: siehe Über diese Seite