Цитата(MrYuran @ Apr 30 2008, 11:49)

А что вас так смущает деление на 10?
В пределах байта это 4 сдвига и 4 сложения
Равно как и умножение
Ну, тут плавно перешли к полуоффтопикув виде сравнения преобразования
16-битного числа в avr204.asm и на сайте atmel.ru. Там "деление" на 10 несколько подлиннее будет. Хотя с учётом наличия команд умножения у мег и для 16 бит "деление" на 10 по скорости гораздо выгоднее, чем avr204.asm, а в одном из вариантов выгоднее и чем вычитания, но длиннее по коду.
Ну а avr204.asm для 16 бит соревнуется по тормознутости с именно делением на число, в качестве которого в процедуру передаётся 10.
Кстати, для вывода как правило удобнее иметь сразу распакованный BCD или ASCII, это тоже можно сделать вычитаниями, там получается приблизительно те же числа (26 слов, от 32 до 183 циклов в зависимости от числа, исходник, кажется, от =AVR=, пробегал по форуму на телесисемамах лет 5 назад).
Если слегка модифицировать алгоритм - убрать восстановление остатка после циклов вычитаний и циклы через один сделать циклами сложения, то это будет ещё короче при приблизительно тех же временах, только минимум будет не для 0, а для 9090..9099, а максимум не для 59999, а для 60900..60909.
Код
;Converts unsigned integer value of bin_h:bin_l to ASCII or unpacked BCD
;Only upper registers can be used, bin_h/asc4 and bin_l/asc5
;variable pairs must share common register each.
;21 words, max/min cycles with rcall/ret: 183(60900..60909)/27(9090..9099)
;No other registers used;)
; ascii/unpacked BCD in "reversed" order - leftmost digit stored in r20, rightmost one - in r16
; use for BIN to ASCII
.set ZERO='0'
.set NINE='9'
; use for BIN to unpacked BCD
;.set ZERO=0
;.set NINE=9
.def asc1 =r20
.def asc2 =r19
.def asc3 =r18
;
.def asc4 =r17
.def bin_h =r17
;
.def asc5 =r16
.def bin_l =r16
;
itoa:
ldi asc1,ZERO-1;Will be '0' after 1st increment
sub10k:
inc asc1;'0','1','2','3','4','5','6'
subi bin_l,low(10000)
sbci bin_h,high(10000)
brsh sub10k
;
ldi asc2,NINE+1
add1k:
dec asc2;'9','8','7','6','5','4','3','2','1','0'
subi bin_l,low(-1000)
sbci bin_h,high(-1000)
brlo add1k
;
ldi asc3,ZERO-1
sub100:
inc asc3;'0','1','2','3','4','5','6','7','8','9'
subi bin_l,low(100)
sbci bin_h,high(100)
brsh sub100
;
ldi asc4,NINE+1;Re-use bin_h as ASC4
add10:
dec asc4;'9','8','7','6','5','4','3','2','1','0'
subi bin_l,-10;Re-use bin_l as ASC5
brlo add10
subi asc5,-(ZERO);convert to ASCII
;
ret