www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler Label WinAVR


Autor: Han Solo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Han Solo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So gehts:
.macro RestoreContext
  ldi 30, lo8(1f)
  ldi 31, hi8(1f)
  rjmp _RestoreContext
  1:
  pop 31
  pop 30
.endm

Danke für den link.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.