Code:
#  define ISR(vector, [attributes])
#else  /* real code */

#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
#  define __INTR_ATTRS used, externally_visible
#else /* GCC < 4.1 */
#  define __INTR_ATTRS used
#endif

#ifdef __cplusplus
#  define ISR(vector, ...)            \
    extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    void vector (void)
#else
#  define ISR(vector, ...)            \
    void vector (void) __attribute__ ((signal,used)) __VA_ARGS__; \
    void vector (void)
#endif
kurz gesagt
void VEKTORNAME(void) __attribute__ ((signal,used));
mit dem Signal Attribut sagst du dem compiler dass es eine ISR ist und er entsprechend die sprünge planen soll bzw. dass er das stack-handling um ein paar register erweitern muss
wenn du möchtest dass er die register nicht anfasst, weil du z.B. selber in assembler oder ähnlich sicherstellst NICHT die register zu benutzen, kannst du noch ein ,naked hinter ,used setzen, dann ist dir das stack sichern überlassen

PS mit
Code:
asm("nop;")
kannst du deinen assembler code inline schreiben falls nicht bekannt