Цитата(Dog Pawlowa @ Dec 20 2006, 21:54)

А дизассемблер привести сложно? Или мы должны все бросить и посвятить вечер изучению ? Сами то смотрели?
Я смотрел, и не раз, пожалуйста, c чуйством глубокохо удовлетворения привожу листинг, смотрите:
Код
218 /*****************************************************************************
219 Коррекция значения времени
220 Корректирует время в зависимости от значения TIFR и младшего слова (ТС1)
221 ***************************************************************************
***/
222 //UINT32 PULSE_SENS_CorrectTime(Pulse_Time_t *Pulse)
\ In segment CODE, align 2, keep-with-next
223 void PULSE_SENS_CorrectTime(Pulse_Time_t *Pulse)
\ PULSE_SENS_CorrectTime:
224 {
\ 00000000 2F79 MOV R23, R25
\ 00000002 2E28 MOV R2, R24
\ 00000004 01F8 MOVW R31:R30, R17:R16
225 UINT32 time = Pulse->Time;
\ 00000006 8100 LD R16, Z
\ 00000008 8111 LDD R17, Z+1
\ 0000000A 8122 LDD R18, Z+2
\ 0000000C 8133 LDD R19, Z+3
226
227 /* корректируем результат по состоянию флага OCF1A
228 на момент считывания значений времени */
229 if(Pulse->TIFR_reg & (1 << OCF1A))
\ 0000000E 8144 LDD R20, Z+4
\ 00000010 FF44 SBRS R20, 4
\ 00000012 C00A RJMP ??PULSE_SENS_CorrectTime_0
230 {
231 time += 0x00010000; /* если флаг установлен, инкрементируем значение милисекунд */
\ 00000014 5000 SUBI R16, 0
\ 00000016 4010 SBCI R17, 0
\ 00000018 4F2F SBCI R18, 255
\ 0000001A 4F3F SBCI R19, 255
232 if(SYSTIMER_COMPARE_VAL == LOWORD(time))
\ 0000001C 2F51 MOV R21, R17
\ 0000001E 3C0F CPI R16, 207
\ 00000020 4057 SBCI R21, 7
\ 00000022 F411 BRNE ??PULSE_SENS_CorrectTime_0
233
234 /* если значение счетчика равно константе в регистре сравнения, то мы это
235 значение должны обнулить */
236 time &= 0xffff0000;
\ 00000024 E000 LDI R16, 0
\ 00000026 E010 LDI R17, 0
237 }
238
239 /* преобразуем в мкс */
240 Pulse->Time = ((UINT32)(LOWORD(time) >> 1) + (UINT32)(HIWORD(time)) * 1000);
\ ??PULSE_SENS_CorrectTime_0:
\ 00000028 01A8 MOVW R21:R20, R17:R16
\ 0000002A 9556 LSR R21
\ 0000002C 9547 ROR R20
\ 0000002E E060 LDI R22, 0
\ 00000030 0189 MOVW R17:R16, R19:R18
\ 00000032 01C8 MOVW R25:R24, R17:R16
\ 00000034 EE08 LDI R16, 232
\ 00000036 E013 LDI R17, 3
\ 00000038 E020 LDI R18, 0
\ 0000003A E030 LDI R19, 0
\ 0000003C 9F19 MUL R17, R25
\ 0000003E 0D20 ADD R18, R0
\ 00000040 1D31 ADC R19, R1
\ 00000042 9F18 MUL R17, R24
\ 00000044 2D10 MOV R17, R0
\ 00000046 0D21 ADD R18, R1
\ 00000048 1F36 ADC R19, R22
\ 0000004A 9F09 MUL R16, R25
\ 0000004C 0D10 ADD R17, R0
\ 0000004E 1D21 ADC R18, R1
\ 00000050 1F36 ADC R19, R22
\ 00000052 9F08 MUL R16, R24
\ 00000054 2D00 MOV R16, R0
\ 00000056 0D11 ADD R17, R1
\ 00000058 1F26 ADC R18, R22
\ 0000005A 1F36 ADC R19, R22
\ 0000005C 0F04 ADD R16, R20
\ 0000005E 1F15 ADC R17, R21
\ 00000060 1F26 ADC R18, R22
\ 00000062 1F36 ADC R19, R22
\ 00000064 8300 ST Z, R16
\ 00000066 8311 STD Z+1, R17
\ 00000068 8322 STD Z+2, R18
\ 0000006A 8333 STD Z+3, R19
241 //return ((UINT32)(LOWORD(time) >> 1) + (UINT32)(HIWORD(time)) * 1000);
242 }
\ 0000006C 2D82 MOV R24, R2
\ 0000006E 2F97 MOV R25, R23
\ 00000070 9508 RET
Что бы не напрягать попусту Ваши глаза и мозговые извилины, сделаю два замечания:
В начале кода компилятор послушно берет адрес и формирует переменную time из регистров r16-19
Код
00000000 2F79 MOV R23, R25
\ 00000002 2E28 MOV R2, R24
\ 00000004 01F8 MOVW R31:R30, R17:R16
225 UINT32 time = Pulse->Time;
\ 00000006 8100 LD R16, Z
\ 00000008 8111 LDD R17, Z+1
\ 0000000A 8122 LDD R18, Z+2
\ 0000000C 8133 LDD R19, Z+3
В конце, так же послушно запихивает то, что пережевал обратно:
Код
\ 00000064 8300 ST Z, R16
\ 00000066 8311 STD Z+1, R17
\ 00000068 8322 STD Z+2, R18
\ 0000006A 8333 STD Z+3, R19
Что и как он там насчитал, меня мало интересует, но факт остается фактом, насчитал он не правильно