Magic Disk 64

home to index to html: MD9003-KURSE-ASSEMBLER-KURS_1_TEIL_3.html
          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)



Valid HTML 4.0 Transitional Valid CSS!