Другой пример нужен. Тут вполне можно обойтись без дёрганья туда-сюда SREG, так как код в цикле использует только бит переноса, а в документации английским по белому: The C Flag in SREG is not affected by the operation, thus allowing the DEC instruction to be used on a loop counter in multiple-precision computations.
Так что можно вообще так (кстати, а зачем продолжать "инкремент", если из предыдущего байта нет переноса?):
System_Timer:
ldix TIMER
ldi CNT, TIMER_LENGTH
; Поскольку ниже INC, тут убираем SEC за ненадобностью.
System_Timer_Cycle:
ld r16, X
; Поскольку есть досрочный выход, тут можно и INC, а не ADC с нулевым регистром
; Но можно было бы и ADC, и без досрочного выхода, только это будет в среднем дольше выполняться
; а по коду выиграша не даст.
inc r16
st r16, X+
; Ну зачем добавлять дальше нулевой перенос?
; Если в R16 не 0, то дальше передавать нечего.
brne Sysem_Timer_Done
dec CNT
brne Sysem_Timer_Cycle
System_Timer_Done:
Даже
если бы inc/
dec у AVR задевали бит переноса, тут для счётчиков длиной до 8 байт тоже можно было бы обойтись без танцев, причём не удлинняя код:
System_Timer:
ldix TIMER
ldi CNT, (1<<TIMER_LENGTH)-1 ; 0b00001111 для 4-байтового счётчика
System_Timer_Cycle:
lsr CNT
brcc System_Timer_Done ; C=0 - закончился счётчик, C=1 - его и добавляем.
ld r16, X
; Впрочем, при выходе по завершению переноса тут можно и INC.
; Просто демонстрация использования бита C в двух целях.
adc r16, RCLR
st r16, X+
brcs Sysem_Timer_Cycle ; ну зачем добавлять дальше нулевой перенос?
System_Timer_Done:
Так что даже будeчи увереным в собственной правоте и неправоте задавшего вопрос -- иногда стоит над вопросом задуматься :-)