Вам
в пустыне уже все разжевали, теперь еще и тут та же пестня?
Ну вот вам пример. Правда для MSP430, т.к. ИАР для АВР не имею.
Исходный текст функции перывания.
Код
extern float calcBlaBla (float a_data, float b_data, float c_data);
#pragma vector = WDT_VECTOR
__interrupt __raw void WDTimer_ISR(void)
{ P1OUT^=BIT0;
float tmp=calcBlaBla(1.0, 4.0, 2.0);
printf("%f0.3", tmp);
}
А вот во что его скомпилировал ИАР.
Код
49 #pragma vector = WDT_VECTOR
\ In segment CODE, align 2
50 __interrupt __raw void WDTimer_ISR(void)
\ WDTimer_ISR:
51 { P1OUT^=BIT0;
\ 000000 D2E32100 XOR.B #0x1, &0x21
52 float tmp=calcBlaBla(1.0, 4.0, 2.0);
\ 000004 30120040 PUSH.W #0x4000
\ 000008 0312 PUSH.W #0x0
\ 00000A 0E43 MOV.W #0x0, R14
\ 00000C 3F408040 MOV.W #0x4080, R15
\ 000010 0C43 MOV.W #0x0, R12
\ 000012 3D40803F MOV.W #0x3f80, R13
\ 000016 B012.... CALL #calcBlaBla
53 printf("%f0.3", tmp);
\ 00001A 0D12 PUSH.W R13
\ 00001C 0C12 PUSH.W R12
\ 00001E 3C40.... MOV.W #`?<Constant "%f0.3">`, R12
\ 000022 B012.... CALL #printf
54 }
\ 000026 3152 ADD.W #0x8, SP
\ 000028 0013 RETI
Как вы можете заметить в прерывании первой командой (XOR.B #0x1, &0x21) дергается нога контроллера P1.0 (инвертируется ее состояние). Потом в стек пихаются значения для функции calcBlaBla и вызывается сама функция. Затем вызывается printf. Стек выравнивается, т.к. все возвращаемые значения не используются. Дальше возврат из прерывания.
То что вам нужно, не так ли?

Кстати, зачем вам нужно сохранять ВСЕ регистры? Мне это не понятно. Компилятор сохраняет в стеке только те из них, которые используются в вызываемой функции.