Grundlagen

Assembler ist nicht Maschinensprache

C64 Studio, AMCE & TASM

Beginnen wir mit der Unterscheidung zwischen Maschinensprache und Assembler.
Wie ihr an vielen Buchtiteln zum Thema Assembler (z. B. „Alles über Maschinensprache“ von Markt & Technik) seht, werden die Begriffe Maschinensprache und Assembler häufig gleichgestellt. Wenn man es ganz genau nimmt, ist dies aber nicht wirklich korrekt.

Maschinensprache

Das Einzige, was die Maschine (unser C64) versteht, ist eigentlich nur, Strom an (wird durch eine 1 symbolisiert) und aus (was einer 0 entspricht). Damit ist natürlich nicht der Hauptschalter gemeint. Die Bausteine in eurem Rechner enthalten Abertausende kleine Schalter, die sog. Transistoren. Diese lassen sich einzeln, an- und ausschalten. Somit ist die reine Maschinensprache nichts anderes, als eine riesige Abfolge von Nullen und Einsen!
Wie ihr euch sicher denken könnt, ist eine „unendliche“ Reihe von Nullen und Einsen, sehr schwer zu lesen und wenn man damit arbeiten muss äußerst Fehleranfällig. Daher werden diese, wie bereits unter Zahlensysteme erwähnt, zu logischen Gruppen zusammengefasst. Da der C64 ein 8-BIT-Rechner ist, sind es dort bevorzugt BYTES. Es sind aber auch größere Gruppen möglich, z. B. ein 16-Bit WORD, für Adressen. Jedes BYTE im Speicher des C64, steht entweder für einen Befehl oder für Daten.

Assembler

Da das direkte Programmieren mit einzelnen BYTES äußerst schwer und fehleranfällig ist, hat man sich eine Programmiersprache, mit leicht zu merkenden Kürzeln (die sog. Mnemonics) für die einzelnen Bytecodes ausgedacht. Diese Sprache wird Assembler genannt.
Als Assembler (to assemble = zusammenbauen) wird allerdings auch das Programm bezeichnet, dass diese Kürzel wieder in die für den Rechner verständlichen Bytecodes umwandelt. Diese Umwandlung (Programmerstellung) wird assemblieren genannt. Übrigens: Auch wenn man es häufig liest, diesen Vorgang als Kompilieren zu bezeichnen, ist in Verbindung mit Assembler falsch.

Unser fertig assembliertes Programm ist dann ein direkt ausführbares Maschinenspracheprogramm. Jetzt mögt ihr euch fragen, wo denn der Unterschied zu BASIC, C oder Pascal ist? Auch diese müssen doch letztendlich wieder in Maschinensprache übersetzt werden, sonst könnte der Computer mit ihnen nichts anfangen. Die drei sind sogenannte Hochsprachen, d. h. sie bieten fertige Routinen (z. B. PRINT) um die gewünschte Aufgabe zu erfüllen. Das macht die Programmierung um einiges leichter, die Routinen aber auch langsam, da sie viele Möglichkeiten abdecken müssen, auch wenn wir diese evtl. überhaupt nicht benötigen. Unter Assembler können wir, nein wir müssen sogar (sofern wir nicht auf Betriebssystemfunktionen zurückgreifen), alles von grundauf neu entwickeln. Das macht zwar mehr Arbeit, aber es erlaubt uns das Maximum aus dem Rechner herauszuholen, da wir jedes Byte selbst festlegen.

Schauen wir uns ein letztes Mal (das stimmt nicht ganz, wie wir später noch sehen werden) ein BASIC Programm an und vergleichen dieses dann mit der entsprechenden Assembler-Version.

10 FOR I=1278 TO 1024 STEP -1
20 POKE I,65
30 NEXT I

Die BASIC-Version

