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)