Цитата(*Roma* @ Jul 23 2005, 10:49)
Код
count--;
if ((SREG&0x04)==0x04){break;}//if negative flag=1
Я не сильно большой знаток С, но не проще ли было записать так:
Код
if (--count <0) break;
, только объявить counter как signed...
Да, кстати, я не поленился и написал что-то типа первого варианта,
скомпилировал и получил примерно такой код:
Код
\ ??main_0:
\ 00000008 2D0F MOV R16, R15
\ 0000000A FD00 SBRC R16, 0
\ 0000000C .... RCALL proc1
49 if (F2){proc2();}
\ ??main_1:
\ 0000000E 2D0F MOV R16, R15
\ 00000010 FD01 SBRC R16, 1
\ 00000012 .... RCALL proc2
Ну и куда уже короче-то? Нет, ну конечно мог бы компилер в R16 и не пересылать, но по моему и так неплохо. Не говоря уже о том, что первый вариант на порядок читабельнее.
А во втором - может, общий код будет и покороче. Но. Учтите что раздуется код инициализации (константы-указатели), и работать цикл будет прилично медленнее.
Что касается ассемблерных вставок и сохранения регистров - все логично. Ну не знает компилер, что и как вы там менять будете, а у него может свои задумки насчет того, что в каких регистрах лежать должно. Вот и защищается...