|
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 14 2007, 00:20
|
Guests

|
А пожалуйста: Код ;------------------------------------------------------------------ ; Converts an unsigned integer N in w0 to a 5-byte ASCII numerical string [w4] ; using a reciprocal multiplication and fractional conversion techniques ; 16 clocks+RETURN, 17 program words itoa: magic10 = 429497; =~ 2^32/10000
mov #magic10 >> 16,w1 mul.uu w1,w0,w2; w3:w2 = partial product MSWs mov #magic10 & 0xFFFF,w1 mul.uu w1,w0,w0; w1:w0 = partial product LSWs add w1,w2,w0; w0 = fract(N%10000) mov #'0',w2; w2 = ASCII bit mask addc.b w3,w2,[w4++]; w3 = N/10000, store an ASCII MS character inc w0,w0; Correct a remainder to use 16-bit ops mul.uu w0,#10,w0; w1 = next ASCII digit (0..9 range), w0 = fractional remainder ior.b w1,w2,[w4++]; Store a next ASCII character mul.uu w0,#10,w0; Same as above, inline version ior.b w1,w2,[w4++]; mul.uu w0,#10,w0; Same as above, inline version ior.b w1,w2,[w4++]; mul.uu w0,#10,w0; Same as above, inline version ior.b w1,w2,[w4++]; return ;------------------------------------------------------------------ (Edit) Это универсальная версия - как для PIC24, так и для dsPIC. Версия только для dsPIC может быть на 4 слова короче, но на 2 такта дольше - четыре последних пары команд ставятся в DO Loop: Код do #3,1f ; Repeat the block below 4 times mul.uu w0,#10,w0 ; w1 = next ASCII digit (0..9 range), w0 = fractional remainder 1: ior.b w1,w2,[w4++]; Store a next ASCII character
Сообщение отредактировал =AVR= - Nov 14 2007, 00:44
|
|
|
|
Сообщений в этой теме
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 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 =AVR= Внесу ясность. Как я уже отметил выше, мой код был... Nov 16 2007, 05:56 ae_ Цитата(singlskv @ Nov 17 2007, 03:09) ...... Nov 17 2007, 01:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|