Warning Assembler-Macro

Gast #2516254
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
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
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
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
#2516814
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.
Gast #2517007
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.