Forum: Mikrocontroller und Digitale Elektronik .equ Ersatz in Assembler


von Gerhard (Gast)


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

: Verschoben durch User
von ./. (Gast)


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

von Gerhard (Gast)


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

von Karl H. (kbuchegg)


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.

von Gerhard (Gast)


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...

von Cyblord -. (cyblord)


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...

von c-hater (Gast)


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

von Wilhelm F. (Gast)


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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Lass dir das *.LST file mit erzeugen und schau es dir an. Ich vermute, 
das du dann dem Problem recht schnell auf die Spur kommst.

von Gerhard (Gast)


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?

von Wilhelm F. (Gast)


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.

von c-hater (Gast)


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.

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.