Kontrollerregister R16 bzw R17 in Variable speichern (inline-assembler?)

Gast #2026447
Lesenswert?
• ▲
▼
Hallo Zusammen

Kann ich den Inhalt ein Kontrollerregister (assembler) R16 bzw. R17 
mittels Ansi-c in eine Variable speichern. Meine Idee wäre 
inline-assembler aber ich weis nicht wie und ich finde auch keinen 
Forums Beitrag zu diesem Thema

Danke für die Hilfe

Detlev
Moderator Persönliche Seite #2026488
Lesenswert?
• ▲
▼
"ANSI-C" kennt keinen Inline-Assembler, auch sein Nachfolger, ISO-C99
kennt sowas nicht.

Die Inline-Assembler zwischen IAR und GCC unterscheiden sich dramatisch,
und in diesem Falle schlägt der GCC den IAR um Längen: beim IAR hat
man keinerlei Möglichkeit, dass der Compiler einem irgendwelche
Parameter des umgebenden C-Codes (wie bspw. die Stelle, an der sich
eine lokale Variable befindet) mit in die Inline-Asm-Anweisung hinein
gibt.  Man muss einfach wissen, wo der Compiler gerade was abgelegt
hat, und dieses Wissen könnte natürlich bereits mit der nächsten
Compilerversion zu Halb- oder Unwissen verkümmert sein.

Beim GCC geht das ungefähr so:
1
#include <stdint.h>
2
...
3
  uint8_t save_r16, save_r17;
4

5
  asm volatile("mov %[sr16], r16" "\n\t"
6
               "mov %[sr17], r17"
7
               : [sr16] "=r" (save_r16), [sr17] "=r" (save_r17)
8
               );

Details unter:

http://www.nongnu.org/avr-libc/user-manual/inline__asm.html

Denk aber auch dran, dass das, was für den IAR die Register r16 und
r17 sind, für den AVR-GCC in der Regel die Register r24 und r25
sind.  Vielleicht beginnst du ja lieber damit, dein eigentliches
Problem zu beschreiben.
Moderator Persönliche Seite #2026543
Lesenswert?
• ▲
▼
Detlev Neumann schrieb:
> Kennt jetzt jemand eine Seite indem ich asm inline für den IAR Kompiler
> abkupfer oder erlernen kann

Frag' doch bei IAR's Support nach, hast schließlich eine hübsche
Stange Geld für den Compiler bezahlt.

Aber wie schon geschrieben, dort ist das nichts weiter als:
1
   asm("mov r12, r16");
2
   asm("mov r13, r17");

Irgendwelche Parameter kennt der meines Wissens nicht.
Gast #2026606
Lesenswert?
• ▲
▼
Und die Lösung ist z.B.

      asm ("STS LWRD((save_R16)),R16");
      asm ("STS LWRD((save_R17)),R17");

wer suchet der findet :-)

Apropo Support meine Version ist so alt da gibt es keinen Support aber 
man muss sich nur zu helfen wissen


Danke für den denk anstoss

Gruß

Daniel

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