Easy Rider Assembler & Reassembler: Take It Easy

Die Programmierung in Assembler hat in letzter Zeit an Bedeutung verloren. Schnellere Rechner und der Trend nach einer möglichst guten Portabilität von Programmen sprechen für die Programmierung in einer Hochsprache. Auf Atari ST und TT kommt hier in erster Linie die Programmiersprache C in Frage, die auch auf anderen Systemen weit verbreitet ist. Für gewisse Aufgabenstellungen stellt Assembler jedoch weiterhin die Sprache der Wahl dar.

Gerade dann, wenn es darum geht, systemnahe Programme wie z. B. Gerätetreiber zu schreiben, läßt sich die Assembler-Programmierung meist nicht umgehen. Der direkte Zugriff auf Hardware-Bausteine, insbesondere in zeitkritischer Umgebung, kann über eine Hochsprache oft nicht sinnvoll abgewickelt werden. Da es darüber hinaus keine Schwierigkeiten bereitet, Assembler-Unterroutinen in Hochsprachenprogramme einzubinden, wird man immer wieder auf Situationen treffen, wo sich der Einsatz eines Assemblers anbietet.

Ist es die Aufgabe des Assemblers, einen vom Menschen lesbaren Quelltext in einen für den Mikroprozessor ausführbaren Code umzusetzen, so kann in manchen Fällen auch eine Umwandlung in die umgekehrte Richtung wünschenswert sein. Steht man beispielsweise vor dem Problem, eine Systemroutine oder gar ein fremdes Programm analysieren zu wollen, so bereitet es wenig Freude, sich den entsprechenden Code mit einem Disassembler zu betrachten. Gerade bei längeren Routinen (und das sind die meisten) verliert man nur allzu leicht den Überblick. Schließlich läßt es sich in Assembler wunderbar unstrukturiert programmieren, und selbst bei halbwegs strukturierten Programmen steht man nach einigen JSRs und JMPs auf dem Schlauch: Wo geht es denn nun wie weiter?

Da es manche Disassembler nicht erlauben, auf einen Drucker oder in eine Datei zu disassemblieren, ist man unter Umständen darauf angewiesen, die Nuß am Bildschirm zu knacken. So etwas fördert nicht gerade die Übersicht. Erschwerend kann hinzukommen, daß sich innerhalb eines Code-Bereiches Texte oder Datentabellen befinden können, was zu weiterer Verwir rung führen kann.

Rettungsanker Reassembler

Um in einer solchen Situation sein Nervenkostüm zu schonen, bietet sich die Verwendung eines Reassemblers an. Dieser versucht, einen vorgegebenen Speicherbereich oder eine Datei in das zurückzuverwandeln, was es einmal war, also in einen Quelltext, der sich anschließend mit einem handelsüblichen Text-Editor bearbeiten läßt. Dabei hat ein Reassembler eigentlich keine grundlegend besseren Karten als der Programmierer in Verbindung mit einem Disassembler. Da die Umwandlung von Code in Quelltext nicht unbedingt eindeutig ist. muß das Programm ein gewisses Maß an Intelligenz besitzen, um dieser Aufgabe Herr zu werden. Im Idealfall erhält man nach dem Reassemblieren eines Programms eine Quelltext-Datei, aus der nach dem Assemblieren das ursprüngliche Programm unverändert zurückgewonnen wird. Da ein Reassembler in der Regel mildem Hintergedanken eingesetzt wird, Änderungen auch in fremden Programmen vornehmen zu können, ist die bereits angesprochene Erkennung von Daten- und Codebereichen von besonderer Bedeutung. Schließlich soll die vom Reassembler durchgeführte Analyse des Programmcodes möglichst fehlerfrei sein, um den Anwender nicht doch noch mit nahezu unlösbaren Knobeleien zu konfrontieren.

Ein verrücktes Paar

