Цитата(777777 @ Apr 30 2008, 09:40)

Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз.
Ну так сравнить код и всё!
В avr204.asm цикл для bin2BCD16 не такой и коротенький.
Внутри 16 проходов цикла сдвига делается ещё десятичная коррекция, команды для которой у AVR нет. Это у 51-го можно коррекцию делать во время сдвига, выходит аккуратно и быстро.
Коррекция там сама сделана как цикл по байтам результата, итого это три прохода.
Это, конечно, быстрее, чем делением на 10, но в целом отвратительная реализация, попытка перенести на архитектуру AVR решение, которое на неё плохо ложится.
Во внутреннем цикле два вычитания, итого уже 16*3*2 = 96 гарантированных вычитаний.
Ещё там максимум четыре косвенных обращения к регистрам как к памяти через указатель Z, которые вместе эквивалентны четырём словным вычитаниям. Ещё эквивалент максимум 16*3*4 = 192 вычитания.
Итого 288 макс.
И Вы говорите, что 50 _максимум_ это много?
Ну и их там не 50. Для последней цифры единички вычитать не нужно вообще, для предпоследней вычитания байтовые, а не словные, для первой будет вычитаться максимум 7 раз. Ну там ещё компенсационные сложения для восстановления числа, итого там "лень считать, но в переводе на словные вычитания точно не больше 40".
Итого: avr204.asm
Код
;* Number of words :25
;* Number of cycles :751/768 (Min/Max)
;* Low registers used :3 (tBCD0,tBCD1,tBCD2)
;* High registers used :4(fbinL,fbinH,cnt16a,tmp16a)
;* Pointers used :Z
25 слов, 9 регистров, больше 750 тактов.
Метод вычитания с atmel.ru
Код
;* Количество слов кода :25 + возврат
;* Количество циклов :25/176 (Мин/Макс) + возврат
;* Использованные младшие регистры :нет
;* Использованные старшие регистры :4(fbinL,fbinH/tBCD0,tBCD1,tBCD2)
;* Использованные указатели :нет
Столько же слов, в два раза меньше регистров, минимум в четыре раза быстрее.