Tips für PICs 14: Makro und Makro-Falle
Zunächst müssen wir klären, was ein Makro ist:
Ein Makro ist ein Programm-Baustein, der mehrere Befehle enthalten kann, und der mit seinem Namen in einem Programm
aufgerufen werden kann. Dieser Makro kann an fast beliebiger Stelle definiert werden.
Im Unterschied zu einem Unterprogramm können ihm fast beliebig viele Parameter (das sind hier Variable, die
vor dem Aufruf definiert wurden) mitgegeben werden. Dies ist bei einem Unterprogramm nicht möglich.
Der Nachteil: ein Makro wird als Textpaket in ein Programm eingebunden. Wenn er mehrfach verwendet werden soll,
wird er auch an jeder Stelle wieder neu eingefügt. Das bedeutet aber, daß er intern keine Sprungadressen
besitzen darf, weil diese dann beim Assemblieren mehrfach vorhanden wären und somit einen Fehler hervorrufen
würden.
Also alles Mist?
Natürlich nicht! Wenn man bei Schreiben des Makros die Sprungziele nicht explizit (also mit Namen) schreibt,
sondern sich die Sprungweite selber ausrechnet und dann nicht schreibt
sondern
dann hat man auch bei mehrmaligem Aufruf keine "Doppeldeutigkeiten" erzeugt.
Beispiel für das Schreiben eines Makros:
Was steht nun da?
- der Name des Makro ist "inc_dw"
- dann kommt die Anweisung "macro"
- dann kommen die Übergabe-Parameter, hier die beiden "ahi,alo"
- mit diesen beiden Parametern wird im folgenden Makro gearbeitet, als wären diese bekannt
- den Abschluß des Makros bildet die Anweisung "endm"
Und schon sind wir fertig.
Im Programm wird die beschriebene Prozedur aufgerufen mit
wobei die Adressen der Variablen "var_hi" und "var_lo" natürlich bekannt sein
müssen. Im Programm wird an jeder Stelle in diesem Makro, an der "ahi" auftaucht, dieses durch
"var_hi" ersetzt usw.
Dieser Makro kann beliebig oft mit beliebigen Varablen aufgerufen werden. Er spart keinen Platz im Programm. Dieses
läßt sich aber wesentlich besser lesen und verstehen.
Die Makro-Falle
Eine Falle ist ja immer etwas, wohinein man tappt, ohne es vorher zu wissen.
Die hier genannte Makro-Falle ist hinter jedem skip-Befehl aufgespannt. Die Hardware ersetzt jeden Befehl, der direkt
hinter einem skip-Befehl steht, durch ein "nop", wenn das Ergebnis der Abfrage "wahr" ist.
Prima.
Aber sie ersetzt nur einen einzigen, den ersten Befehl!
Wenn also ein Makro hinter dem Skip-Befehl steht, wird nur dessen erster Befehl ersetzt. Die Ergebnisse sind
wundersam und erst einmal nicht zu verstehen.
Das Perfide an der Sache ist, daß microchip auch Befehle ausliefert, die nicht nach Makro aussehen. Es sind
alle diejenigen, die sich wie ein einziger Befehl lesen, aber in der Hardware durch zwei realisiert werden. Auch in
der Farbgebung im Assembler-Programm sehen sie wie ein "Mono-"Befehl aus. Das ist richtig gemein!
Beispiele:
addcf, adddcf, subcf, subdcf, bc, bdc, bnc, bndc, bz, bnz.
Wenn Sie jetzt denken, wer braucht denn schon solche bekloppten Befehle, irren Sie sich gewaltig!
Haben Sie gewußt, daß auch negf, banksel und pagesel dazu gehören??
Jetzt wissen Sie's!
Wenn Sie's nicht glauben, schreiben Sie ein Mini-Programm, das den Absolutwert (also den Betrag) in einer
Variablen berechnen soll:
Testen Sie's: so geht's nicht!
Bei negativem Ergebnis ist alles richtig; nur bei positivem Ergebnis wird die Variable fälschlicherweise
um 1 vergrößert, weil der 2. Befehl des "negf" ein "incf" ist, der dummerweise
jedesmal ausgeführt wird.
Für weitere Fragen stehen gern zur Verfügung:
- der MEC; Besichtigung und Fachsimpelei z.B. an unseren "Club-Abenden"
- der Autor: Hans Peter Kastner
erstellt am: 15.05.2017
Copyright © 2017 by Modelleisenbahnclub Castrop-Rauxel 1987 e.V.