Magic Disk 64

home to index to text: MD9401-KURSE-ASSEMBLER_KURS_2_(TEIL_3).txt
          Assembler-Kurs Teil 3         
         -----------------------        

Diesmal geht es in unserem Kurs um die vergleichsbefehle und die bedingte Verzweigung. Dafür muß jedoch zunächst das Statusregister des Prozessors näher erklärt werden.
Dieses 8- Bit-Register bildet die Grundlage für die bedingte Verzweigung.
Die einzelnen Bits des Statusregisters nennt man Flaggen ( oder Flags) . Jeder dieser Flaggen kann direkt angesprochen oder abgefragt werden und wird automatisch gesetzt oder gelöscht.
Es existiern folgende Flaggen:
Bit 0 Carry-Flag: Dieses Flag wird ----- gesetzt, wenn ein " Übertrag" stattfindet. Wenn z. B. bei der Addition zweier 8- Bit-Zahlen das Ergebnis größer als 255($ FF) ist und nicht mehr in ein Byte paßt, dann wird das Carry-Bit gesetzt.
Bei der Subtraktion erfüllt das Carry-Bit eine entgegengesetzte Aufgabe. Hierbei ist das Carry-Bit zunächst gesetzt. Beim Subtrahieren zweier Zahlen kann selbstverständlich kein Überlauf stattfinden. Sollte das Ergebnis jedoch kleiner als null werden (" Unterlauf"), so wird das Carry-Flag gelöscht.
Bit 1 Zero-Flag: Dieses Bit ist gewöhn------ lich gelöscht. Wenn das Ergebnis einer Befehlsfolge aber Null ergibt, wird sie gesetzt.
Bit 2 IRQ-Flag: Sie ermöglicht oder ver------ hindert Interrupts. Sie spielt in den späteren Kursteilen eine größere Rolle.
Bit 3 Dezimal-Flag: Von ihr hängt es ab,----- ob eine Rechenoperation im Dezimalmodus ausgeführt wird.
Normalerweise ist dieses Bit gelöscht und alle Rechnungen werden binär ausgeführt.
Bit 4 Break-Flag: Wenn das Programm auf ----- einen BRK-Befehl trifft, wird diese Flagge gesetzt.

Bit 5 ist nicht belegt.                 
-----                                   

Bit 6 V-Flagge (" Overflow") : Dieses Bit ----- wird nur im Zweierkomplement-Modus benötigt. In diesem Modus wird das 7 . Bit einer Zahl als Vorzeichen aufgefaßt. Es wird automatisch gesetzt, wenn ein Überlauf eingetreten ist, d. h. wenn der Zahlenbereich überschritten wurde und nun das höherwertigste Bit gesetzt wurde, obwohl es eigentlich das Vorzeichen enthalten sollte.
Bit 7 Negativ-Flag: Wenn das Ergebnis ----- einer Operation größer als 127($7 F) ist, wird diese Flagge gesetzt. Wie oben erwähnt, gibt es einen Modus, in dem Zahlen, die größer als $7 F sind (7 . Bit gesetzt), als Negativ angesehen werden.
Daß fast jeder Befehl auf die Flaggen einwirkt, soll uns der altbekannte LDA-Befehl zeigen.
Beispiel: LDA #00 In den Akku wird der Wert $00 geladen.
Da das Ergebnis dieser Aktion null ist, wird die Zero-Flagge gesetzt.
Bei LDA # FF hingegen bleibt die Zero-Flagge gelöscht. Da aber ein größerer Wert als $7 F geladen wurde, wird nun die Negativ-Flagge gesetzt.
Wir benötigen in diesem Kursteil lediglich die Flaggen C, Z, N und V.
Die anderen Flaggen sollten hier nur kurz erwähnt werden. Da Sie nun die Bedeutung der Flaggen kennen, wird Ihnen die Registeranzeige Ihres Maschinensprache- Monitors " N V - B D I Z C" sicherlich etwas mehr sagen.

Die Vergleichsbefehle:                  
---------------------                   

CMP:( CoMPare to accu) : Dieser Befehl --- ermöglicht einen Vergleich zwischen dem Inhalt des Akkus und einem beliebigen Wert ( oder dem Inhalt einer Speicherstelle) . Die Register werden dadurch verglichen, daß der adressierte Wert vom Inhalt des Akkus abgezogen wird. Dabei werden ( je nach Ergebnis) die Flaggen C, Z und N verändert. Der Akkumulatorinhalt bleibt unberührt.

