Цитата(aaarrr @ Nov 23 2009, 16:41)

Не верю. Листинг приложите.
Да компилятор сам все замечательно сделает, если только вы ему мешать не будете. Где, например, в вашей C-программе локальные переменные?
Дизассемблерный код для функции:
Код
void timer0_irq_handler()
{
ii--;
if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
if(datA&0x80000000) regA = 0x20000;
else regA = 0x0;
regs->PIOA_ODSR = regA|front;
datA = datA<<1;
dummy = MipsTimerBase->TC_SR;
}
Код
timer0_irq_handler:
0000083C E59F041C LDR R0, [PC, #+1052] ; [0xC60] =ii (0x2001B0)
00000840 E59F1418 LDR R1, [PC, #+1048] ; [0xC60] =ii (0x2001B0)
00000844 E5911000 LDR R1, [R1, #+0]
00000848 E2511001 SUBS R1, R1, #0x1
0000084C E5801000 STR R1, [R0, #+0]
if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
00000850 E59F0408 LDR R0, [PC, #+1032] ; [0xC60] =ii (0x2001B0)
00000854 E5900000 LDR R0, [R0, #+0]
00000858 E3500000 CMP R0, #0x0
0000085C 1A000003 BNE 0x000870
if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
00000860 E59F03FC LDR R0, [PC, #+1020] ; [0xC64] =MipsTimerBase (0x17B4)
00000864 E5900000 LDR R0, [R0, #+0]
00000868 E3A01002 MOV R1, #0x2
0000086C E5801000 STR R1, [R0, #+0]
MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
00000870 E59F03EC LDR R0, [PC, #+1004] ; [0xC64] =MipsTimerBase (0x17B4)
00000874 E5900000 LDR R0, [R0, #+0]
00000878 E3A0101E MOV R1, #0x1E
0000087C E5801014 STR R1, [R0, #+20]
MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
00000880 E3A0003C MOV R0, #0x3C
00000884 E59F13D8 LDR R1, [PC, #+984] ; [0xC64] =MipsTimerBase (0x17B4)
00000888 E5911000 LDR R1, [R1, #+0]
0000088C E581001C STR R0, [R1, #+28]
00000890 E59F13CC LDR R1, [PC, #+972] ; [0xC64] =MipsTimerBase (0x17B4)
00000894 E5911000 LDR R1, [R1, #+0]
00000898 E5810018 STR R0, [R1, #+24]
if(datA&0x80000000) regA = 0x20000;
0000089C E59F03B8 LDR R0, [PC, #+952] ; [0xC5C] =datA (0x2001A0)
000008A0 E5900000 LDR R0, [R0, #+0]
000008A4 E3100480 TST R0, #0x80000000
000008A8 0A000003 BEQ 0x0008BC
if(datA&0x80000000) regA = 0x20000;
000008AC E59F03A0 LDR R0, [PC, #+928] ; [0xC54] =regA (0x2001AC)
000008B0 E3A01B80 MOV R1, #0x20000 ; 0x208B8
000008B4 E5801000 STR R1, [R0, #+0]
000008B8 EA000002 B 0x0008C8
else regA = 0x0;
000008BC E59F0390 LDR R0, [PC, #+912] ; [0xC54] =regA (0x2001AC)
000008C0 E3A01000 MOV R1, #0x0 ; 0x8C8
000008C4 E5801000 STR R1, [R0, #+0]
regs->PIOA_ODSR = regA|front;
000008C8 E59F0380 LDR R0, [PC, #+896] ; [0xC50] =regs (0x200000)
000008CC E5900000 LDR R0, [R0, #+0]
000008D0 E59F137C LDR R1, [PC, #+892] ; [0xC54] =regA (0x2001AC)
000008D4 E5911000 LDR R1, [R1, #+0]
000008D8 E59F2378 LDR R2, [PC, #+888] ; [0xC58] =front (0x200108)
000008DC E5922000 LDR R2, [R2, #+0]
000008E0 E1921001 ORRS R1, R2, R1
000008E4 E5801438 STR R1, [R0, #+1080]
datA = datA<<1;
000008E8 E59F036C LDR R0, [PC, #+876] ; [0xC5C] =datA (0x2001A0)
000008EC E59F1368 LDR R1, [PC, #+872] ; [0xC5C] =datA (0x2001A0)
000008F0 E5911000 LDR R1, [R1, #+0]
000008F4 E1B01081 MOVS R1, R1, LSL #1
000008F8 E5801000 STR R1, [R0, #+0]
dummy = MipsTimerBase->TC_SR;
000008FC E59F0120 LDR R0, [PC, #+288] ; [0xA24] =dummy (0x2001C8)
00000900 E59F135C LDR R1, [PC, #+860] ; [0xC64] =MipsTimerBase (0x17B4)
00000904 E5911000 LDR R1, [R1, #+0]
00000908 E5911020 LDR R1, [R1, #+32]
0000090C E5801000 STR R1, [R0, #+0]
}
00000910 E12FFF1E BX LR
обратите внимание на:
Код
datA = datA<<1;
000008E8 E59F036C LDR R0, [PC, #+876] ; [0xC5C] =datA (0x2001A0)
000008EC E59F1368 LDR R1, [PC, #+872] ; [0xC5C] =datA (0x2001A0)
000008F0 E5911000 LDR R1, [R1, #+0]
000008F4 E1B01081 MOVS R1, R1, LSL #1
000008F8 E5801000 STR R1, [R0, #+0]
переменный datA,ii,front, используемы в обработчике прерывания, глобальные, так как они используются еще и в другой функции