Код
ISR (INT0_vect)
{
uint8_t temp;
temp=PORTB;
OnSound (temp);
}
{
uint8_t temp;
temp=PORTB;
OnSound (temp);
}
avr-gcc 4.7.1. кодит его как:
Код
ISR (INT0_vect)
{
23e: 1f 92 push r1
240: 0f 92 push r0
242: 0f b6 in r0, 0x3f ; 63
244: 0f 92 push r0
246: 11 24 eor r1, r1
248: 3f 93 push r19
24a: 4f 93 push r20
24c: 5f 93 push r21
24e: 6f 93 push r22
250: 7f 93 push r23
252: 8f 93 push r24
254: 9f 93 push r25
256: af 93 push r26
258: bf 93 push r27
25a: ef 93 push r30
25c: ff 93 push r31
uint8_t temp;
temp=PORTB;
25e: 88 b3 in r24, 0x18 ; 24
OnSound (temp);
260: e4 df rcall .-56 ; 0x22a <OnSound>
}
262: ff 91 pop r31
264: ef 91 pop r30
266: bf 91 pop r27
268: af 91 pop r26
26a: 9f 91 pop r25
26c: 8f 91 pop r24
26e: 7f 91 pop r23
270: 6f 91 pop r22
272: 5f 91 pop r21
274: 4f 91 pop r20
276: 3f 91 pop r19
278: 0f 90 pop r0
27a: 0f be out 0x3f, r0 ; 63
27c: 0f 90 pop r0
27e: 1f 90 pop r1
280: 18 95 reti
{
23e: 1f 92 push r1
240: 0f 92 push r0
242: 0f b6 in r0, 0x3f ; 63
244: 0f 92 push r0
246: 11 24 eor r1, r1
248: 3f 93 push r19
24a: 4f 93 push r20
24c: 5f 93 push r21
24e: 6f 93 push r22
250: 7f 93 push r23
252: 8f 93 push r24
254: 9f 93 push r25
256: af 93 push r26
258: bf 93 push r27
25a: ef 93 push r30
25c: ff 93 push r31
uint8_t temp;
temp=PORTB;
25e: 88 b3 in r24, 0x18 ; 24
OnSound (temp);
260: e4 df rcall .-56 ; 0x22a <OnSound>
}
262: ff 91 pop r31
264: ef 91 pop r30
266: bf 91 pop r27
268: af 91 pop r26
26a: 9f 91 pop r25
26c: 8f 91 pop r24
26e: 7f 91 pop r23
270: 6f 91 pop r22
272: 5f 91 pop r21
274: 4f 91 pop r20
276: 3f 91 pop r19
278: 0f 90 pop r0
27a: 0f be out 0x3f, r0 ; 63
27c: 0f 90 pop r0
27e: 1f 90 pop r1
280: 18 95 reti
собственно понятно, созранение всех задействованных регистров - перестраховка на случай если расстерянный программист в процедуре внутри прерывания изменит содержимое всех регистров. Если прерывание простое можно добавить аттрибут: "__attribute__((__naked__))" и iret и нет проблем.
А как сделать так чтобы компилятор сохранял только задействованные в конретном прерывании регистры ?