Wenn ihr das Programm startet, seht ihr wie 255 mal das -Zeichen ausgegeben wird.
Man kann direkt zusehen, wie jedes einzelne Zeichen auf dem Bildschirm landet, das Ganze dauert ca. 1,5 Sekunden. Dass das so langsam ist liegt auch daran, dass BASIC eine Interpretersprache (im Gegensatz zu C oder Pascal, dies sind CompilerspracheninfoCompilersprachenHier wird der Quellcode (ähnlich wie beim Assembler) vom sog. Compiler (engl. to compile = erstellen) wieder in die Bytecodes verwandelt. Dies geschieht nur einmal und man erhält ein ausführbares Maschienenprogramm.) ist. Beim Interpreter wird jede Befehlszeile in dem Moment untersucht und in Maschinensprache verwandelt, in dem sie an der Reihe ist. Wenn Zeilen durch eine Schleife immer wieder ausgeführt werden, dann müssen diese jedes Mal aufs Neue untersucht und in Maschinensprache umgewandelt werden!

Nun setzen wir dieses Programm in Assembler um. Dass ihr das Programm noch nicht versteht, ist nicht weiter schlimm, es geht hier nur um den Vergleich zu BASIC.

Startet jetzt euren Assembler-Editor. Eine kleine Einführung zum C64 Studio, ACME und dem Turbo Assembler direkt auf dem C64, findet ihr im Beitrag: Benötigte Tools.

Gebt nun folgende Zeilen ein. Dies ist der sog. Quelltext oder Sourcecode (häufig auch einfach nur Source genannt), aus dem der Assembler das eigentliche Maschinenspracheprogramm erstellt.

Nachdem ihr das Programm eingegeben habt, müssen wir es noch erstellen und starten.

  • C64 Studio: Ihr braucht nur F5 drücken, damit das Programm erzeugt und mit dem gewünschten Emulator gestartet wird.
  • ACME: Hier hängt es davon ab, wie ihr ACME verwendet. Ich gehe davon aus, dass ihr die Kombination ACME + Relaunch64 verwendet. In dem Fall reicht auch hier ein Druck auf F5, wenn ihr alles richtig eingerichtet habt.
  • Turbo Assembler: Falls ihr direkt auf dem C64, mit Turbo Assembler arbeitet, denkt daran, dass es statt !byte .byte heißen muss! Außerdem kann man nicht über das Zeilenende hinausschreiben, also müsst ihr die Bytes auf drei Zeilen verteilen.
    Turbo Assembler – Der Source

    Ihr solltet beim direkten Arbeiten auf dem C64, unbedingt vor dem ersten Start speichern!!!
    Folgt nun einfach diesen Schritten, um das Programm zu starten:

    • Drückt gefolgt von 3.

      Turbo Assembler – Assemblierung erfolgreich
    • Drückt nach erfolgreicher Assemblierung auf keinen Fall S, sonst kommt es zum Absturz! Betätigt eine beliebige andere Taste, z. B. SPACE, um zum Sourcecode zurück zu gelangen.
    • Drückt und anschließend die 1, um ins BASIC zu springen.

      Turbo Assembler – Ihr seid jetzt wieder im BASIC!
    • Gebt RUN ein.
      Da der Turbo Assembler auf Kleinbuchstaben umschaltet, seht ihr lauter As, statt !

      Turbo Assembler – Wo sind die Pik-Symbole?

      Gebt POKE 53272,21 ein und schon erhalten wir die gewünschte Anzeige.

      Turbo Assembler – Da sind die Pik-Symbole wieder.
    • Um zurück zum Turbo Assembler zu gelangen, drückt RESTORE.

      So ausführlich wie hier, werde ich die Schritte für den Turbo Assembler in Zukunft nicht mehr beschreiben! Falls etwas unklar ist, schaut bitte beim Beitrag zum Turbo Assembler vorbei.

Wenn alles korrekt war, sollten auch hier 255 -Zeichen erscheinen.

Die Assembler-Version.

