|
itoa на asm, из темы "51 vs AVR"... |
|
|
|
Nov 13 2007, 23:19
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(mse @ Nov 3 2007, 23:51)  itoa от =AVR= ;О) Кто быстрее? CODE ;-------------------------------------------------------------------- ; Converts an unsigned integer r5:r4 to a 5-character ASCII string [x] ; 58 program words, 73 clocks + ret itoa: .equ rev10k= 429497; ~= 2^32/10000
clr r2
ldi r16,low(rev10k) ldi r17,high(rev10k) ldi r18,byte3(rev10k)
mul r4,r16 mov r6,r1 mul r4,r17 add r6,r0 adc r1,r2 mov r7,r1 mul r4,r18 add r7,r0 adc r1,r2 mov r8,r1; r8r7r6 ~= Xlsb*429497/256, 06872B max
mul r5,r16 add r6,r0 adc r7,r1 adc r8,r2 mul r5,r17 add r7,r0 adc r8,r1 mul r5,r18 add r8,r0; r8r7 ~= int2fract(X%10000) ldi r17,'0' adc r1,r17; r1 = ASCII(X/10000)
st x+,r1; Tens of thousands ;-------------------------------------------------------------------- ; Converts fractional 16-bit value in r5:r4 (0..9999) range ; to a 4-character ASCII string [x] ; by sequential multiplication by 10 fractoa: ldi r16,10; Constant for multiplication by 10
sec ; Correct int2fract result to fit in 16-bit word adc r7,r2; by incrementing it adc r8,r2;
mul r7,r16; Multiply a 16-bit value by 10 movw r2,r0; mul r8,r16; add r3,r0; r3r2 ~= int2fract(X%1000) adc r1,r17; r1 = ASCII(X/1000) st x+,r1; Thousands
mul r2,r16; Same as above for hundreds movw r4,r0 mul r3,r16 add r5,r0 adc r1,r17 st x+,r1
mul r4,r16; Same as above for tens movw r2,r0 mul r5,r16 add r3,r0 adc r1,r17 st x+,r1
mul r2,r16; Same as above for units movw r4,r0 mul r3,r16 add r5,r0 adc r1,r17 st x+,r1
ret
Ну я быстрее...  Чиста редактируем код многоуважаемого =AVR=  CODE ;-------------------------------------------------------------------- ; Converts an unsigned integer r5:r4 to a 5-character ASCII string [x] ; 56 program words, 71 clocks + ret itoa: .equ rev10k= 429497; ~= 2^32/10000
clr r3
ldi r16,low(rev10k) ldi r17,high(rev10k) ldi r18,byte3(rev10k)
mul r4,r16 mov r6,r1 mul r4,r17 add r6,r0 adc r1,r3 mov r7,r1 mul r4,r18 add r7,r0 adc r1,r3 mov r8,r1; r8r7r6 ~= Xlsb*429497/256, 06872B max
mul r5,r16 add r6,r0 adc r7,r1 adc r8,r3 mul r5,r17 add r7,r0 adc r8,r1 mul r5,r18 add r8,r0; r8r7 ~= int2fract(X%10000) ldi r17,'0' adc r1,r17; r1 = ASCII(X/10000)
st x+,r1; Tens of thousands
ldi r16,10; Constant for multiplication by 10
mul r7,r16; Multiply a 16-bit value by 10 movw r2,r0 mul r8,r16 add r2,r16 adc r3,r0 adc r1,r17 st x+,r1
mul r2,r16 movw r4,r0 mul r3,r16 add r5,r0 adc r1,r17 st x+,r1
mul r4,r16 movw r2,r0 mul r5,r16 add r3,r0 adc r1,r17 st x+,r1
mul r2,r16 movw r4,r0 mul r3,r16 add r5,r0 adc r1,r17 st x+,r1
ret
Итого: - 2слова, -2такта Кстати, думаю что еще пару-тройку слов/тактов можно еще скушать... Но это в следующий раз, когда мозк потребует деятельности... P.S. Просьба не флеймить и высказываться только по существу...
|
|
|
|
|
 |
Ответов
Guest_=AVR=_*
|
Nov 16 2007, 05:56
|
Guests

|
Внесу ясность. Как я уже отметил выше, мой код был НАПИСАН лишь для демонстрации альтернативного метода преобразования систем счисления, а именно связки int2fix+fix2a. Код был написан мной для dsPIC/PIC24, а в AVR ASM был просто тупо переведен в лоб безо всякой оптимизации. mse ПРИВЕЛ пример этого кода как существенно более быстрого, нежели itoa с вычитаниями степеней десятки и уж тем более чем алгоритм Горнера (сдвиг-коррекция). То, что вы наоптимизировали посредством комбинирования методов, есть гуд, но не есть повод подкалывать mse - "он просто разместил объяву"(с)
|
|
|
|
Сообщений в этой теме
singlskv itoa на asm Nov 13 2007, 23:19 =AVR= ЦитатаКстати, думаю что еще пару-тройку слов/такто... Nov 13 2007, 23:50 singlskv Цитата(=AVR= @ Nov 14 2007, 02:50) А вот ... Nov 14 2007, 00:05  Прохожий Цитата(singlskv @ Nov 14 2007, 03:05) Дык... Nov 14 2007, 00:18 =AVR= А пожалуйста:
Код;-------------------------------... Nov 14 2007, 00:20 singlskv Цитата(=AVR= @ Nov 14 2007, 03:20) А пожа... Nov 14 2007, 00:35 =GM= Цитата(singlskv @ Nov 13 2007, 23:19) Ну ... Nov 14 2007, 17:52 singlskv Цитата(=GM= @ Nov 14 2007, 20:52) Если за... Nov 15 2007, 01:41  =GM= Цитата(singlskv @ Nov 15 2007, 01:41) Нав... Nov 15 2007, 11:22   singlskv Цитата(=GM= @ Nov 15 2007, 14:22) GM vers... Nov 15 2007, 16:50    =GM= Чёта =mse= примолк, мы тут трудимся, как пчёлки...... Nov 15 2007, 23:39     mse Цитата(=GM= @ Nov 16 2007, 02:39) Чёта =m... Nov 16 2007, 07:30      =GM= Цитата(mse @ Nov 16 2007, 07:30) И то, вс... Nov 16 2007, 11:13       mse Цитата(=GM= @ Nov 16 2007, 14:13) To mse
... Nov 16 2007, 12:20        =GM= Цитата(mse @ Nov 16 2007, 12:20) Не, щас ... Nov 16 2007, 17:20      singlskv Цитата(mse @ Nov 16 2007, 10:30) И то, вс... Nov 16 2007, 22:04     singlskv Цитата(=GM= @ Nov 16 2007, 02:39) mse, вр... Nov 16 2007, 18:09 SasaVitebsk А если пофлеймить, то это выглядит так. Данная про... Nov 14 2007, 20:20 =AVR= Данная процедура в моих изделиях (и в тысячах и ты... Nov 14 2007, 20:49 SasaVitebsk Тогда извиняюсь. Но "в сотни раз" это уж... Nov 14 2007, 21:57 =AVR= Кажется, такой вариант приводил ник AD(?) на Телес... Nov 15 2007, 08:52 singlskv Цитата(=AVR= @ Nov 15 2007, 11:52) Кажетс... Nov 15 2007, 09:08 ae_ Цитата(singlskv @ Nov 17 2007, 03:09) ...... Nov 17 2007, 01:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|