Цитата(Nanobyte @ Jul 4 2006, 11:13)

Да, это так. Но мне, например, при расчёте смещений в Ethernet-UDP-TCP заголовках было удобнее вначале рассчитывать константы именно так. После отладки даже не стал исправлять, так как в дальнейшем, при модификации программы, так легче вспомнить и разобраться, и это несмотря на подробные комментарии (ASM всё таки)

Это, конечно, так. Но лучше расчет смещений возложить на ассемблер. Нужно только написать соответствующе макроопределение. Это делается только один раз. Например, так:
Код
;
; ** STK$ALC -- выделение стека
;
; Описание:
; Макрокоманда производит выделение необходимой стекой памяти.
; Поскольку данная макрокоманда устанавливает начальное значение
; текущего уровня стека, она ДОЛЖНА ВЫПОЛНЯТЬСЯ ПЕРВОЙ независимо
; от того, требуется ли фактическое выделение стека в данный момент
; или нет.
;
; Вызов: STK$ALC value
;
STK$ALC macro value; Stack allocation
STACK$ var value ; Текущий уровень стека
if STACK$ == 0 ; Стековая область не требуется,
exitm ; то выход
endif ;
;
; Выделить стек
;
if STACK$ < 64 ; Достаточно одной команды
sbiw r29:r28, STACK$
else ; требуется две команды
subi r28, LOW(STACK$)
sbci r29, HIGH(STACK$)
endif
endm