Вот пример генерации кода. опции -Os
---------------------------------------------------------
int g;
int func(void)
{
int res;
{
uint8_t _SReg;
asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg));
res = g;
asm volatile( "out __SREG__,%0" :: "r" (_SReg));
}
return res;
}
--------------------------------------------------------
WinAVR 20060421 (правильно)
28 0000 2FB7 in r18,__SREG__
29 0002 F894 cli
32 0004 8091 0000 lds r24,g
33 0008 9091 0000 lds r25,(g)+1
36 000c 2FBF out __SREG__,r18
40 000e 0895 ret
---------------------------------------------------------
WinAVR 20070122 (неправильно)
32 0006 8FB7 in r24,__SREG__
33 0008 F894 cli
37 000a 8FBF out __SREG__,r24
40 000c 8091 0000 lds r24,g
41 0010 9091 0000 lds r25,(g)+1
46 0014 0895 ret
---------------------------------------------------------