home *** CD-ROM | disk | FTP | other *** search
/ Action! Club Magazin 4B / Action_Club_Magazin_4_1987_Action_User_Group_Side_B.atr / vergl.txt < prev    next >
Text File  |  2023-02-26  |  5KB  |  1 lines

  1. ***************************************¢*                                     *¢*    ASSEMBLER KURS III TEIL II       *¢*                                     *¢*  (c) 1987 by Action! User Group     *¢*                                     *¢***************************************¢¢¢Heute wollen wir nocheinmal Ver-¢zweigungen behandeln¢¢Aus der Befehlstabelle koennen wir nun¢herausfinden, welches Flag auf welchem¢Wert stehen muss, damit ein Verzweig-¢ungs befehl zu einem anderen Befehl¢verzweigt.¢¢Wir haben im letzten Teil gelernt,dass¢Verzweigungsbefehle maximal 128 Bytes¢vor oder zurueck springen koennen.¢¢Wie wird das nun in Zahlen ausge-¢drueckt? Oder : Wie erkennt der¢Computer , dass er vor oder zurueck¢springen soll?¢¢Dazu muss man sich ansehen, wie Zahlen¢im Computer gespeichert werden:¢¢8 Bits werden wie bekanntlich zu einem¢Byte zusammengefasst. Die einzelnen¢Bits haben folgende Wertigkeiten:¢¢Bit Wertigkeit¢¢1   1¢2   2¢3   4¢4   8¢5   16¢6   32¢7   64¢8   128¢¢Man kann so Zahlen von 0 bis 255 dar-¢stellen. Wie  werden aber negative¢Zahlen dargestellt ?¢¢Das 8. Bit wird einfach als Vorzeichen¢benutzt. Daraus resultiert aber, dass¢wir dann nur noch 7 Bits fuer die¢Betragsdarstellung zur Verfuegung¢haben. Und mit 7 Bits kann man Werte¢von 0 bis 127 darstellen.¢¢Also muss bei Rueckwaertsspruengen¢das 8. Bit auf 1 stehen.¢¢Dieses sollte nur den Hintergrund der¢Verzweigungsbefehle erlaeutern.¢Da wir ja mit einem Assembler arbeiten,¢braucht uns dies nicht weiter zu inter-¢essieren. Sollte die Sprungweite von¢128 Bytes ueberschritten werden, so ¢wird der Assembler einen Fehler aus-¢geben.¢¢---------------------------------------¢¢Wie beeinflussen Vergleichsbefehle die¢Flags in der 6502 ?¢¢Vergleiche gibt es immer nur zwischen¢den Registern (A,X,Y) und einer¢Speicheradresse. Bei Vergleichen werden¢die Flags N,Z,C beeinflusst:¢Folgende Tabelle zeigt dies:¢¢Vergleich        N Z C¢¢A,X,Y <M         1 0 0¢A,X,Y =M         0 1 1 ¢A,X,Y >M         0 0 1¢¢Das N Flag bezieht sich immer auf das¢Zweier Komplement(also Zahlen von¢-128 bis +127) Wird spaeter noch er-¢klaert.¢¢Hier nun die verschiedenen Moeglich-¢keiten fuer Verzweigungen:¢¢A < M  BCC Label¢A <=M  BCC Label¢       BEQ Label¢A = M  BEQ Label¢A >=M  BCS Label¢A > M  BEQ Nicht Label¢           (darf ja nicht gleich sein)¢A      BCS Label¢¢¢Bei <= stehen 2 Verzweigungsbefehle,¢weil ja auch abgefragt werden muss,ob¢die beiden verglichenen Zahlen gleich¢sind. Es koennte aber so besser sein:¢(Basic Beispiel:)¢¢nicht  : If A<=10 then ...¢sondern: if A<11  then ...¢¢¢---------------------------------------¢¢Spruegne:¢¢JMP = JuMP ¢¢Man schreib einfach JMP Label im Pro-¢gramm.(oder JMP adresse)¢Dies ist ein 3-Byte Befehl.¢¢Es gibt aber noch den indirekten Sprung¢¢Im Quelltext steht : JMP (Label) oder¢JMP (adresse).¢Label bezieht sich dann auf eine ¢Adresse, in der wiederum das eigent-¢liche Sprungziel steht.¢¢Nehmen wir an , in Adresse 1536 steht¢die Zahl 30000 (natuerlich hier als¢2-Byte Zahl).¢Schreibt man JMP(1536) dann springt¢der Computer nach adresse 30000 und ¢versucht den dort stehenden Befehl aus-¢zufuehren.¢¢---------------------------------------¢¢Unterprogramme:¢¢Unterprogramme sollten vom Basic her¢bekannt sein. Wir schreiben im¢Assembler nun nicht GOSUB Zeilennr.,¢sondern JSR Label oder Adresse.¢Das Unterprogramm muss mit RTS enden.¢(was einem 'RETURN' gleich kommt)¢¢Beispiel: (ohne Zeilennummern)¢¢         JSR UPRG¢         .   ; hier geht's nach dem¢         .   ; RTS weiter¢         .¢         und so weiter...¢¢¢ UPRG    LDA #0¢         .¢         .¢         .¢         RTS¢¢Der 6502 speichert bei einem JSR die¢Adresse, wo der naechste Befehl ist,¢der nach dem RTS vom Unterprogramm aus-¢gefuehrt werden soll, auf dem Stack.¢¢Bei einem RTS wird diese Adresse vom¢Stack wieder runtergeholt und der ¢Programmzaehler mit diesen neuen Werten¢geladen.¢¢Bei Basic wuerde der Computer bei einem¢RETURN Befehl, vor dem aber kein GOSUB¢ausgefuert wurde,einen Fehler ausgeben.¢¢In Maschinensprache wird ein RTS immer¢ausgefuert. Deshalb kann es sein, dass,¢wenn man vorher NICHT mit JSR ge-¢sprungen ist , der Computer falsche ¢Werte vom Stack holt und somit an einer¢ganz falschen Adresse weiterarbeiten¢will. Dort koennen natuerlich total¢ungueltige Befehle stehen und das ¢System koennte abstuerzen !!!!!!¢¢Natuerlich koennen Unterprogramme auch¢oberhalb(im Speicher) des JSR Kommandos¢stehen. Auch koennen natuerlich ¢mehrere Unterprogramme ineinander ver-¢schachtelt werden. (soweit der Stack¢reicht).¢¢Wichtig ist , dass bei JSR und RTS¢die Register NICHT gerettet werden.¢¢Wenn mann die Registerwerte nach einem¢JSR noch braucht, und weis, dass bei¢dem angesprungenen Unterprogramm die¢Register veraendert werden, dann sollte¢man A,X,Y vorher speichern. Dazu bietet¢sich ebenfalls der Stack an:¢¢Vor dem JSR: ¢             PHA¢             TXA¢             PHA¢             TYA¢             PHA¢¢ nun sind alle Register auf dem Stack¢ gespeichert.¢ Dann kann der JSR folgen.¢¢vor dem RTS:¢             PLA¢             TAY¢             PLA¢             TAX¢             PLA¢¢ nun sind alle alten Registerwerte¢ wieder in den Registern.Der RTS kann¢ folgen.¢¢---------------------------------------¢¢