"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.