Zum Test lag das EASY RIDER-Paket vor, das aus dem Reassembler EASY RIDER und seinem Gegenstück, dem EASY RIDER-Assembler, besteht. EASY RIDER erhebt den Anspruch, beim Unterscheiden von Code und Daten eine besonders hohe Trefferquote zu besitzen. Für den vorliegenden Test bot es sich also an. insbesondere Programme mit „gemischten" Programm- und Datenbereichen als Testkandidaten heranzuziehen. Diese wurden zunächst mit EASY RIDER reassembliert und anschließend mit dem EASY ASSEMBLER assembliert. Dann wurde überprüft, ob das neu erzeugte Programm lauffähig und inwiefern es mit dem Originalprogramm identisch war. Zwischen diesen beiden Gesichtspunkten muß man unbedingt unterscheiden. Je nachdem, welche Optimierungen beim Assemblieren gewünscht werden, können unterschiedliche Assembler aus dem gleichen Quell text Programmdateien variierender Länge erzeugen. Sind Reassembler und Assembler aufeinander abgestimmt, so wie es bei den getesteten Produkten der Fall ist, so sollten möglichst keine Abweichungen auftreten.

Neben der Frage, inwiefern beide Programme sich ergänzen, mußte sich der EASY ASSEMBLER noch an Quelltexten beweisen, die ursprünglich für andere Assembler gedacht waren. Da der EASY-Assembler auch einzeln erworben werden kann, stellt sich für manchen Anwender die Frage, ob sich der Umstieg auf einen neuen, möglicherweise schnelleren Assembler ohne allzu große Änderungen an bereits bestehenden Projekten verwirklichen läßt. Daß der EASY ASSEMBLER nicht nur 68000-Befehle versteht, sondern auch Code für den 68030 sowie die Fließkomma-Coprozessoren 68881/68882 zu erzeugen vermag, wurde bei der Auswahl der Quelltexte entsprechend gewürdigt.

An den Start

Widmen wir uns zunächst dem EASY RIDER-Reassembler. Um einen Reassemblier-Vorgang einzuleiten, benötigt das Programm lediglich die Eingabe eines Dateinamens, hinter dem sich eine ausführbare Datei verbirgt. Nach kurzer Wartezeit erscheint diese in Form eines Quelltextes auf dem Bildschirm. Wohlgemerkt, es ist die Rede von „einem" Quelltext, denn den Quelltext schlechthin wird man kaum mehr erzeugen können. Alle Symbole und Labels, die im Laufe der Programmentwicklung vergeben wurden, sind in der Regel nicht mehr in der endgültigen Programmdatei vorhanden, so daß der Reassembler hierfür eigene Marken definieren muß.

Im Falle von EASY RIDER handelt es sich um Symbole des Typs Lxxxx, wobei xxxx für eine durchlaufende Numerierung steht. Sofern das reassemblierte Programm mit einer Symboltabelle versehen war. kann diese berücksichtigt werden, alle Marken werden also auf Wunsch mit den in der Tabelle vermerkten Namen versehen.

Bei einfach aufgebauten Programmen dürfte das so erzeugte, unmanipulierte Quelltext-Format bereits dem entsprechen, was man zur Programmanalyse benötigt. Es sollte lediglich darauf geachtet werden, daß für den Reassemblier-Vorgang der korrekte Prozessortyp eingestellt wurde. Wer ein Programm speziell für den TT reassemblieren will, sollte also nicht versäumen, EASY RIDER auf die Kombination MC68030/MC6888n einzustellen. Ist dies nicht geschehen, finden sich die zusätzlichen Befehle dieser Prozessoren in Form von naturgemäß wenig aussagekräftigen Konstantendefinitionen im Quelltext wieder.

Der nächste Schritt

