![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' Assemblerkurs für die OM-Mikrocontroller - Teil 4 ' In OCBASIC 1.11a für die Open-Macro von Dietmar Harlos am 28. Februar 2018 ' ---------------------------------------------------------------------------- ' Dieser Teil des Assemblerkurs verdeutlicht einige Fallstricke bei der ' Assemblerprogrammierung: Es werden die Unterschiede zwischen den zwei ' Adressierungsarten IMM und DIR erklärt und auf das 16-Bit Index-Register ' H:X eingegangen. ' ---------------------------------------------------------------------------- INCLUDE "omac.def" 'Definitionen für die Open-Macro DIM variable BYTE 'eine Bytevariable im RAM DEFINE konstante 123 'eine Konstante ' ---------------------------------------------------------------------------- ' Das Hauptprogramm in OCBASIC: ' Auf der Seriellen Schnittstelle wird Folgendes ausgegeben: ' 43 ' 34 variable=42 'Variable auf Wert setzen. PRINT asm 'Assemblerroutine aufrufen und zurückgegebenen Wert auf ' der Seriellen Schnittstelle ausgeben. PRINT variable 'Den zweiten in der Variable zurückgegebenen Wert ausgeben. End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende ' ---------------------------------------------------------------------------- FUNCTION asm INLASM 'Assemblerroutinen müssen durch das Schlüsselwort INLASM gekennzeichnet werden ' ---------------------------------------------------------------------------- ' 1. Beispiel: Die zwei Adressierungsarten IMM und DIR ' Die Adressierungsarten "IMM 8-bit immediate (unmittelbar)" und "DIR 8-bit direkt" unterscheiden sich bei ' den OM-Controllern nur durch ein vorangestelltes Doppelkreuz, auch Number-Zeichen genannt (#). Das sorgt ' bei vielen Anfängern für Verwirrung. Es ist aber wichtig, die beiden Adressierungsarten auseinanderzuhalten, ' denn sie führen zu ganz unterschiedlichen Resultaten: ! lda #100 'Lade Akkumulator (A) mit Wert 100 ! lda 100 'Vorsicht: Lade Akkumulator (A) mit Wert, der auf Adresse 100 steht ! lda #konstante 'Lade Akkumulator (A) mit Wert der Konstanten (123) ! lda konstante 'Vorsicht: Lade Akkumulator (A) mit Wert, der auf Adresse 123 steht ! lda #variable 'Vorsicht: Lade Akkumulator (A) mit Adreßwert der Variable ! lda variable 'Lade Akkumulator (A) mit Inhalt der Variable ' ---------------------------------------------------------------------------- ! inca 'erhöhe Akkumulator (A) um eins ! jsr FwPush 'Byte auf dem Rechenstack speichern, Übergabe vom Byte im Akkumulator (A) ' ---------------------------------------------------------------------------- ' 2. Beispiel: Das 16-Bit Index-Register H:X ' Die 6808-CPU besitzt ein 16-Bit Index-Register namens H:X, wobei H das höherwertige und X das niederwertige ' Byte ist. Wenn das H-Register null ist, arbeitet die CPU des OM-Controllers genauso wie die 6805-CPU der ' Original-C-Control (Version 1.1), denn die 6808-CPU ist objektcode- und quellcodekompatibel zur 6805-CPU. ' Beim Aufruf einer Anwender-Assemblerroutine setzt das OM-Betriebssystem das H-Register immer auf null. ' Im weiteren Programmverlauf muß der Anwender aber natürlich selber darauf achten, daß das H-Register einen ' sinnvollen Wert enthält, nachdem es benutzt wurde. Sicherheitshalber sollte ein CLRH-Befehl verwendet werden. ! ldhx #12345 '16-Bit Index-Register H:X auf Wert setzen ! pusha 'Inhalt vom Akkumulator (A) ins H-Register kopieren ! poph ! clrh 'H-Register auf null setzen ! ldx #2 'X-Register auf Wert 2 setzen ! lda tabelle1,x 'aus einer Tabelle lesen (Vorsicht: Adresse ist tabelle1 + h:x) ! sta variable 'Speichern in der Variable ' ---------------------------------------------------------------------------- ! rts 'Rücksprung zum Betriebssystem ' ---------------------------------------------------------------------------- END FUNCTION ' ---------------------------------------------------------------------------- TABLE tabelle1 BYTE 'Eine Tabelle im Byte-Format 122 95 34 211 END TABLE ' ---------------------------------------------------------------------------- INCLUDE "om_fw.pro" 'INCLUDE-Datei für Firmwareroutinen ' --------------------------------------------------------------------------- Passender Link: Assemblerkurs für die OM-Mikrocontroller (Teil 4) als ZIP-Archiv Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |