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 an- gegebenen 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 $9A (=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 $9A 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 auf- fallen, 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 Einsatz- gebiet des AND-Befehls gefunden, nämlich das gezielte Löschen von Bits. Ein weiteres Beispiel soll dies ver- deutlichen. Hier verknüpfen wir eine be- liebige 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 ge- setzt 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 --------
1111xxxx 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 veranschau- lichen, verknüpfen wir den Akkuinhalt $9a mit $FF:
$9A : 10011010 EOR $FF : 11111111 --------
01100101 Und siehe da, wir erhalten als Ergebnis das Komplement des vorherigen Akku- inhates. 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 ge- schrieben, so kann man diese einfach mit einem JMP- oder JSR-Befehl über- schreiben. Durch einen solchen "Notaus- stieg" 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)