Erstellt: 1. Januar 2013 (zuletzt geändert: 28. November 2018)

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.

 *=$0801
 !byte $0c,$08,$e2,$07,$9e,$20,$32,$30,$36,$32,$00,$00,$00

 lda #$41
 ldx #$ff

loop
 sta $03ff,X
 dex
 bne loop
 rts

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! (21 Bewertungen | Ø 4,90 von 5 | 98,10%)

Loading...


ZurückWeiter

16 Gedanken zu „Grundlagen“

  1. Hallo Jörn,

    noch mal ich… Mein Problem hat sich erledigt und saß die ganze Zeit vor dem Monitor. Anstatt LDA #$0D habe ich LDA $0D verwendet.

    Ich schätze, das ist ein Klassiker… und an sowas sitze ich jetzt seit 2 Tagen 😀

    Danke für die tolle Seite im übrigen – ermuntert einen richtig, da mal reinzuschnuppern.

    1. Moin Harald,

      ja, das kommt häufiger vor, dass man die Raute vergisst. Richtig übel wird es, wenn an der Speicherstelle dann zufällig das Richtige steht und der Fehler sich erst viel später zeigt.

      Schön, dass dir die Seite gefällt.

      Gruß,
      Jörn

  2. Hallo Jörn,
    zufällig habe ich Interesse bekommen, ein wenig auf dem c64 zu programmieren, sowohl in Basic als auch in Assembler. Während ich mit Basic noch gut zurecht komme, beiße ich mir an einer “Kleinigkeit” gerade in ASM die Zähne aus.
    Eigentlich ist es ganz einfach: Ich habe ein Basic-Programm, mit dem ich 100 mal eine Zeile Text ausgebe und die Zeit messe. Ok.
    Jetzt möchte ich das ganze aber auch in Assembler umsetzen. Textausgeben geht – habe ich sowohl mit chrout (JSR $FFD2) als auch mit Schreiben in den Bildschirmspeicher probiert. Aber – ich scheitere am dämlichen CR – also dem Zeilenumbruch. Chrout scheint $0D als Steuercode nicht zu verarbeiten – aber es müsste doch eigentlich ein Zeilenumbruch irgendwie abrufbar sein. Spätestens nach 24 Zeilen müsste ich ja sonst den ganzen Bildschirminhalt per Hand eine Zeile höher schieben.
    Darum meine Frage: Gibt es für Chrout einen CR oder zumindest eine Cursor-Positionierung, die ich von Assembler aus abrufen kann?

  3. Liebe mates,
    ich hab ein Problem mit TMP in der REU version (kann man auch unter vice checken). Der Upstart nach dem schreiben eines object
    files mittels <=5 klappt zwar, aber leider klappt im Gegensatz zu der Nicht-REU Version (wo alles wunderbar so geht) der Wechsel zu Basic insofern nicht, als dass dort interessanterweise die upstart basic lines nicht zu finden sind. Hat jemand das auch schon beobachtet und weiss, warum das so ist und ob man das fixen kann. Ich moechte bewusst meinen Sohn mit diesem Assembler
    auf dem C64 arbeiten lassen und nicht auf kickassembler/vice wechseln fuer seinen Lerneffekt. Vielen herzlichen Dank!
    Stephan

  4. Hallo
    wie genau kann ich auf einem richtigen C64 damit arbeiten?

    Ist „Turbo Assambler eine separate Software die ich mir besorgen müsste oder ist die im C64 schon vorhanden?

    Ich entschuldige mich, falls dies schon irgendwo erwähnt ist und ich es nur übersehen habe

    MfG
    Nico

    1. Nabend Nico,

      du hast nichts übersehen.
      Ich wollte zwar etwas mehr zum Turbo Assembler schreiben, wird ja auch im Text erwähnt, schiebe das aber immer vor mir her.
      Nachdem ich letzten Monat endlich die Einführungen zu WinVice und dem C64 Studio geschafft habe, möchte deine Frage jetzt zum Anlass nehmen und in den nächsten Tagen endlich den erwähnten Beitrag zum Turbo Assembler schreiben.

      Um deine Frage noch kurz zu beantworten:
      Es handelt sich um ein separates C64 Programm. Der oben erwähnte Beitrag wird auch einen Download enthalten.

      Gruß,
      Jörn

  5. Hallo,

    erst mal vielen Dank für das tolle Tutorial und die viele Arbeit, die hineingeflossen ist!

    Ich habe versucht, das erste Assembler-Programm, das hier gezeigt wird, mit ACME unter Linux auf der Kommandozeile zu kompilieren und bin schier verzweifelt, weil es zwar kompilierte, nach dem Laden in VICE aber nichts passierte.
    Ich bin sogar zeitweilig auf den Kick Assembler umgestiegen, bis mir heute zufällig ein Retro-Magazin mit einem C64-ACME-Assembler-Tutorial in die Hand fiel, in dem des Rätsels Lösung stand: der Parameter “-f cbm”. Mehr Details hier: https://sourceforge.net/p/acme-crossass/code-0/HEAD/tree/trunk/docs/QuickRef.txt#l188

    Also falls jemand über das gleiche Problem stolpern sollte – so sieht ein unter Linux funktionierender ACME-Aufruf auf der CLI aus:

    “acme -f cbm -o acme.prg acme.asm”

  6. 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.

  7. 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