реклама на сайте
подробности

 
 
> itoa на asm, из темы "51 vs AVR"...
singlskv
сообщение Nov 13 2007, 23:19
Сообщение #1


дятел
*****

Группа: Свой
Сообщений: 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


Ну я быстрее... smile.gif
Чиста редактируем код многоуважаемого =AVR= smile.gif
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. Просьба не флеймить и высказываться только по существу...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Nov 14 2007, 17:52
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(singlskv @ Nov 13 2007, 23:19) *
Ну я быстрее... smile.gif Чиста редактируем код многоуважаемого =AVR= smile.gif Итого: - 2слова, -2такта
Кстати, думаю что еще пару-тройку слов/тактов можно еще скушать...
Но это в следующий раз, когда мозк потребует деятельности...

P.S. Просьба не флеймить и высказываться только по существу...

Если заменить фрагмент кода =AVR=, который вычисляет количество десятков тысяч, на нижеприведённый код (до метки fractoa), а остальное оставить, то можно уменьшить время выполнения, по крайней мере на 4 такта, в среднем ещё больше.

Код, тупо вычитающий десятки тысяч (макс.29, мин.10, в среднем 20)
Код
bin1:   subi       res0,0x10      ;
        sbci       res1,0x27      ;
        brpl       bin2        ;
        ldi        temp,0x30      ;digit 0
        subi       res0,0xF0      ;
        sbci       res1,0xD8      ;
        rjmp       eo1e4          ;
bin2:   subi       res0,0x10      ;
        sbci       res1,0x27      ;
        brpl       bin3        ;
        ldi        temp,0x31      ;digit 1
        subi       res0,0xF0      ;
        sbci       res1,0xD8      ;
        rjmp       eo1e4          ;
bin3:   subi       res0,0x10      ;
        sbci       res1,0x27      ;
        brpl       bin4        ;
        ldi        temp,0x32      ;digit 2
        subi       res0,0xF0      ;
        sbci       res1,0xD8      ;
        rjmp       eo1e4          ;
bin4:   subi       res0,0x10      ;
        sbci       res1,0x27      ;
        brpl       bin5        ;
        ldi        temp,0x33      ;digit 3
        subi       res0,0xF0      ;
        sbci       res1,0xD8      ;
        rjmp       eo1e4          ;
bin5:   sbci       res0,0x10      ;
        sbci       res1,0x27      ;
        brpl       bin6        ;
        ldi        temp,0x34      ;digit 4
        subi       res0,0xF0      ;
        sbci       res1,0xD8      ;
        rjmp       eo1e4          ;
bin6:   subi       res0,0x10      ;
        sbci       res1,0x27      ;
        brpl       bin7        ;
        ldi        temp,0x35      ;digit 5
        subi       res0,0xF0      ;
        sbci       res1,0xD8      ;
        rjmp       eo1e4          ;
bin7:   ldi        temp,0x36      ;digit 6
eo1e4:  st         x+,temp        ;


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 15 2007, 01:41
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(=GM= @ Nov 14 2007, 20:52) *
Если заменить фрагмент кода =AVR=, который вычисляет количество десятков тысяч, на нижеприведённый код (до метки fractoa), а остальное оставить, то можно уменьшить время выполнения, по крайней мере на 4 такта, в среднем ещё больше.
Код, тупо вычитающий десятки тысяч (макс.29, мин.10, в среднем 20)
Код
................
        brpl       bin2    ;
...............
        brpl       bin3    ;
................

Наверное все-таки нужно brsh а не brpl ?
Ну и тактов по максимуму там 30 а не 29 smile.gif
Ну а если уже заниматься вычитаниями, то тогда так:
Код
bin1_1:
        subi    res0,0x40  ;-40000
        sbci    res1,0x9C
        brsh    bin1_3
        subi    res0,0xE0  ;+20000
        sbci    res1,0xB1
        brsh    bin1_2
        ldi     temp,0x30
        subi    res0,0xF0  ;+10000
        sbci    res1,0xD8
        brlo    bin1_5
        ldi     temp,0x31
        rjmp    bin1_6
bin1_2:
        ldi     temp,0x32
        subi    res0,0x10  ;-10000
        sbci    res1,0x27
        brlo    bin1_5
        ldi     temp,0x33
        rjmp    bin1_6
bin1_3:
        subi    res0,0x20  ;-20000
        sbci    res1,0x4E
        brsh    bin1_4
        ldi     temp,0x34
        subi    res0,0xF0  ;+10000
        sbci    res1,0xD8
        brlo    bin1_5
        ldi     temp,0x35
        rjmp    bin1_6
bin1_4:
        ldi     temp,0x36
        rjmp    bin1_6
bin1_5:
        subi    res0,0xF0  ;+10000
        sbci    res1,0xD8
bin1_6:
        st      x+,temp

Такты: min 13, max 16, среднее типа 15 smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 15 2007, 11:22
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(singlskv @ Nov 15 2007, 01:41) *
Наверное все-таки нужно brsh а не brpl? Ну а если уже заниматься вычитаниями, то тогда так:Такты: min 13, max 16, среднее типа 15 smile.gif

Удивительно, как это разным людям приходят в голову одинаковые мысли(:-).

GM version singlskv version
Код
grant1: subi    res0,0x40     grant1: subi    res0,0x40     ;-40000
        sbci    res1,0x9C             sbci    res1,0x9C
        brsh    grant3                brsh    grant3
        subi    res0,0xE0             subi    res0,0xE0     ;+20000
        sbci    res1,0xB1             sbci    res1,0xB1
        brsh    grant2                brsh    grant2
        ldi     temp,0x30             ldi     temp,0x30
        subi    res0,0xF0             subi    res0,0xF0     ;+10000
        sbci    res1,0xD8             sbci    res1,0xD8
        brlo    grant5                brlo    grant5
                                      ldi     temp,0x31
        rjmp    grant4                rjmp    grant6
grant2: ldi     temp,0x32     grant2: ldi     temp,0x32
        subi    res0,0x10             subi    res0,0x10     ;-10000
        sbci    res1,0x27             sbci    res1,0x27
        brlo    grant5                brlo    grant5
                                      ldi     temp,0x33
        rjmp    grant4                rjmp    grant6
grant3: ldi     temp,0x36
        subi    res0,0x20     grant3: subi    res0,0x20     ;-20000
        sbci    res1,0x4E             sbci    res1,0x4E
        brsh    grant6                brsh    grant4
        ldi     temp,0x34             ldi     temp,0x34
        subi    res0,0xF0             subi    res0,0xF0     ;+10000
        sbci    res1,0xD8             sbci    res1,0xD8
        brlo    grant5                brlo    grant5
grant4: inc     temp                  ldi     temp,0x35
        rjmp    grant6                rjmp    grant6
                              grant4: ldi     temp,0x36
                                      rjmp    grant6
grant5: subi    res0,0xF0     grant5: subi    res0,0xF0     ;+10000
        sbci    res1,0xD8             sbci    res1,0xD8
grant6: st      x+,temp       grant6: st      x+,temp

Примерно такая штука стоит у меня в конвертере 24 бита в азки. Разница только в размере кода, у меня короче на 3 слова.

Да, удивительно, и подозрительно...Вас на какой фабрике программировали(:-)?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016