Hallo Ich habe folgendes Problem:
Ich habe ein Makro das ich mit mehreren Zahlen aufrufe z.B so:
1
Funktion $C3,$55,$23
Die Zahlen möchte ich jetzt automatisch einfügen lassen um nicht immer
das komplette schreiben zu müssen.
Ich stelle mir das so vor:
1
.equ Fall1=$C3,$55,$23
2
.equ Fall2=$F2,$A0,$00
3
...
4
5
6
Funktion Fall1
7
...
Leider bringt mir der Compiler dann folgende Fehlermeldung:
1
syntax error, unexpected','
Anscheinend kann mit dieser Funktion kein Komma verwendet werden.
Hat jemand damit schon Erfahrungen gemacht und kann mir sagen wie ich
das umgehen kann?
Grüße
Gerhard
Danke ./.
Jetzt erhalte ich keine Fehlermeldung mehr bedzüglich des Kommas.
Allerdings erkennt das Macro jetzt nur noch einen Parameter @0. Die
anderen fehlen anscheinend. Villeicht werden die Werte durch define nur
als ein einziger angesehen.
Gerhard schrieb:> Jetzt erhalte ich keine Fehlermeldung mehr bedzüglich des Kommas.> Allerdings erkennt das Macro jetzt nur noch einen Parameter @0. Die> anderen fehlen anscheinend. Villeicht werden die Werte durch define nur> als ein einziger angesehen.
Wenn da der C-Präprozessor am Werk ist, dann macht das #define einfach
nur eine Textersetzung.
Du schreibst
1
#define Fall1 $C3,$55,$23
2
3
FunktionFall1
und der Proäprozessor ersetzt in der Verwendung den Text "Fall1" durch
den Text "$C3,$55,$23"
D.h. nachdem sich der Präprozessor den Text vorgenommen hat, steht für
die weiteren Verarbeitungssschritte da schlicht und ergreifend
1
Funktion$C3,$55,$23
d.h. du musst jetzt rausfinden, warum dein Makro Funktion1 damit nicht
zurecht kommt.
Karl Heinz schrieb:> Gerhard schrieb:>> Wenn da der C-Präprozessor am Werk ist, dann macht das #define einfach> nur eine Textersetzung.>
Kann man das prüfen ob der c- Präprozessor da aktiv ist?
Das macro ist recht einfach. Ich kann mir nicht vorstellen das das
Problem da liegt.
Zumal es ja funktioniert wenn ich den Text direkt schreibe.
1
.Marco Funktion
2
ldi r16,@0
3
ldi r17,@1
4
ldi r18,@2
5
.Endm
Ich vermute das beim ersetzen des Textes etwas schief geht, da dieser
offenbar nur als ein Element erkannt wird. ( Fehler für @1 und @2)
Ps: ich verwende AVRstudio 6. Irgendwie haben die Jungs bei Atmel da
bestimmt was eingebaut um so eine Ersetzung zu ermöglichen. Leider bin
ich noch nicht drauf gekommenen. In den .xxx direktiven scheint es aber
nichts geeignetes zu geben...
> Ps: ich verwende AVRstudio 6. Irgendwie haben die Jungs bei Atmel da> bestimmt was eingebaut um so eine Ersetzung zu ermöglichen.
DAS fände ich bedenklich. Die Ersetzung sollte vom Präprozessor oder vom
Assembler direkt kommen, also aus der Toolchain und nicht von der IDE.
Alter Schwede...
Gerhard schrieb:> Hat jemand damit schon Erfahrungen gemacht und kann mir sagen wie ich> das umgehen kann?
Du benutzt einfach mehrere Macros.
.Macro Funktion
;tue was auch immer mit drei Parametern
.ENDMACRO
.MACRO Fall1
Funktion $C3,$55,$23
.ENDMACRO
.MACRO Fall2
Funktion $F2,$A0,$00
.ENDMACRO
Manche Assembler heißen ja auch Makroassembler. Da ist vieles möglich,
im Extrem kann man mit einer ausgefeilten Makroverwendung mit Assembler
schon fast so komfortabel wie in einer Hochsprache schaffen.
Aber man muß sich die Doku rein ziehen, die idealerweise auch Beispiele
hat.
Für die Syntax gibt es in Assemblern oft keine Normen, die Hersteller
stricken dort meist ihr eigenes Süppchen. Der Makroassembler ASM51 war
da in der Hinsicht auch etwas einarbeitungsintensiv, und ich mußte
vieles mal probieren. Aber der war mal Standard für 8051-Bausteine.
Glücklicherweise bekam ich den mal in Buchform, Online-Hilfe dazu gab es
noch nicht. Und im Buch waren dann wieder Druckfehler, mit denen ich
hadern mußte.
Also: Doku suchen und lesen.
c-hater schrieb:> Du benutzt einfach mehrere Macros.>> .Macro Funktion> ;tue was auch immer mit drei Parametern> .ENDMACRO>> .MACRO Fall1> Funktion $C3,$55,$23> .ENDMACRO>> .MACRO Fall2> Funktion $F2,$A0,$00> .ENDMACRO
So gehts! Top Danke!
Jetzt noch als kleiner bonus: ;)
Es gibt jetzt sehr viele Macros. Kann ich diese in eine andere Datei
auslagern, so dass sie nicht im Hauptprogramm stehen?
Gerhard schrieb:> Es gibt jetzt sehr viele Macros. Kann ich diese in eine andere Datei> auslagern, so dass sie nicht im Hauptprogramm stehen?
Wahrscheinlich in ein eingebundenes Header-File. Da mußt du mal schauen,
je nach deiner Programmstrukturierung. Analog zu *.h-Files in C nenne
ich diese bei Assembler immer *.inc. Aber das kann man weitgehend selbst
wählen, am besten nur nicht *.asm.
Gerhard schrieb:> Es gibt jetzt sehr viele Macros. Kann ich diese in eine andere Datei> auslagern, so dass sie nicht im Hauptprogramm stehen?
Natürlich.
Ich benutze für Entwurfszeit-Kram (also auch Macros) immer Dateien mit
der Erweiterung *.inc, zur Unterscheidung von Dateien, in denen
tatsächlich Code generiert wird, die heißen bei mir *.asm. Prinzipiell
das gleiche Konzept wird typischerweise auch bei C verwendet, mit *.h
und *.c.
Und genau wie bei C spielt es eigentlich keine Rolle, wie die Dateien
genau heißen, es ist also eine reine Konvention, sie so und nicht anders
zu benennen. Dementsprechend ist es auch deine Aufgabe, die Trennung
zwischen Entwurfszeit-Kram und Laufzeit-Code wirklich strikt
durchzusetzen, dem Compiler/Assembler ist das wurscht, es ist aber aus
praktischen Gründen doch sehr empfehlenswert.
Wenn du das nicht willst und irgendwann mal etwas umfangreicherere
Programme schreibst, wirst du sehr bald herausfinden, daß du es doch
willst ;o)
Wie in C müssen die "ausgelagerten" Dateien natürlich "includiert"
werden, damit sie Teil des Gesamtwerkes werden. Und zwar bevor die
enthaltenen Macros das erste mal genutzt werden sollen. Schreibst du
einfach in die *.asm spätestens vor der ersten Benutzung der
ausgelagerten Macros (aus Gründen der Übersicht besser aber gleich zu
Beginn) ein
.include "fallmacros.inc"
Probleme ergeben sich, wenn du die Macros in mehreren Asm-Dateien
verwenden willst und du deshalb die *.inc in jeder dieser *.asm
includest. Das geht erstmal schief, weil der Assembler über doppelt
definierte Symbole meckert. (Ist in C auch nicht anders)
Die Lösung ist:
Du faßt den eigentlichen Inhalt deiner fallmacros.inc in folgendes
Konstrukt ein:
.ifndef fallmacros_inc
.equ fallmacros_inc=1
;eigentlicher Inhalt hier
.endif
Auch wieder ganz genau dieselbe Soße wie in C. C ist halt nichts anderes
als ein wahnwitzig aufgedonnerter Macroassembler, auch wenn dessen
Apologeten das nicht wahrhaben wollen...
In richtigen Hochsprachen (selbst den meisten der gleichen Generation,
der auch C angehört) ist sowas nicht nötig. Da weiß der Compiler selber,
daß er eine Datei bereits includet hat und man muß ihm deshalb nicht
trickreich die Idee ausreden, das erneut zu versuchen...
C ist Dreck.