.equ Ersatz in Assembler

Gast #3451126
Lesenswert?

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
Gast #3451190
Lesenswert?

Ueblicherweise benutzen Assembler heute auch den C-Praeprozessor.
Dann ginge das so:
1
.equ Fall1=$C3,$55,$23
2
.equ Fall2=$F2,$A0,$00
3

4
#define Fall1 $C3,$55,$23
5
#define Fall2 $F2,$A0,$00
6

7
Funktion Fall1
Gast #3451557
Lesenswert?

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.
1
Missing macro argument: @1
2
Missing macro argument: @2
#3451565
Lesenswert?

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
Funktion Fall1
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.
Gast #3451862
Lesenswert?

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...
#3451865
Lesenswert?

> 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...
Gast #3451901
Lesenswert?

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
Gast #3451930
Lesenswert?

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.
Gast #3451977
Lesenswert?

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?
Gast #3451992
Lesenswert?

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.
Gast #3452544
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren