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)