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 Grund- lage 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 auto- matisch 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 Sub- trahieren 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 er- gibt, 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 Dezi- malmodus ausgeführt wird. Normalerweise ist dieses Bit ge- lö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 ge- setzt, wenn ein Überlauf einge- treten ist, d.h. wenn der Zahlen- bereich ü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 ($7F) ist, wird diese Flagge ge- setzt. Wie oben erwähnt, gibt es einen Modus, in dem Zahlen, die größer als $7F sind (7. Bit ge- setzt), 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 $7F geladen wurde, wird nun die Negativ-Flagge gesetzt. Wir benötigen in diesem Kursteil ledig- lich die Flaggen C,Z,N und V. Die anderen Flaggen sollten hier nur kurz erwähnt werden. Da Sie nun die Be- deutung der Flaggen kennen, wird Ihnen die Registeranzeige Ihres Maschinen- sprache-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 be- liebigen 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 Akkumulatorin- halt 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 aufge- treten ist. Zero-Flagge : gelöscht, da die Differenz ($04) größer als Null ist. Negativ-Flagge: gelöscht, da $04 kleiner als $7F 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 Verzwei- gung nicht gegeben ist, wird dieser Be- fehl 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ög- licht. Es wird also die Sprungadresse nicht direkt angegeben, sondern nur die Entfernung zum Sprungziel. Wenn Sie jede Sprungadresse selbst aus- rechnen 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 Verzweigungsbe- fehl 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)