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
goto1
sondern
goto2
dann hat man auch bei mehrmaligem Aufruf keine "Doppeldeutigkeiten" erzeugt.

Beispiel für das Schreiben eines Makros:
inc_dw
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
aufruf
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:
betrag
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.

Valid HTML 4.01!