Assembler für Einsteiger - Teil 1 ----------------------------------- von Tim-Philipp Müller WICHTIG: ., steht im Text für das Semikolon Dieser Kurs soll eine Alternative zur 'Assembler- Ecke' darstellen, und ist für alle gedacht, die sich gerade erst einen Assembler gekauft haben, oder nach Lesen dieses Artikels zum Telefon wetzen und bei Play it! zuschlagen. Die Assemblerlistings, auch Sourcecode oder Quellcode genannt, wurden alle mit dem BIBO-Assembler geschrieben, den ich jedem empfehlen kann (der Atmas-II ist vielleicht ein guter Anfang, wird bei längeren Programmen aber doch sehr kompiziert zu handhaben. Außerdem kann weder auf Disk assembliert werden, noch können Include-Files verwendet werden). Trotzdem liegen Listings in beiden Formaten auf der Diskette vor. Grundlagen, wie der Umgang mit seinem Assembler, BASIC- Erfahrung, und Umgang mit Hexadezimal- sowie Binär- Zahlen, setze ich voraus. Außerdem sollte man wissen, was ein Byte, ein Bit und ein Word ist. Bei Bedarf wird das aber natürlich auch nocheinmal erklärt werden. So, nun unser erstes Listing: 00010 ., 00020 ., Listing Nummer 1 00030 ., 00040 .OR $4000 00050 ., 00060 LDA #15 .,weißer 00070 STA 712 .,Rahmen 00080 LOOP JMP LOOP .,Endlos- 00090 ., Schleife Wie jede andere Sprache besteht auch Assembler aus Vokabeln. Eine davon ist der Strichpunkt in den Zeilen 10-30. Er entspricht dem Basic- Befehl 'REM', und bedeutet, daß alles dahinter Stehende nur für uns, nicht aber für den Compy interessant ist. Der Befehl in Zeile 40 ist für BASIC- Programmierer etwas ungewohnt, ist aber auch nur eine Vokabel, die dem Computer sinngemäß sagt "hier geht's los!". In BASIC brauchen Sie sich nicht darum zu kümmern, wo im RAM Ihr Programm liegt. Darum kümmert sich das BASIC selbst (und sollte Sie irgendjemand Sie einmal fragen, was der Vorteil einer so genannten Hochsprache wie BASIC ist, nun das ist einer davon). In Assembler geht es mehr ums Detail. Der Programmierer muß immer wissen, wo er sein Programm hinlegt, und welche Speicherzellen es verwendet. Beim BIBO- Assembler sollte man die Startadresse erstmal auf $4000 legen, dann hat man anfangs genug Speicher auch für längere Programme. Damit Sie sehen, daß Assembler wirklich keine Hexerei ist, hier das Listing in BASIC: 10 A=15 20 POKE 712,A 30 GOTO 30 Verblüffend ähnlich, oder? LDA ist eine weitere Vokabel, oder wie Assemblerspezialisten auch sagen, ein OPCODE (das ist die Abkürzung für OPeration CODE). LDA heißt nichts anderes als LOAD, also lade. Jetzt ist nur noch die Frage, was und wohin. Das Was ist leicht erklärt, es ist der Wert 15, der rechts daneben steht. Das Wohin dauert etwas länger: Jeder Computer besteht bekanntlich aus einzelnen Speicherstellen. Wie gehen Sie vor, wenn Sie mit dem Taschen- Rechner 3+4 errechnen wollen. Zuerst 'laden' Sie 3 aufs Display. Dann werden 4 addiert und das Ergebnis im Display abgelegt. So wie beim Taschenrechner alle Rechen- Optionen über das Display abgewickelt werden, so operiert der Computer ebenfalls über ein 'Display', nämlich ein Register, daß 8 Bits umfaßt und AKKU (Abkürzung für AKKUMULATOR) genannt wird. LDA heißt also, daß der ATARI irgend- etwas in den Akku laden soll. Warum ich die Zahl 15 genommen habe, kommt nachher. Das '#'- Zeichen vor der 15 bedeutet: Nimm den WERT 15. Würde nur 'LDA 15' stehen, wird der WERT IN DER SPEICHERSTELLE NR.15 genommen (in BASIC also 'A=PEEK(15)'). Vergleichen Sie mit BASIC. Dieser Teil der Zeile wird übrigens OPERAND genannt, und es fehlt nur noch der rechte Teil zur Erklärung. Er heißt KOMMENTAR, und das ist er auch. Als erste und wichtigste Regel für jeden Assembler- Programmierer gilt: SCHREIBEN SIE KOMMENTARE ! Lieber zuviel (obwohl das eigentlich gar nicht möglich ist) als zuwenig. Glauben Sie mir, nichts ist so unüber- sichtlich wie ein 24 Stunden altes Assemblerlisting. Zeile 70 ('STA 712') ist auch leicht zu verstehen, wenn man erstmal kapiert hat, daß STA nichts anderes als STORE Akku bedeutet, auf gut deutsch also: "Gib irgendetwas irgendwohin". Das Irgendetwas kennen wir ja bereits, es ist der Wert 15, den wir vorher in den Akku geladen haben. Jetzt geben wir also den Inhalt des Akku in die Speicherzelle 712 (der Wert 15 bleibt aber auch im Akku). Die Adresse 712 bestimmt jetzt z.B. die Farbe des Rahmens (15 müßte ein helles Weiß ergeben). Damit wir endlich sehen, was unser Programm eigentlich macht, assemblieren wir es mit dem Befehl 'A.' im Bibo- Assembler (direkt- Einabe). Und jetzt hätte ich fast das Wichtigste vergessen: BEVOR SIE EIN ASSEMBLER- PROGRAMM LAUFEN LASSEN, SPEICHERN SIE ES! Niemand schreibt auf Anhieb fehlerfreie Assemblerprogramme! Und schon ein falsches Byte kann den Computer zum Absturz bringen! (Meistens hilft dann aber RESET, aber falls nicht, sind alle Daten futsch!). Also, erst das Programm sichern (z.B. mit SAV"D:PRG1.ASM"). Jetzt lassen wir uns mit 'A:' (direkt eingeben) das Programm assemblieren. Nun müßte erscheinen: Pass: 1 4000(4000)-4007(4007) Pass: 2 00010 ., 00020 ., Listing Nr.1 00030 ., 00040 .OR $4000 00050 ., 4002: A9 0F 00060 LDA #15 4002: 8D C8 02 00060 STA 712 4005: 4C 05 40 00070 LOOP JMP LOOP Symbol table: ------------- 4005: LOOP Also, unser Programm braucht 8 Bytes, und liegt von Adresse $4000 bis $4007 im Speicher. Weiterhin wird angezeigt, wie der Computer die Befehle übersetzt (z.B. $A9 = LDA #n). Darunter steht, daß sich der Programmteil ab LOOP ab $4005 befindet. In Zeile 70 taucht jetzt noch der Befehl 'JMP', die Abkürzung für JUMP, also springe, auf. Und hier sieht man gleich wieder ein weiteres Plus von Assembler: Man (und frau) springt nicht mehr zu Zeilennummern, sondern zu Adressen. Da es allerdings ziemlich unübersichtlich wäre, z.B. JMP $4005 einzugeben, kann man Adressen durch so genannte 'LABELS' ersetzen. Der Assembler rechnet dann aus, an welcher Adresse sich das Label befindet, und setzt es in den Object- Code ein. (Objectcode nennt man die Daten, in die der Computer unser Programm umwandelt.) 'JMP' entspricht also dem klassischem 'GOTO' in BASIC. Nun gibt es noch einen weiteren Befehl,nämlich 'JSR' für Jump SubRoutine, der das 'GOSUB' ersetzt. Anstatt eines BASIC-'RETURN' schreibt man in Assembler am Ende eines Unter- Programms 'RTS' (ReTurn Subroutine). Wer in seinem schlauen Buch unter der Adresse 712 nachschaut, der wird sehen, daß ATARI diese Adresse 'COLOR4' genannt hat. Also gut, schreiben wir das Programm etwas übersichtlicher: 00010 .LI OFF 00020 .OR $4000 00030 ., 00040 COLOR4=712 00050 ., 00060 LDA #15 weißer 00070 STA COLOR4 Rahmen 00080 LOOP JMP LOOP Endlos- 00090 ., Schleife Wir sagen dem Computer nun also, er soll anstatt COLOR4 immer die Adresse 712 einsetzen. Wenn Sie 'SYM' eingeben, werden Sie auch feststellen, daß der Compy die Adresse vom Label LOOP eben- falls ausgerechnet hat: $4005. Nun gut, assemblieren wir das Programm. Ist Ihnen etwas aufgefallen? Der ganze Kram nach 'Pass: 2' erscheint nicht mehr. Das ist auf den Befehl in Zeile 10 (.LI OFF) zurückzuführen. Okay, starten wir das Programm und geben 'RUN $4000' ein. Jetzt wird der Rahmen des Bildschirms weiß, und nichts weiter geschieht. Mit Druck auf BREAK gelangt man zum Assembler zurück. Es erscheint: *** BREAK *** 4005: 0F 00 00 FB

