Magic Disk 64

home to index to text: MD9404-KURSE-ASSEMBLER_KURS_2_(TEIL_6).txt
         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)

Valid HTML 4.0 Transitional Valid CSS!