Bedingte Sprünge und Schleifen

Aus CBMPET.DE

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Rotieren und Springen

Auf in die erste Praxis

Da wir nun schon einige Befehle kennengelernt haben, können wir uns an die ersten Beipiele wagen. Wie man im ROM-Listing sehr schön feststellen kann, handelt es sich um bsout =$ffd2 um eine Routine zur Ausgabe eines Zeichens. Da der String "HELLO WORLD!" aus 12 Zeichen besteht, wird diese Routine auch dementsprechend oft aufgerufen. Hierz wird der Inkrementier-Befehle: INX zum Erhöhen des X-Register-Wertes und ein bedingter Sprungbefehl BNE verwendet.
Es gibt natürlich ebenfalls einen Befehl zum Inkrementieren des Y-Registers: INY und jeweilige Gegenstücke zum Dekrementieren: DEX und DEY. Mit RTS ( ReTurn from Subroutine ) wird das Programm beendet. Dieser Befehl entspricht dem Basic-Befehl RETURN.
Ein Blick auf den Quelltext des Programms:


 !to"hello.prg",cbm

   bsout = $ffd2 

  *=$1000
 
      LDX #$00           ; X-Register mit Null laden
  l0: LDA hw,x           ; Akkumulator mit Zeichen aus hw,X laden         <-----. 
      JSR bsout          ; und per bsout ausgeben                               | 
      INX                ; X inkrementieren                                     | --- Die Schleife
      CPX #$0c           ; sind es schon 12 = #$0c Zeichen ?                    | 
      BNE  l0            ; wenn nicht, Sprung nach l0:                     -----
      RTS                ; Ende und Rücksprung

  hw: !tx "HELLO WORLD!"     ; unser Text

Ein weiteres Experiment

Ein Basic-Prgramm mit einer Schleife, das die Zahlen 0-9 auf dem Bildschirm ausgibt:

    10 FOR A = 0 TO 9
    20 PRINT A;
    30 NEXT A     

Eine zweite Version die einem Assembler-Quelltext optisch ähnlicher sieht.

     5 A=0
    10 PRINT A;
    20 A=A+1
    30 IF A=10 THEN END
    40 GOTO 10

Im diesem zweiten Beispiel erkennt man das Inkrementieren von A, auch wenn es so kein guter Stil ist.



 !to"zahlen.prg",cbm

   bsout = $ffd2 

  *=$1000
 
       LDX #$00           ; X-Register mit Null laden
l0:    LDA #$20           ; Bildschirmcode für ein Leerzeichen               <---.     
       JSR bsout          ; und per bsout ausgeben                               | 
       TXA                ; Das X-Register in den Akkumulator transferieren      |
       CLC                ; das Carry-Flag löschen                               |
       ADC #$30           ; Zahlenwert auf Bildschirmcode addieren               |
       JSR bsout          ; und per bsout ausgeben                               | 
       LDA #$20           ; Bildschirmcode für ein Leerzeichen                   | 
       JSR bsout          ; und per bsout ausgeben                               | 
       INX                ; X inkrementieren                                     | --- Die Schleife
       CPX #$0a           ; sind es schon 10 = #$0a Zeichen ?                    | 
       BNE l0             ; wenn nicht, Sprung nach l0:   -----------------------^
       RTS                ; Ende und Rücksprung
    

Hier nun eine Lösung in Assembler. Wir bedienen uns hier eines kleinen Tricks, damit aus den Zahlenwerten im X-Register Bildschirmcodes werden. Um die Zahlen 0-9 in Folge darzustellen, muss man nur 48 (hex. #$30) addieren. Um auf die gleichen Abstände mit Leerzeichen zu kommen, werden jeweils Leerzeichen eingefügt. Um den Wert aus dem X-Register aufaddieren und per bsout ausgeben zu können, muss dieser vorab in den Akkumulator transferiert werden. Das geschieht mit dem Transferbefehl TXA.
Wie das Kürzel vermuten lässt, nennt sich dieser Mnemonic "Transfer X-Register to Akkumulator".
Bei jedem Durchlauf wird per INX das X-Register erhöht, mit CPX auf zehn Zeichen geprüft und danach per BNE der bedingte Sprung ausgeführt. BNE bedeutet "Branch if not equal", in Deutsch: "Springe wenn die Bedingung nicht erfüllt ist". Solange also CPX noch nicht den Wert 10 (#$0a) feststellen konnte, wird BNE nach l0: springen.
Auf den ersten Blick wirkt dieses Assembler-Listing gegenüber dem Basic-Programm sehr lang. Wenn man aber mal wirklich überprüfen würde, welche Wege das Basic-Programm im Basic-Interpreter zurücklegen muss, um den kurzen Code umzusetzen, wird man genau das Gegenteil feststellen. Deshalb wirkt es beim Basic auch wie Aufstellen der Zahlen und das Assembler-Programm lässt dasselbe spontan erscheinen.


Eine Aufgabe

Gib die Buchstaben A-Z mit einem Leerzeichen Zwischenraum in Reihen auf dem Bildschirm aus.

Die Lösung befindet sich im Anhang des Kurses unter Lösungen. Nicht schummeln. ;-)

Persönliche Werkzeuge