Magic Disk 64

home to index to html: MD9006-KURSE-ASSEMBLER-KURS_1_TEIL_6.html
         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)
Valid HTML 4.0 Transitional Valid CSS!