Wenn die reassemblierte Datei später wieder assembliert werden soll, müssen vor dem Reassemblieren eventuell noch zusätzliche Operationen erfolgen, um einen brauchbaren Quelltext zu erhalten. Für ST und TT gibt es eine ganze Reihe von Assemblern, die in ihrer Syntax leider nicht in allen Punkten kompatibel sind. EASY RIDER erlaubt es deshalb, das Format der Daten- und Befehlsdarstellung an die Bedürfnisse der unterschiedlichen Assembler anzupassen (siehe Abbildung). Fehlermeldungen beim späteren Assemblier-Vorgang, die auf einer falschen Syntax beruhen, dürften sich so vermeiden lassen. Wie man sieht, gibt es eine ganze Reihe von Einstellungen, die sich glücklicherweise in einer Parameterdatei fixieren lassen.

Code und Daten, Daten und Code

Nun ist es also soweit. Der Quelltext liegt in für uns (und unseren Assembler) lesbarer Form vor, man schaut sich das Ergebnis im Überblick an und stutzt: Da findet sich doch tatsächlich ein Befehl an einer Stelle, an der eigentlich Daten zu erwarten wären. Tritt dieser Fall ein, so ist es nach dem Markieren des entsprechenden Adreßbereichs möglich, dem Reassembler zu signalisieren, daß der markierte Block nicht als Daten-, sondern als Befehlsblock zu interpretieren ist. Selbstverständlich lassen sich auch Befehle in Daten umwandeln, denn je nach Komplexität des reassemblierten Programms ist es nie ganz auszuschließen, daß das Datenformat nicht eindeutig erkannt werden kann. Allzu häufig dürfte es mit dem EASY RIDER-Disassembler allerdings wohl kaum passieren, daß Text- und Datenbereiche verwechselt werden. Das von EASY RIDER zur Unterscheidung eingesetzte Verfahren arbeitet in der Tat durchaus zuverlässig.

Noch ein Wort zur Darstellung von Datenbereichen: EASY RIDER erlaubt es, diese innerhalb frei wählbarer Bereiche entweder als Text (also z. B. dc.b „TEXT“) oder als hexadezimale Konstanten (dc.b $54,$45,$58, $54) darzustellen.

Die Menüleiste des Reassemblers im Überblick

Sonderfunktionen

Neben der reassemblierten Ausgabe kann EASY RIDER auch disassemblierte Programm-Listings erzeugen. Hier finden sich anstelle der symbolischen Marken konkrete Adressen. Da sich Hardware-Bausteine oder Systemvariablen stets an festen Adressen befinden, ist es nützlich, daß der Reassembler Label-Dateien verarbeiten kann. Im reassemblierten Quelltext werden dann auf Wunsch für bestimmte Adressen Namen vergeben, was die Analyse einer reassemblierten Datei erleichtert. Es besteht ferner die Möglichkeit, eine beliebige Adresse für den Programmstart anzugeben. Dies erweist sich bei Routinen als notwendig, die für einen ganz bestimmten Adreßbereich assembliert wurden und aus diesem Grund keine Relozierinformationen enthalten.

Daß mit einem Reassembler in erster Linie Programmdateien unter die Lupe genommen werden, erscheint nur natürlich. Gewisse Anwendungen erfordern es jedoch, die zu reassemblierenden Daten von anderer Stelle zu holen. So bereitet es mit EASY RIDER keine Mühe, sich Teile des Betriebssystems in Form eines Quelltextes zu Gemüte zu führen. Hierzu kann ein beliebiger Speicherbereich in ROM oder RAM als Ausgangsbasis gewählt werden. Für Spezialisten besonders praktisch ist die Möglichkeit, Sektorinhalte einer Diskette oder Festplatte reassemblieren zu können. Auf diese Weise erhält man unter anderem Aufschluß über Programme, die sich auf dem Boot-Sektor einer Diskette befinden. Wer Lust hat, kann sich so auch Boot-Sektor-Viren näher anschauen ...

Zum ersten...

