Цитата(Сергей Борщ @ Aug 6 2008, 17:11)

Естественно. Потому что в другой процедуре на стек еще положен адрес возврата, локальные переменные, сохраненный SREG. Даже в одной процедуре в теле компилятор может положить на стек временную переменную и вся ваша стройная система рухнет.
С адресом возврата я согласен.
Из Вашей ремарки можно сделать не совсем правильный вывод о том, что компилятор использует лишь стек, а как же куча?
Когда она используется?
К слову, бывает, что компиляторы разделяют аппаратный стек и программный ибо он быстрее на некоторых системах...
Я думаю что и для AVR архитектуры это тоже м.б. разумно...
Цитата(Сергей Борщ @ Aug 6 2008, 17:11)

По макросу: поскольку push изменяет ОЗУ, совсем честно было бы указать memory
в списке clobberДоработал. Спасибо за совет!
Код
// ============================================================================
#define __avr_stack_pop() \
(__extension__({ \
uint8_t __result; \
__asm__ __volatile__ \
( \
"pop %0" "\n\t" \
: "=r" (__result) \
: \
: "memory" \
); \
__result; \
}))
// ============================================================================
#define __avr_stack_push(value) \
(__extension__({ \
uint8_t __value = (uint8_t)value; \
__asm__ __volatile__ \
( \
"push %0" "\n\t" \
: \
: "r" (__value) \
: "memory" \
); \
}))
Ещё раз убеждаюсь, что задавать правильные вопросы очень полезно для здоровья