Forum: Mikrocontroller und Digitale Elektronik Warning Assembler-Macro


von Michael1 (Gast)


Lesenswert?

Hallo Leute,
------------
Ich benutze AVR-Studio 4.18.
(AVR macro assembler 2.1.42 build 1796 Sep 15 2009 10:48:36)
Nachfolgendes Programm wird vom Assembler ohne Error und Warnung 
übersetzt, solange der Macroaufruf auskommentiert bleibt. Wird der 
Macroaufruf aktiviert, kommt es zu 2 Warnungen, obwohl in dem Macro 
nichts anderes gemacht wird, als in den 2 Konstrukten (.ifndef...) zuvor 
auch.
warning: .def: 'rTemp' redefinition (r24->r24)
warning: Register r24 already defined by the .DEF directive
Wie muss das Macro gestaltet sein, damit es nicht zu den Warnungen kommt 
?
1
#define rTemp24        r24
2
3
.macro Def             ;@0=ein Name,  @1=ein Register
4
    .ifndef @0
5
       .def @0 = @1
6
    .endif
7
.endmacro
8
9
10
;----------------------------------------------------
11
.ifndef rTemp
12
   .def rTemp = rTemp24
13
.endif
14
15
.ifndef rTemp
16
   .def rTemp = rTemp24
17
.endif
18
19
Def rTemp, rTemp24      ;Macro-Aufruf verursacht warning, warum ?
20
21
22
;----------------------------------------------------
23
Loop:
24
     ldi  rTemp, 0
25
     rjmp Loop

von Tom (Gast)


Lesenswert?

Mal einen anderen Macronamen als "Def" verwenden.

Tom

von Michael1 (Gast)


Lesenswert?

Hallo Tom,
----------
Anstatt Def hab ich Doof genommen, das Problem bleibt.

von spess53 (Gast)


Lesenswert?

Hi

Assembler-Hilfe:

...,IFNDEF -  conditional assembly

...The symbol must be defined with the EQU or SET directive. (Will not 
work with the DEF directive).

Erkärt erstmal, warum die Warnung kommt. Allerdings nicht, warum ohne 
die Zeile keine kommt.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Nach etwas Testen sieht es für mich so aus:

1. Der Satz '...(Will not work with the DEF directive).' aus der Hilfe 
scheint so nicht zu stimmen -> IFNDEF funktioniert mit .def

2. IFNDEF funktioniert nicht in Macros. Dieser Code
1
Def rTemp, rTemp24      
2
3
.ifndef rTemp
4
   .def rTemp = rTemp24
5
.endif
6
7
.ifndef rTemp
8
   .def rTemp = rTemp24
9
.endif

verursacht keine Warnung. Dieser
1
.ifndef rTemp
2
   .def rTemp = rTemp24
3
.endif
4
5
Def rTemp, rTemp24      
6
7
.ifndef rTemp
8
   .def rTemp = rTemp24
9
.endif

schon.

MfG Spess

von Michael1 (Gast)


Lesenswert?

Hallo spess53,
--------------
Vielen Dank für deinen Beitrag. Deine unter Pkt.2 genannte Version hatte 
ich in dieser Form noch nicht ausprobiert. Hochinteressant ! Jetzt hab 
ich einen neuen "Forschungsansatz" :)
Danke

von Klaus 2. (klaus2m5)


Lesenswert?

Durch die Parameterübergabe an das Makro wird RTemp zu R24 aufgelöst. Im 
Makro wird also .IFNDEF @0 durch .IFNDEF R24 dargestellt, und das 
funktioniert natürlich nicht.

Das gleiche Problem entsteht auch bei der Zuweisung .DEF R24 = R24, also 
auch Unsinn.

von Klaus 2. (klaus2m5)


Lesenswert?

Kommando zurück, das scheint wohl ein Bug von .IFNDEF im Zusammenhang 
mit .MACRO zu sein. Mit .IFDEF funktionierts.
1
.macro Def             ;@0=ein Name,  @1=ein Register
2
    .ifdef @0
3
    .else
4
       .def @0 = @1
5
    .endif
6
.endmacro

von Michael1 (Gast)


Lesenswert?

Hallo Klaus 2m5,
----------------
Perfekt, dein Lösungsvorschlag funktioniert !
Ich sehe das mittlerweile genauso. Bei Verwendung von .def in einem 
".ifndef..."-Konstrukt in einem Makro scheint es einen Bug zu geben.
Vielen Dank nochmal, du hast mir sehr geholfen !

von Leo C. (rapid)


Angehängte Dateien:

Lesenswert?

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.

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.