Forum: Mikrocontroller und Digitale Elektronik Assembler Label WinAVR


von Han Solo (Gast)


Lesenswert?

Moin,

und schon gehts los:
Kann ich beim WinAVR Assembler ein "relatives" Label setzen.
Zur erklärung der folgende Code:
[avrasm]
.macro SaveContext
  push 30
  push 31
  ldi 30, lo8(SaveContext_Exit)
  ldi 31, hi8(SaveContext_Exit)
  rjmp _SaveContext
  SaveContext_Exit:
.endm
.macro RestoreContext
  ldi 30, lo8(RestoreContext_Exit)
  ldi 31, hi8(RestoreContext_Exit)
  rjmp _RestoreContext
  RestoreContext_Exit:
  pop 31
  pop 30
.endm
_SaveContext:
  push 0
        ...... usw.
  push 28
  push 29
  in work0,_SFR_IO_ADDR(SREG)
  push work0
  ijmp

_RestoreContext:
  pop work0
  out _SFR_IO_ADDR(SREG),work0
  pop 29
  pop 28
        ........ usw.
        pop 0
  ijmp
[\avrasm]

Die beiden Makros werden jeweils in verschiedenen Funktionen zum 
sichern/ und wiederherstellen der Register aufgerufen. Um den Flash 
etwas zu schonen wird in den Beiden Makros zur passenden _Funktion 
gesprungen.
Die Rücksprungadresse liegt im Z-Register.
Wenn ich jetzt aber die Makros in belibige Fuktionen schreibe wird 
sicherlich Fehler beim Compelieren geben da das Label nun mehrmals 
definiert ist.
Kann man die Label irgendwie relativ zum Makro definieren??

Danke für Antworten

von Stefan E. (sternst)


Lesenswert?


von Peter R. (gelb)


Lesenswert?

Du kannst auch in mehrfach verwendeten Makros Labels verwenden.

Der Assembler nummeriert diese einfach durch, so dass bei jeder 
Verwendung des Makros ein individuelles Label entsteht.

Sieh dir mal die beim Assemblieren entstehende MAP-Datei an, da wird das 
deutlich.

Ich vermute, dass in lo8(RestoreContext_Exit) das Label 
RestoreContext_Exit korrekt (mit Nummerierung) übersetzt wird, bin aber 
nicht ganz sicher.

Grüße, Peter

von Han Solo (Gast)


Lesenswert?

So gehts:
1
.macro RestoreContext
2
  ldi 30, lo8(1f)
3
  ldi 31, hi8(1f)
4
  rjmp _RestoreContext
5
  1:
6
  pop 31
7
  pop 30
8
.endm

Danke für den link.

Das vorherige hat nicht funktioniert.
Fehler: Label mehrfach definiert.
Wird also nicht automatisch nummeriert.

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.