Warning Assembler-Macro

Gast #2516254
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
Gast #2516455
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
Gast #2516513
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
Gast #2516558
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
Gast #2517007
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 !
#2603060
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.
Angehängte Dateien:

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