Beispiel:   LDA #$05                    
            CMP #$01                    

Es wird also der adressierte Wert ($01) vom Inhalt des Akkus ($05) abgezogen.
Unsere Flaggen zeigen folgende Inhalte:
Carry-Flagge : gesetzt, da bei dieser " Subtraktion" kein Unterlauf aufgetreten ist.
Zero-Flagge : gelöscht, da die Differenz ($04) größer als Null ist.
Negativ-Flagge: gelöscht, da $04 kleiner als $7 F ist.
Der CMP-Befehl erlaubt folgende ( schon bekannte) Adressierungsarten:
Unmittelbare Adressierung, z. B: CMP #$10 Absolute Adressierung , z. B: CMP $2000 CPX/ CPY: Die Vergleichsbefehle CPX -------( ComPare to X) und CPY ( ComPare to Y) entsprechen dem CMP-Be- fehl, nur daß anstelle des Akkus mit den angegebenen Indexregistern verglichen wird.
Da die Vergleichsbefehle nur die Flaggen verändern, benötigen wir aber noch Befehle, die auf den Inhalt dieser Flaggen reagieren.

Die Verzweigbefehle:                    
-------------------                     

BEQ ( Branch on EQual)--- Verzweige zur angegebenen Adresse, falls die Zero-Flagge gesetzt ist.
BNE ( Branch on Not Equal)--- Verzweige, falls die Zero-Flagge gelöscht ist.
BCC ( Branch on Carry Clear)--- Verzweige, falls die Carry-Flagge gelöscht ist.

BCS (Branch on Carry Set)               
---  Verzweige, falls die Carry-Flagge  
     gesetzt ist.                       
BMI (Branch on MInus)                   
---  Verzweige, falls die Negativ-Flagge
     gesetzt ist.                       
BPL (Branch on PLus)                    
---  Verzweige, falls die Negativ-Flagge
     gelöscht ist.                      
BVC (Branch on oVerflow Clear)          
---  Verzweige, falls die V-Flagge      
     gelöscht ist.                      
BVS (Branch on oVerflow Set)            
---  Verzweige, falls die V-Flagge      
     gesetzt ist.                       

Wie Sie sehen, richten sich jeweils zwei dieser Befehle ( gegensätzlich) nach einer Flagge.
Wenn die Bedingungen für eine Verzweigung nicht gegeben ist, wird dieser Befehl einfach vom Programm übergangen.
Hier liegt eine deutliche Parallele zur IF. . . Then. . .- Anweisung in BASIC.
Bei den bedingten Verzweigungen gibt es noch eine weitere Besonderheit; Sehen wir uns zunächst den Befehl

. 2000  D0 03     BNE $2005             

etwas näher an. Wie Sie sehen, handelt es sich um einen 2- Byte-Befehl, obwohl alleine die Angabe der Sprungadresse schon 2 Bytes benötigen müßte. Diese speicherplatzsparende Besonderheit wird durch die relative Adressierung ermöglicht. Es wird also die Sprungadresse nicht direkt angegeben, sondern nur die Entfernung zum Sprungziel.
Wenn Sie jede Sprungadresse selbst ausrechnen müßten, würde dies zu einer wüsten Rechnerei führen. Da uns der Assembler jedoch diese lästige Arbeit abnimmt, können wir dieses Thema getrost übergehen. Sie müssen nur wissen, daß Sie nicht weiter als 129 Bytes hinter und 126 Bytes vor Ihren Verzweigungsbefehl springen dürfen.
Dieser eingeschränkte Aktionsradius der relativen Adressierung fällt Ihnen bei der Programmierung keum noch auf.
Jetzt, am Ende des dritten Teiles haben Sie schon die wichtigsten Grundlagen erlernt und sind in der Lage, kleinere Programme zu schreiben. Was Sie mit Ihrem Wissen anfangen können, zeigt Ihnen auch diesmal das Begleitprogramm zu diesem Kurs.

Laden Sie nun den "Assembler-Kurs 3" von
Diskette  und  genießen  Sie,  was   Sie
bisher gelernt haben.                   
                                    (wk)

Valid HTML 4.0 Transitional Valid CSS!