Der EASY-Reassembler hinterließ im Test einen überwiegend positiven Eindruck, der lediglich durch das recht trockene Handbuch und die wenig ausgereifte Oberfläche getrübt wurde. So handelt es sich bei EASY RIDER zwar um ein GEM-unterstütztes Programm, das in allen ST und TT-Auflösungen läuft, aber das GEM wurde nicht konsequent genug genutzt. Das einzige Ausgabefenster besitzt kein Größen- oder Schließfeld, was die Nutzung unter MultiGEM erschwert. Die Menüleiste und die Dialogboxen wirken recht unübersichtlich. Informationen über geladene Dateien und freien Speicherplatz gehören ohnehin in eine Dialogbox und haben im Menü nichts verloren. Wünschenswert wäre die Unterstützung mehrerer Fenster, um unterschiedliche Adreßbereiche und die Symboltabelle gleichzeitig ins Blickfeld rücken zu können. Hier sollte der Autor unbedingt noch Verbesserungen vornehmen.

Was schließlich die Geschwindigkeit des Reassemblier-Vorgangs angeht, so kann diese auch auf einem normalen ST durchaus als hoch bezeichnet werden. Selbst bei längeren Programmen bewegt sich die Wartezeit unterhalb einer Minute.

Die Parameter zur Befehlsdarstellung

Der Assembler

Genug dis- und reassembliert. Machen wir einen Schritt in die entgegengesetzte Richtung und beschäftigen wir uns mit dem EASY RIDER-Assembler.

Wenn sich auch die Assembler-Programmierung naturgemäß auf einer niedrigen Ebene abspielt, so kann ein intelligenter Assembler die Programmentwicklung dennoch stark erleichtern. Schaut man sich die Assembler an, die für ATARl-Computer erhältlich sind, so bieten nahezu alle Programme diverse Möglichkeiten zur Optimierung der erzeugten Objektmodule. Dabei geht es in erster Linie darum. Befehle, die durch mehrere Opcodes realisiert werden könnten, auf die schnellste und kürzeste Weise zu codieren. Gerade bei Prozessoren wie dem 68030 des TT kann es Vorkommen, daß unterschiedliche Adressierungsarten je nach Befehl die gleiche Wirkung zeigen. Ein weiteres interessantes Leistungsmerkmal, das man inzwischen bei vielen Assemblern vorfindet, ist die Makro-Verarbeitung. Hier werden häufig benötigte, durchaus komplexe Befehlssequenzen zu einem neuen Befehl zusammengefaßt, was das Assembler-Listing übersichtlicher gestaltet und eine Programmierung erlaubt, die in einem gewissen Maß bereits an Hochsprachen erinnert.

Optimale Optimierung

Der EASY RIDER-Assembler bietet eine ungewöhnlich große Zahl an Optimierungen an. Einfache Fälle stellen die Umsetzungen von Anweisungen wie „MOVE.W #0,D0“ in „CLR.W D0“ oder „MOVE.L #2,D0“ in „MOVEQ.L #2,D0“ dar, die eigentlich jeder Assembler beherrscht. Beide Befehle zeigen zwar jeweils exakt das gleiche Resultat, unterscheiden sich aber in der Ausführungszeit und der Befehlslänge. Nicht mehr selbstverständlich ist die Umwandlung von Befehlen des Typs „MOVE.L #2,-(SP)“ in „PEA 2“ oder „MOVE.L A0,-(SP)“ in „PEA (A0)“. Zwar handelt es sich bei diesen Optimierungen um Spitzfindigkeiten, die aber immerhin noch ein paar Taktzyklen sparen, was bei wirklich zeitkritischen Aufgaben durchaus von Bedeutung sein kann. Schließlich programmiert man ja gerade deshalb in Assembler, um das letzte Quäntchen an Geschwindigkeit aus dem Prozessor herauszukitzeln. Während des Assemblies Vorgangs können die verschiedenen Arten der Optimierung an jeder Stelle ein- und ausgeschaltet werden. Es ist also möglich, bestimmte Quelltextbereiche gezielt ohne Optimierungen zu assemblieren und so für eine 1:1 Übersetzung zu sorgen. Dieses Vorgehen kann sich beispielsweise für den Zugriff auf bestimmte Hardware-Adressen als notwendig erweisen. Hier ist ein „CLR.W“ nicht immer einem „MOVE.W #0“ gleichwertig.

