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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.