20 Das bedeutet, das Programm wurde an Adresse $4005 abgebrochen (LOOP). Im Akku befindet sich der Wert $0F=15. Der Rest interessiert uns erst in der nächsten Folge. Sie brauchen übrigens nicht traurig sein, wenn die Werte hinter und

nicht mit den hier angegebenen überein- stimmen. Nochmal die Zusammenfassung: LoaD Akku LDA STore Akku STA REGISTER 709 = $2C5 = COLOR0 Gibt in Graphics-0 die Helligkeit der Schrift an. REGISTER 710 = $2C6 = COLOR1 Gibt in Gr.0 die Hintergrundfarbe an. REGISTER 712 = $2C8 = COLOR4 Gibt in Gr.0 die Rahmenfarbe an. Schreiben Sie doch jetzt einmal ein Programm, das Rahmen und Schrift ganz schwarz einfärbt und die Schrift mit weißem Hintergrund unterlegt. (schwarz= Farbe 0, weißgrau= 12) 00010 .LI OFF 00020 .OR $4000 00030 ., 00040 COLOR1=709 Schriftfarbe 00050 COLOR2=710 Hintergrund 00060 COLOR4=712 Rahmenfarbe 00070 ., 00080 LDA #12 weiß 00090 STA COLOR1 00100 LDA #0 schwarz 00110 STA COLOR2 00120 LDA #0 schwarz 00130 STA COLOR4 00140 LOOP JMP LOOP endlos.. Haben Sie das geschrieben? Wenn ja, dann schauen Sie sich nochmal Zeile 100-130 etwas genauer an. Haben Sie es bemerkt? Den 'LDA #0'- Befehl in Zeile 120 kann man weglassen, da der Akku ja noch 'von vorher' (Zeile 100) den Wert 0 hat, und seitdem auch nicht geändet wurde. Nun noch eine Bemerkung zu den Farb- Registern ('Register'- so nennt man auch die Speicherzellen): Der Farbwert setzt sich aus der Formel farbe * 16 + helligkeit zusammen. farbe: 0 = Grau 8 = Blau 1 = Gold 9 = Hellblau 2 = Orange 10 = Türkis 3 = Rot 11 = Blaugrün 4 = Rosa 12 = Grün 5 = Violett 13 = Gelbgrün 6 = Purpur 14 = Orangegrün 7 = Blau 15 = Hellorange Helligkeit: 0 = dunkel 15 = hell Experimentieren Sie doch einmal ein bißchen herum. Good Byte bis zum nächsten Mal.