Aufruf per Kommandozeile

Der Assembler kann auf zwei Arten aufgerufen werden, nämlich mit und ohne Parameter. Wird dem Programm beim Start keine Kommandozeile übergeben, wartet der Assembler auf die Eingabe eines Dateinamens. Alle Direktiven, die der Steuerung des Übersetzungsvorgangs dienen, können nun direkt per Hand eingegeben werden oder befinden sich bereits innerhalb der Quelltextdatei. Häufig ist es wünschenswert, gewisse Einstellungen extern, also über eine Kommandozeile, vorzunehmen. Dies wird vom EASY RIDER-Assembler zwar unterstützt, allerdings besteht keine Möglichkeit, eine Kommandodatei zu spezifizieren, in der alle benötigten Konfigurationskommandos untergebracht werden könnten. Behelfen kann man sich hier jedoch durch den Trick, innerhalb der Kommandozeile eine Include-Datei anzugeben, über die dann eine Datei nachgeladen wird, die alle diejenigen Kommandos enthält, mit der der Assembler und der eingebaute Linker konfiguriert werden sollen.

Ein ungewöhnliches Leistungsmerkmal des Assemblers besieht darin, Syntaxfehler im Assembler-Quelltext im Verlauf der Assemblierung korrigieren zu können, ohne daß also ein Editor aufgerufen werden muß. Beim Auftreten eines Fehlers erscheint die fehlerhafte Befehlszeile in der Anzeige und kann editiert werden. Anschließend läßt sich die Assemblierung fortsetzen. Überden eingebauten Listing-Generator kann man nach erfolgter Assemblierung alle aufgetretenen Fehler in eine Datei schreiben lassen. Diese läßt sich anschließend zusammen mit dem Quelltext in einen Editor laden, wo den Fehlem zu Leibe gerückt werden kann.

Integrierter Linker

Die Vorgehensweise beim Assemblieren eines Programms zerfällt eigentlich in zwei Teile. Zunächst muß der Quelltext assembliert, anschließend zusätzlich noch gelinkt werden. Bei diesem Vorgang werden Programme, die sich aus mehreren Objektmodulen zusammensetzen, zu einem Ganzen zusammengefügt. Darüber hinaus werden Tabellen zur Adreßumrechnung an das fertige Programm angefügt, damit dieses später an jeder Adresse des Hauptspeichers lauffähig ist. Da diese Operation auch dann notwendig ist, wenn ein Programm lediglich aus einem einzigen Quelltext-Modul besteht, kann auf den Link-Vorgang grundsätzlich nicht verzichtet werden.

Der EASY RIDER-Assembler besitzt einen eingebauten Linker, so daß das Assemblieren und Linken eines Quelltextes zeitsparend in einem Arbeitsschritt durchgeführt werden kann. Der Linker versteht es, sowohl mit Objektdateien im DR- als auch im GST-Format umzugehen. Wer Assembler in Verbindung mit TURBO C oder Pure C nutzt, kann eventuell davon profitieren, daß der EASY RIDER-Linker das Einbinden von Objektbibliotheken dieses Compilers unterstützt.

Was das Einbinden von Daten betrifft, so können während des Assemblierens Include-Dateien in Form von Quelltexten eingebunden werden. In vielen Fällen wird es sich um Dateien handeln, die Definitionen beispielsweise von Systemvariablen oder Makros beinhalten. Auch Objektdateien können über eine include-Anweisung in das endgültige Programm integriert werden. EASY RIDER erkennt automatisch, ob eine Include-Datei für den Assembler gedacht ist, also zunächst noch assembliert werden muß, oder ob es sich um eine Objektdatei handelt, um die sich nur noch der Linker zu kümmern hat.