Das Assemblerprogramm läuft dabei aber so schnell, dass ihr überhaupt nicht mitbekommt, wie die einzelnen Pik-Symbole auf dem Bildschirm landen, sie sind einfach da.

Hier habt ihr nun einen der Vorzüge von Assembler selbst erfahren, es ist bis zu 1000 mal schneller als BASIC. Unser eigentliches Programm (alles hinter der !BYTE $0B... Zeile) benötigt nur ca. 0,0026 Sek. und belegt lediglich 11 Bytes im Speicher. Das ist der nächste große Vorteil von Assembler, es erlaubt das Erstellen von sehr kompakten, speicherplatzsparenden Programmen.

Schauen wir uns jetzt erstmal grob den internen Aufbau des C64 an und beschäftigen uns dann, in einem Assembler-Tutorial, mit den einzelnen Assembler-Befehlen (Mnemonics). Diese Befehle sind übrigens nicht nur für die 6510 CPU (Central Processing Unit = Prozessor) im C64 gültig, sondern auch für andere 8-Bitter mit dem 6502 (z. B. Apple II, Atari 800 XL), sogar fürs VCS 2600 kann man diese Befehle gebrauchen, obwohl dort ein 6507 verbaut wurde. Der 6510 ist eine Abwandlung vom 6502, einer damals sehr verbreiteten CPU, auf die wirklich minimalen Unterschiede kommen wir an geeigneter Stelle zu sprechen.

Dann schauen wir mal, was unter der Haube des C64 so passiert…


Schrott!!Naja...Geht so...Ganz gut...SUPER! (13 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


ZurückWeiter

8 Gedanken zu „Grundlagen“

  1. Hallo,
    ich benutze Linux mit Eclipse, ACME und Vice. Wichtig war für mich, das vor dem BYTE Befehl ein Ausrufezeichen kommt. Also so „!BYTE“.
    Sonst funktioniert das nicht und man wundert sich Stundenlang.
    Ansonsten super!

      1. Ich hätte gerne die Syntax vom CBMPrgStudio. Muß ich dazu einen anderen Compiler verwenden? Wenn ja, welchen denn? KickAss oder Tass?

        Ich war schon froh, das so hinbekommen zu haben. 😉

        1. Dazu brauchst du das CBM prg Studio und das gibt es nur für Windows.
          Es verwendet eine eigene Syntax, die mit keinem anderen Assembler kompatibel ist (auch wenn es teilweise Überschneidungen gibt).

          Ich würde dir raten, bei ACME zu bleiben und „Vom CBM prg Studio zum C64 Studio“ zu Rate zu ziehen.
          Die Mnemonics sind ja nicht das Problem, die Assembler unterscheiden sich bei den Directiven (BYTE, WORD, TEXT, FOR, usw.).
          Bis auf kleine Unterschiede, kannst du das Tutorial also auch damit durchziehen.

          Ich habe mich vor fast drei Jahren entschieden, in Zukunft das C64 Studio zu nutzen (wie erwähnt verwendet es die ACME Syntax), daher sind neuere Beiträge mit ACME kompatibel.

  2. Hallo,
    ich habe mir nun CBM prg Studio in der Version 3.2.1 heruntergeladen und installiert ( Win 7, 64Bit ).
    Das Problem ist, das im Programmierfenster die obersten Zeilen (Zeile 1 und 2) nicht angezeigt werden. Die beiden Zeilen verschwinden sozusagen unter der oberen Menüleiste!

    Kennt jemand dieses Problem? Was kann man dagegen tun?

    1. Moin,
      ich habe das CBM prg Studio auch auf mehreren Rechnern laufen (Win 7 & 8 jeweils 64Bit), so ein Problem ist mir bisher nicht begegnet.

      Hast du evtl. eine eher ungewöhnliche Auflösung oder etwas wie die Windows-Skalierung aktiv?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam