Assembler-Kurs Teil 6
Diesmal geht es um die logischen
Verknüpfungen AND, ORA und EOR, von
denen Sie vielleicht einige schon von
BASIC aus kennen.
Außerdem werden Sie die Befehle BIT und
NOP kennenlernen.
AND (AND with accumulator)
Die logischen Befehle verknüpfen den
Akkumulatorinhalt bitweise mit den angegebenen Daten. Die AND-Verknüpfung
läuft nach folgendem Muster an:
0 AND 0=0 Wie Sie sehen, erhält man 0 AND 1=0 als Ergebnis nur dann eine 1 AND 0=0"1", wenn beide Operanden 1 AND 1=1 an dieser Stelle das Bit auf 1 gesetzt haben.
Beispiel für eine AND-Verknüpfung:
LDA #$9A AND #$D1 STA $1000
Der Akku wird mit dem Wert $9 A (=144) geladen und mit der Zahl $ D1(=209) UND-Verknüpft. Das Ergebnis der Verknüpfung
steht wieder im Akku und kann von dort
in Speicherstelle $1000 abgespeichert
werden. Dasselbe Ergebnis erhielte man
selbstverständlich auch durch:
LDA $1001 AND $1002 STA $1000
wenn vorausgesetzt wird, daß in
Speicherstelle $1001 der Wert $9 A und in
$1002 die Zahl $ D1 steht.
Führen wir nun die bitweise Berechnung
durch, um zu sehen, welcher Wert in
Speicherstelle $1000 abgelegt wird:
$9A : 10011010 AND $D1 : 11010001 --------
10010000
Wenn Sie genau hinsehen, wird Ihnen auffallen, daß überall dort, wo in dem
zweiten Operanden eine 0 auftaucht, auch
das Ergebnis eine 0 enthält. Da haben
wir auch schon das häufigste Einsatzgebiet des AND-Befehls gefunden, nämlich
das gezielte Löschen von Bits.
Ein weiteres Beispiel soll dies verdeutlichen. Hier verknüpfen wir eine beliebige Zahl mit dem Wert $ F0(=240) .
Für jede Bitposition an der ein X steht, kann entweder eine 1 oder eine 0 eingesetzt werdene. Dies spielt für
unser Beispiel keine Rolle:
xxxxxxxx AND $F0 : 11110000 --------
xxxx0000
An unserem Ergebnis sieht man, daß die
untersten vier Bits gelöscht wurden, während die obersten Bits ihren alten
Wert beibehalten haben.
Der AND-Befehl beeinflußt die Flaggen N
( wenn im Ergebnis Bit 7 gesetzt ist) und
Z ( falls das Ergebnis gleich Null ist) .
ORA (inclusivE OR with Accumulator)
Die Verknüpfung verläuft nach folgendem
Schema:
0 ORA 0=0 Man erhält als Ergebnis 0 ORA 1=1 eine "1", wenn das Bit des
1 ORA 0=1 ersten Operanden oder das 1 ORA 1=1 Bit des zweiten Operanden an dieser Stelle auf 1 gesetzt ist.
Ansonsten ist ORA dem AND-Befehl sehr
ähnlich. Er beeinflußt sogar dieselben
Flaggen ( N-Flag und Z-Flag) .
Ein Beispiel für eine ORA-Verknüpfung:
LDA #$9A ORA #$D1 STA $1000
Auch hier wollen wir die Verknüpfung
bitweise nachvollziehen:
$9A : 10011010 ORA $D1 : 11010001 --------
11011011
Im Unterschied zu AND dient der ORA-Befehl dem gezielten Setzen von
Bits. Als Beispiel möchte ich wieder
ein beliebiges Byte mit dem Wert $ F0 ODER-Verknüpfen:
xxxxxxxx ORA $F0 : 11110000 --------
1111 xxxx
Das Ergebnis zeigt, daß die obersten
vier Bits auf 1 gesetzt wurden, während
die anderen gleichgeblieben sind. Bei
der ODER-Verknüpfung sind es jetzt die
Einsen des Operanden $ F0, die eine
Veränderung des Akkuinhaltes bewirken.
Vergleichen Sie das Ergebnis mit dem
Beispiel der AND-Verknüpfung, so stellen
Sie fest, daß dort die Nullen des
zweiten Operanden für das Ergebnis
entscheidend waren.
EOR (Exclusive OR with accumulator)
0 EOR 0 = 0 Man erhält an einer Bit- 0 EOR 1 = 1 stelle nur dann eine "1", 1 EOR 0 = 1 wenn das Bit des ersten 1 EOR 1 = 0 Operanden oder das Bit des zweiten Operanden an dieser Position auf 1 gesetzt ist.
Schaut man sich die Verknüpfungstabelle
des EXKLUSIV-ODER an, so fällt ein
Unterschied zum ORA direkt ins Auge: Nur
wenn genau ein Operand das Bit auf 1 hat, wird auch im Ergebnis dieses Bit
gesetzt, aber nicht, wenn beide
Operanden eine gesetztes Bit haben.
Ein Beispiel für eine EOR-Verknüpfung:
LDA #$9A EOR #$D1 STA $1000
Bitweise ergibt sich folgendes Ergebnis:
$9A : 10011010 EOR $D1 : 11010001 --------
01001011
Aus diesem Ergebnis läßt sich auf Anhieb
kein besonderer Sinn für diesen Befehl
erkennen. Aber was passiert, wenn der zweite Operand mit dem ersten operanden
übereinstimmt ? Richtig, das Ergebnis
der EOR-Verknüpfung wäre Null ( d. h. das
Zero-Flag wäre gesetzt) . EOR kann also
für Vergleiche benutzt werden, denn bei
Ungleichheit der Operanden erhielte man
ein Ergebnis ungleich Null.
Der EOR-Befehl hat aber noch ein weiters
Einsatzgebiet. Um dies zu veranschaulichen, verknüpfen wir den Akkuinhalt
$9 a mit $ FF:
$9A : 10011010 EOR $FF : 11111111 --------
01100101
Und siehe da, wir erhalten als Ergebnis
das Komplement des vorherigen Akkuinhates. Man muß also, um das Komplement
einer Zahl zu bekommen, diese mit EOR
$ FF verknüpfen.
Der BIT-Befehl
Eigentlich hat der Bit-Befehl nicht sehr
viel mit den logischen Verknüpfungen zu
tun. Man kann ihn eher zu den
Vergleichsbefehlen zählen. Mit BIT führt
man eine UND-Verknüpfung zwischen dem
Akkuinhalt und der angegebenen
Speicherstelle durch. Dabei wird aber
der Akkumulatorinhalt nicht verändert.
Das Ergebnis dieser Verknüpfung wird in
der Zero-Flagge festgehalten, da diese
auf 1 gesetzt ist, falls das Ergebnis 0 war. Andernfalls ist das Zero-Flag
gelöscht.
Die Adressierung des BIT-Befehles kann
nur absolut erfolgen:
LDA #$9A BIT $1500
Bei diesem Beispiel wollen wir annehmen, daß in Speicherstelle $1500 der Wert $ D1 abgelegt ist. Dann lautet die logische
Verknüpfung wie beim AND-Befehl:
$9A : 10011010 AND $D1 : 11010001 --------
10010000
Der Akkumulatorinhalt wird diesmal
jedoch nicht verändert, und das Z-Flag
ist gelöscht, da das Ergebnis ungleich 0 ist.
Der NOP-Befehl
Zum Abschluß des diesmaligen Kursteiles
soll hier noch ein ganz einfacher befehl
vorgestellt werden. Der NOP-Befehl tut
nämlich nichts. Aber wozu kann man einen
Befehl gebrauchen, der nur zwei Taktzyklen abwartet und ein Byte
Speicherplatz beansprucht, aber sonst
keine Wirkung hat ? Man nimmt ihn als
Platzhalter innerhalb des ASSEMBLER-Programmes. Wenn man bei seinem Programm
plötzlich feststellt, daß man noch einen
Befehl vergessen hat, muß man
normalerweise den gesamten Programmcode
im Speicher verschieben. Hat man aber
z. B drei NOP' s hintereinander geschrieben, so kann man diese einfach mit
einem JMPoder JSR-Befehl überschreiben. Durch einen solchen " Notausstieg" hat man die Möglichkeit, weitere
Befehle einzufügen.
Wie immer finden Sie auf der Diskette
ein Begleitprogramm mit vielen
nützlichen Tips. Starten Sie dazu das
Programm " ASSEMBLER-KURS 6" aus dem
Gamesmenü.
Ralf Trabhardt/( wk)