Kompatibilität

Assembler ist nicht gleich Assembler. Man sollte zwar meinen, daß es auf der niedrigsten Ebene der Programmierung keine Zweideutigkeiten geben dürfte, was die Übersetzung von Befehle betrifft, aber ganz so ist es leider nicht. Zwar erzeugen alle Assembler bei abgeschalteter Optimierung denselben Code, nicht kompatibel sind aber in vielen Fällen die Assembler-Direktiven sowie die Behandlung von Symbolen. Was die Art der Direktiven betrifft, bestehen Unterschiede zwischen einzelnen Assemblern in der Regel nur in einer leicht abweichenden Syntax. Wer einen bereits bestehenden Quelltext an EASY RIDER anpassen will, dürfte hier im Falle eines Falles über die von jedem Editor zur Verfügung gestellten Funktionen zum Suchen und Ersetzen schnell eine Source-Datei erhalten, die vom Syntax-Standpunkt her vom EASY RIDER-Assembler akzeptiert wird. Da EASY RIDER lokale Labels mit einem begrenzten Geltungsbereich unterstützt (solche Labels beginnen wie bei manchen anderen Assembler mit einem Punkt), lassen sich auch Quelltexte, die beispielsweise für den MADMAC-Assembler erstellt wurden, relativ einfach anpassen. Verweise auf Symbole, die innerhalb eines Quelltext-Moduls nicht aufgelöst werden können, werden automatisch als extern deklariert, so daß man nicht gezwungen ist, diese explizit als solche zu deklarieren, was gerade bei größeren mehrteiligen Quelltexten zu einer äußerst unangenehmen Arbeit ausartet.

Es läßt sich also festhalten, daß Quelltexte anderer Assembler mit vertretbarem Aufwand an EASY RIDER angepaßt werden können, was den Umstieg auf diesen Assembler erleichtert.

Auch Daten wollen bearbeitet sein

Praxistest

Der EASY RIDER Assembler durfte sich an diversen Quelltexten unterschiedlichen Umfangs versuchen. Darunter waren sowohl Quellen, die ausschließlich Befehle des MC68000 enthielten, als auch TT-spezifische Software. Was die Umsetzung der erweiterten Adressierungsarten des 68030 angeht, konnte dem EASY-Assembler ein fehlerloses Arbeiten bescheinigt werden. Auch Programme kleineren Umfangs, die Gebrauch von der PMMU des 68030 sowie dem Fließkomma-Coprozessor des TT machten, ließen sich korrekt übersetzen. Im Rahmen dieses Tests wurde unter anderem die Textverarbeitung WORDPLUS zunächst mit dem EASY RIDER Reassembler reassembliert und anschließend der so erhaltene Quelltext mit dem Assembler unter Berücksichtigung aller möglichen Optimierungen assembliert. Nach dieser kleinen Schönheitsoperation war WORDPLUS um einige KByte abgemagert, was der Funktionsfähigkeit jedoch keinen Abbruch tat. Eine Assemblierung ohne Optimierungen führte übrigens exakt zu der Programmdatei, wie sie im Original vorliegt.

Hinsichtlich der Arbeitsgeschwindigkeit schneidet der EASY RIDER-Assembler sehr gut ab Im Vergleich mit dem MAD-MAC-Assembler konnte ein deutlicher Geschwindigkeitsgewinn ausgemacht werden. Lediglich bei eingeschalteter Optimierung der Vorwärtsprünge dauert der Assemblier-Vorgang länger, da in diesem Fall ein einziger Durchlauf nicht genügt, um optimalen Code zu erzeugen. Der Link-Vorgang verläuft ebenfalls sehr rasch, so daß sich EASY RIDER auch durchaus sinnvoll als Linker einsetzen läßt.

