Forum: Compiler & IDEs GCC-Macro-Einstieg...


von Macro (Gast)


Lesenswert?

Hallo,

leider kenne ich die "Welt" der GCC- Tools (noch) wenig, ich möchte
eventuell eine früher entwickelte (8080)-Macrosprache für meine Atmel
Versuche umsetzen, falls dies möglich ist.

Als Einstieg suche ich einen Hinweis bzw. den Manual-Einstieg wo die
Preprozessor-Fähigkeiten stehen.
Ich bin für jeden Hinweis dankbar.

So möchte ich zum Beispiel:

ASSIGN <channel>,<identifier>,<adress>,<mask>


ASSIGN (INPUT,POS,0x32,0x38)

PseudoCODE...umsetzen nach:

??
...
#if channel EQ INPUT

#define xadr_POS 0x32
#define xmask_POS 0x38

#EXIT MACRO ???
#ENDIF
....

Kann mir jemand sagen wie man da die Dummy Paramete verknüpft

zb: xadr$identifier wird zu xadr_POS... etc.

Ein Zeige auf da Manual wo ich diese Thematik finde würde mir schon
reichen. Oder geht sowas nicht?
Das Ganze wurde füher mit nem Macro_Assembler realisiert.

Vielen Dank
Achim

von AndreasH (Gast)


Lesenswert?

Hallo,

diese Art von Makros beim 8080 kenne ich auch.
Wie Du das jetzt im Detail beim gcc umsetzen musst, kann ich Dir nicht
sagen.

Ein Macro beginnt mit
.macro
Bei Dir wäre das
.macro ASSIGN channel,identifier,adress,mask
..... ; weiterer Code
.endm

Die nachfolgenden Anweisungen lauten entsprechend
#if         ==> .if
#endif      ==> .endif
#EXIT MACRO ==> .exitm

Angesprochen werden die Parameter dann mit einem Backslash davor:
.if \address - \mask

Aufgerufen wird das Makro dann:
ASSIGN INPUT,POS,0x32,0x38

Weiteres findest Du in der Assembler-Doku. Ich habe die nur ausgedruckt
und weiss nicht mehr wo ich die zugehörige Datei auf meinem Rechner
habe.
Ich kann auch nicht mehr sagen wo ich die runtergeladen habe.
Versuch einfach mal bei google nach "gnu-assembler" zu suchen.
Bei mir ist es die Version 2.11 und nennt sich "Using as"

Grüße
Andreas

von Macro (Gast)


Lesenswert?

Hallo AndreasH

geht sowas auch in C mit #define xxx oder ist das überzogen?
Ich meine also nicht im Assembler. Leider find ich (noch) keine Manuals
über das Thema

MfG
Achim

von Chris (Gast)


Lesenswert?

Jein, genau das gleiche wirst du in C vermutlich nicht erreichen können.
Du musst bedenken, dass der Präprozessor von C recht "dumm" ist und
selten mehr als einen sture Textersetzung vornimmt.
Es gibt zwar sowas wie #ifdef, aber damit kannst du nur auf
Präprozessorsymbole testen, nicht auf Parameter.

Du brauchst als if-Anweisung also IMHO das tatsächliche if() von C. Für
xadr_POS musst du eine globale Variable definieren.
Immerhin kannst du zwei Token mit dem Präprozessor aneinanderkleben:
#define some_macro(identifier) xadr_##identifier

some_macro(POS) liefert nun den dynamisch erstellten Bezeichner
xadr_POS.

Ein C-Buch deiner Wahl sollte IMHO die meisten deiner Fragen klären
können.

von Chris (Gast)


Lesenswert?

p.s.:
Hm, kann sein, dass ich mich gerade gewaltig getäuscht habe. Evtl. geht
sowas (zu faul zum Testen):

#define POS = 1

#if (POS == 1)
#define POS_IST_EINS
#endif


Innerhalb von Makros kannst du aber AFAIK keine weiteren
Präprozessorbefehle absetzen, weil sie nicht am Anfang der Zeile stehen
würden.

von AndreasH (Gast)


Lesenswert?

Da der 8080 in Assembler programmiert wird und mir kein C-Compiler
bekannt ist, hatte ich angenommen Du willst das ganze auch in Assembler
umsetzen.

Ansonsten gilt. Probier es einfach an einem kleinen Makro aus.

Ich meine mich daran zu erinnern, dass ich in den letzten Monaten mal
folgendes ausprobiert habe:

#define POS = 5

#if (POS == 5)
#elif (POS == 1)

Das ging dann nicht. Ich kann dir auch nicht mehr genau sagen welcher
Compiler das war. Da ich in den letzten Wochen nur mit dem avr-gcc
gespielt habe, ist die Wahrscheinlichkeit gross dass es mit dem war.
Könnte allerdings auch in ähnlicher Form in Delphi gewesen sein.
Wie gesagt, kann mich nicht mehr genau daran erinnern. Daher: Probieren
geht über studieren.

Grüße
Andreas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.