Just for the record ...
... da ich auf die gleichen Probleme gestoßen bin.
Auch .ifndef funktioniert nicht in allen Fällen.
Besser gehts mit ".if defined ..."
Anschauungsmaterial in den Anhängen.
Aber:
1 | .macro gentabentry
|
2 | ;...
|
3 | .if defined @0
|
4 | .if abs((PC - @0)) > 2047
|
5 | rjmp "Zwischentabelle .." ;Sprungziel zu weit entfernt
|
6 | .else
|
7 | rjmp @0 ;Ziel existiert und ist in Reichweite
|
8 | .else
|
9 | ;... ;Sprungziel existiert (noch) nicht
|
10 | .endif
|
11 | ;...
|
12 | .endm
|
Wenn @0 nicht existiert generiert der Assembler einen Fehler in der
Zeile mit der abs-Funktion, obwohl diese dann garnicht evaluiert werden
dürfte.
Im konkreten Fall konnte ich die abs-Funktion einfach weglassen, da die
Sprungziele wegen anderer Einschränkungen des Assemblers sowieso immer
vor dem Makroaufruf liegen müssen.