Цитата(Qwertty @ Dec 3 2007, 23:55)

А раньше сохранялись? Посмотрел, что накомпилил winavr20060421, push R2 не нашел....
Раньше понятие растяжимое...
В winavr2006... функция 'main' обрабатывалась специальным образом, и используемые call-saved регистры (r2-r17, r28-r29) никогда не сохранялись в стеке.
В winavr2007... функция 'main' стала обычной функцией, и call-saved регистры используемые в 'main' сохраняются в стеке.
В GCC 4.3 добавлен атрибут "OS_task". Вот предварительная документация на него:
Functions with 'OS_task' attribute do not save any "call-saved" registers, requiring less stack space. Such functions should only be called from assembler routines. This attribute is typically used for the 'main' function.
Регистры r28-29 пока сохраняются

. Патч для GCC 4.2 есть, и "OS_task" должен быть в следующем WinAVR.
Цитата
Кстати вопрос - атрибут naked применять к main корректно ...? Я попробовал, программа стала меньше на 8 байт, вроде работоспособность не потеряла. Но все же хотелось бы точно знать, что странные траблы не вылезут потом.
Конечно вылезут ошибки, но ни какие не странные, а такие какие и должны.
Одной из задач пролога функции 'main', как и любой другой функции является выделение в стеке места для локальных переменных. Добавляя атрибут 'naked' к функции вы выкидываете код пролога функции. Если функции простая, и компилятору не потребовалось место в стеке для локальных переменных то проблем нет. Если же место для локальных переменных в стеке нужно, а оно не выделено, то эти переменные будут искажены.
Цитата
А то оптимизация у GCC и так иногда непонятна.
Факты.
Анатолий.
Сообщение отредактировал aesok - Dec 3 2007, 22:07