Как избежать сохраниния с стек большого числа регистров? Есть обработчик прерывания и зачем ему столько регистров в стек прятать?
Хотя если не вызывать функцию Delay, то в стеке окажутся R16, R17, R30
\ 00000000 938A ST -Y,R24
\ 00000002 93FA ST -Y,R31
\ 00000004 93EA ST -Y,R30
\ 00000006 923A ST -Y,R3
\ 00000008 922A ST -Y,R2
\ 0000000A 921A ST -Y,R1
\ 0000000C 920A ST -Y,R0
\ 0000000E 937A ST -Y,R23
\ 00000010 936A ST -Y,R22
\ 00000012 935A ST -Y,R21
\ 00000014 934A ST -Y,R20
\ 00000016 933A ST -Y,R19
\ 00000018 932A ST -Y,R18
\ 0000001A 931A ST -Y,R17
\ 0000001C 930A ST -Y,R16
\ 0000001E B78F IN R24,0x3F
40 if(!(PINB & (1 << SDA2)))
\ 00000020 99B0 SBIC 0x16,0x00
\ 00000022 C008 RJMP ??_PCINT0_0
41 {
42 if(!(_Bus_status & (1 << RC))) return;
\ 00000024 .... LDI R30,_Bus_status
\ 00000026 8100 LD R16,Z
\ 00000028 FF02 SBRS R16,2
\ 0000002A C004 RJMP ??_PCINT0_0
43 _Bus_status |= (1 << ST_MY_BUS);
\ 0000002C 8100 LD R16,Z
\ 0000002E 6002 ORI R16,0x02
\ 00000030 8300 ST Z,R16
44 Delay();
\ 00000032 .... RCALL Delay
\ ??_PCINT0_0:
\ 00000034 BF8F OUT 0x3F,R24
\ 00000036 9109 LD R16,Y+
\ 00000038 9119 LD R17,Y+
\ 0000003A 9129 LD R18,Y+
\ 0000003C 9139 LD R19,Y+
\ 0000003E 9149 LD R20,Y+
\ 00000040 9159 LD R21,Y+
\ 00000042 9169 LD R22,Y+
\ 00000044 9179 LD R23,Y+
\ 00000046 9009 LD R0,Y+
\ 00000048 9019 LD R1,Y+
\ 0000004A 9029 LD R2,Y+
\ 0000004C 9039 LD R3,Y+
\ 0000004E 91E9 LD R30,Y+
\ 00000050 91F9 LD R31,Y+
\ 00000052 9189 LD R24,Y+
\ 00000054 9518 RETI
-
- Приходится писать процедуры векторов прерывания на ассемблере. Компилятор "С" уговорить не делать этого не удается. - Ксения(15.04.2005 16:02, )
- У IAR'a такая "договоренность", Алексей Мусин(225 знак., 15.04.2005 14:48, )
- ой скопировал не все:) - Хитрый Чен(15.04.2005 14:31, )