... zum zweiten...

Wie bereits der EASY RIDER-Reassembler, arbeitet auch der Assembler sehr zuverlässig. Allerdings wurde auch hier auf saubere Programmierung nur wenig Wert gelegt. So modifiziert der Assembler während der Programmausführung seinen eigenen Programmcode und macht auch vor direkten Bildschirmzugriffen nicht halt. Da das nicht GEM-unterstützte Programm nach dem Start auf die hohe ST-Auflösung umschaltet, läßt es sich in Verbindung mit vielen Grafikkarten nicht sinnvoll einsetzen, da in solchen Fällen auf dem sichtbaren Bildschirm keine Anzeigen erfolgen. Man hat somit keine Kontrolle über den Verlauf des Assemblier-Vorgangs. Insbesondere beim Auftreten von Fehlern tappt man im Dunkeln. Bei einem Programm, das aufgrund seiner Leistungsmerkmale insbesondere für TT-Besitzer interessant ist, dürfen solche Effekte heutzutage nicht mehr auftreten.

... und zum dritten

Nun, da es sich laut Adam Riese beim EASY RIDER Reassembler und Assembler nur um zwei Produkte handelt, kommen wir doch gleich zum Fazit. Mit EASY RIDER und Easy-Assembler zwei aufeinander abgestimmte Programme für den 68030/68882 Assembler-Programmierer auf den Markt zu bringen, ist eine interessante Idee. Beide Programme arbeiteten in der Testphase tadellos und mit hoher Geschwindigkeit. Kritikpunkte erntet ledig lieh die wenig ausgereifte Oberfläche, die mit dem neuen Entwicklungen auf dem Atari-Sektor nicht Schritt gehalten hat. Hier besteht für die Zukunft noch Handlungsbedarf. Die mitgelieferte Dokumentation ist zwar durchaus ausreichend, könnte aber übersichtlicher gestaltet sein. Ein Indexregister täte hier dringend Not. Positiv aufgefallen ist während der Testphase die ausgezeichnete Produktbetreuung von Seiten des Programmautors.

Assembler und Reassembler sind sowohl im Paket für 425,- als auch einzeln für 199,- (Assembler) sowie 249,- (Reassembler) erhältlich. Im Lieferumfang des Assemblers ist übrigens der TEMPUS-Text-Editor in der Version 1.11 enthalten. Wer noch keinen Assembler oder Reassembler besitzt, oder wem sein bisheriger Assembler zu langsam ist, der sollte das EASY RIDER-Paket in die engere Wahl ziehen.

US

Bezugsadresse:

Andreas Borchard
Wiesenbachstraße 2a
W-4500 Osnabrück

L0063:JMP       ([L0058])
LO064:MOVE.W    #$200,D0
      BTST      #3,9(A6)
      BNE.S     L0065
      MOVE.W    16(A6),D1
      MOVE.W    (L00BE,D1.W*2),D0
L0065:MULU      -2(A6),D0
      LSR.L     #2,D0
      SUBQ.L    41,D0
L0066:MOVE.L    (A0)+,(A1)+
      DBF       D0,L0066
      RTS
      DC.B      'XBRASWAP'
L0067:DS.W      2,0
L0068:MOVE.W    4(A7),-(A7)
      MOVE.W    6(A7),-(A7)
      JSR       ([L0067])
      ADDQ.L    42,A7
      MOVE.W    (A7)+,D2
      TST.L     D0
      BEQ.S     L0069
      MOVEA.L   D0,A0
      MOVE.W    (A0),(L00BE,D2.W*2)
      MOVE.L    L0005(PC),D1
      DIVU      (A0),D1
      MOVE.W    D1,(L00BD.D2.W2)
L0069:RTS

Ausschnitt aus einem reassemblierten Quelitext


Uwe Seimet
Aus: ST-Computer 03 / 1992, Seite 44

Links

Copyright-Bestimmungen: siehe Über diese Seite