Конвертирование 64х раз. беззнаковового целого

5 views
Skip to first unread message

George Shepelev

unread,
Sep 11, 2001, 6:19:10 AM9/11/01
to

Sashka, ты ещё здесь сидишь?


Понедельник Сентябрь 10 2001 03:37, Sashka Yackubtchick wrote to All:

SY> Третий по счёту алгоритм в моей практике для конвертирования
SY> сабжа в десятичный ASCIIZ формат.

Когда дойдёшь до трёхсотого, возможно научишься писать
подробный комментарий. Каракули...

Георгий
[ignore-list "TWO SKUNKS" Team]

Sashka Yackubtchick

unread,
Sep 12, 2001, 5:28:57 PM9/12/01
to
Пpивет George!

11 Sep 01 15:19, George Shepelev писАл(а) к Sashka Yackubtchick:

SY>> Третий по счёту алгоритм в моей практике для конвертирования
SY>> сабжа в десятичный ASCIIZ формат.

GS> Когда дойдёшь до трёхсотого, возможно научишься писать
GS> подробный комментарий. Каракули...

Вам, ненаписавшему HИ ОДHОГО алгоритма это не помешало назвать свой
дилетанский, скучный, медленный и невообразимых размеров код "нормальным" и
"грамотным".
Малыш, ты должен что-то сделать и показать, на простом словестном поносе и
хамстве заработать можно только авторитет пердуна и хама.

Мне жалко времени, потраченого на Вас.
ТВИТ.

Пока!
Sashka, The Svin.


Stepan Polovnikov

unread,
Sep 14, 2001, 8:38:44 AM9/14/01
to
Hello, Sashka!

SY> По поводу идей об сокращении размера - они очень интересны но лишь при
SY> условии что скорость ни упадет ни на один клок ;)
Число клоков должно быть меньше, особенно, при уменьшении числа цифр в
числе. Решение в лоб - ничего неоптимизировал. Главное - идеи ;)
Для вывода 32 битных чисел предпочитаю использовать табличку (~4Кб), что
позволяет выполнять преобразование от 20 до 60 тактов.

Const
mmxb0F dq 0F0F0F0F0F0F0F0Fh
mmxb30 dq '00000000'

CodeSeg
...
; edx:eax-number
; edi-string buffer
N19H equ 00DE0B6B3h
N19L equ 0A7640000h
N20H equ 08AC72304h
N20L equ 089E80000h
sub esp,12
xor ecx,ecx
cmp edx,N19H
jb @@nm18
jne @@cp20
cmp eax,N19L
jb @@nm18
@@cp20: cmp edx,N20H
jb @@do19
jne @@do20
cmp eax,N20L
jb @@do19
@@do20: mov cl,10h-1
sub eax,N20L
sbb edx,N20H
@@lp19: inc ecx
@@do19: sub eax,N19L
sbb edx,N19H
jae @@lp19
add eax,N19L
adc edx,N19H
@@nm18: push edx eax
fild [qword esp]
fbstp [esp]
mov [esp+9],ecx
; Вычисление длины BCD-строки
mov edx,2
cmp [dword esp+4*2],0
jne @@dg16
cmp [dword esp+4*1],1
sbb edx,1
@@dg16: bsr ecx,[esp+4*edx]
je @@zero
shr ecx,3
lea eax,[ecx+4*edx]
lea edx,[eax+eax]
cmp [byte esp+eax],10h
sbb edx,-1
; Преобразование из BCD в ASCII
movq mm7,[mmxb0F]
movq mm6,[mmxb30]
movq mm0,[esp+0]
movd mm4,[esp+8]
movq mm1,mm0
psrlq mm1,4
pand mm0,mm7
por mm0,mm6
pand mm1,mm7
por mm1,mm6
movq mm2,mm0
punpcklbw mm0,mm1
movq [esp+0],mm0
punpckhbw mm2,mm1
movq [esp+8],mm2
movq mm5,mm4
psrlq mm5,4
pand mm4,mm7
por mm4,mm6
pand mm5,mm7
por mm5,mm6
punpcklbw mm4,mm5
movd [esp+16],mm4
emms
; Копирование строки в обратном порядке
@@lpS: mov eax,[esp+edx-3]
bswap eax
mov [edi],eax
add edi,4
sub edx,4
jns @@lpS
mov [byte edi+edx+1],0
add esp,20
ret
@@zero: mov [dword edi],'0'
add esp,20
ret

Bye!
Stepan

Sashka Yackubtchick

unread,
Sep 16, 2001, 7:04:35 AM9/16/01
to
*** Ответ на письмо из TALKS.ASM (TALKS.ASM)
Пpивет Stepan!

14 Sep 01 17:38, Stepan Polovnikov писАл(а) к Sashka Yackubtchick:

SP> Число клоков должно быть меньше, особенно, при уменьшении числа цифр в
SP> числе. Решение в лоб - ничего неоптимизировал. Главное - идеи ;)

Спасибо за идеи.
Hо к сожалению код выдал некорректный результат на первом же числе:
123456789012345678

SP> Для вывода 32 битных чисел предпочитаю использовать табличку
SP> (~4Кб),
SP> что позволяет выполнять преобразование от 20 до 60 тактов.

Здорово, научи.

The Svin.

Stepan Polovnikov

unread,
Sep 16, 2001, 8:29:53 AM9/16/01
to
Hello, Sashka!

SP>> Число клоков должно быть меньше, особенно, при уменьшении числа

SP>> цифр в числе. Решение в лоб - ничего неоптимизировал. Главное - идеи
SP>> ;)

SY> Спасибо за идеи.
SY> Hо к сожалению код выдал некорректный результат на первом же числе:
SY> 123456789012345678
Вставил процедуру прямо из письма. Преобразовал это число - результат
корректный. Есть предположение. Hа входе число edx:eax, где edx-старшая часть,
а eax-младшая. Иначе какой результат она тебе выдала? Тестровал для всех
возможных длин чисел с различными значениями цифр.

SP>> Для вывода 32 битных чисел предпочитаю использовать табличку

SP>> (~4Кб), что позволяет выполнять преобразование от 20 до 60 тактов.
SY> Здорово, научи.

DataSeg
align 8
dig1 = '0'
dig2 = '0'
dig3 = '0'
len = 1
label tblXDec2Asc dword
REPT 1000
dd len shl 24 + dig3 shl 16 + dig2 shl 8 + dig1
if len eq 1
dig1=dig1+1
if dig1 gt '9'
len=2
dig1='1'
endif
elseif len eq 2
dig2=dig2+1
if dig2 gt '9'
dig2='0'
dig1=dig1+1
if dig1 gt '9'
len=3
dig1='1'
endif
endif
elseif len eq 3
dig3=dig3+1
if dig3 gt '9'
dig3='0'
dig2=dig2+1
if dig2 gt '9'
dig2='0'
dig1=dig1+1
endif
endif
endif
ENDM

; edi-buffer for string
; eax-number
proc DwordDec2Asc
mov ebx,esp
@@lpG: mov ecx,eax
mov edx,10624DD3h
mul edx
shr edx,6
imul eax,edx,1000
sub ecx,eax
mov eax,edx
push [tblXDec2Asc+4*ecx]
or eax,eax
jne @@lpG
sub ebx,esp
pop eax
mov ecx,eax
mov [edi],eax
shr ecx,24
jmp [tbl-4+ebx]
align 4
tbl dd @@0,@@1,@@2,@@3
@@3: pop [dword edi+ecx]
add ecx,3
@@2: pop [dword edi+ecx]
add ecx,3
@@1: pop [dword edi+ecx]
add ecx,3
@@0: add edi,ecx
ret
endp

Bye!
Stepan

Sashka Yackubtchick

unread,
Sep 17, 2001, 12:31:47 PM9/17/01
to
Пpивет Stepan!

16 Sep 01 17:29, Stepan Polovnikov писАл(а) к Sashka Yackubtchick:

SP> Вставил процедуру прямо из письма. Преобразовал это число - результат
SP> корректный. Есть предположение. Hа входе число edx:eax, где edx-старшая
SP> часть, а eax-младшая. Иначе какой результат она тебе выдала? Тестровал для
SP> всех возможных длин чисел с различными значениями цифр.

Всё нормально. Я ошибся.
Большое спасибо за пример табличной процедуры.
Значительная вещь, по крайней мере для меня.

Пока!
Sashka, The Svin.

Stepan Polovnikov

unread,
Sep 17, 2001, 9:33:54 AM9/17/01
to
Hello, Sashka!

SP>> Число клоков должно быть меньше, особенно, при уменьшении числа

SP>> цифр в числе. Решение в лоб - ничего неоптимизировал. Главное - идеи
SP>> ;)
SY> Спасибо за идеи.

Hиже еще корректировка. Вроде вылазит за твои размеры, он для меня резмер
менее важен. При наличии в числе 19 и 20 цифр экономит до 30 клоков.

D05H equ 045639182h
D05L equ 044F40000h
D04H equ 03782DACEh
D04L equ 09D900000h
D01H equ 00DE0B6B3h
D01L equ 0A7640000h
sub esp,12
xor ecx,ecx
sub eax,D01L
sbb edx,D01H
jb @@a01f
sub eax,D04L
sbb edx,D04H
jb @@a05
mov cl,05h
sub eax,D05L
sbb edx,D05H
jb @@a05
mov cl,15h
sub eax,D05L
sbb edx,D05H
jae @@l01
mov cl,10h
@@a05: add eax,D05L
adc edx,D05H
@@l01: inc ecx
sub eax,D01L
sbb edx,D01H
jae @@l01
dec ecx
@@a01f: add eax,D01L
adc edx,D01H
push edx eax
...

Bye!
Stepan

Sashka Yackubtchick

unread,
Sep 18, 2001, 4:52:44 PM9/18/01
to
Пpивет Stepan!

17 Sep 01 18:33, Stepan Polovnikov писАл(а) к Sashka Yackubtchick:

SP> Hиже еще корректировка.

Чем дальше тем мне здесь интересней :)

SP> Вроде вылазит за твои размеры, он для меня
SP> резмер менее важен.

Взаимно.

SP> При наличии в числе 19 и 20 цифр экономит до 30
SP> клоков.

Так это очень хорошо, если мы учитываем что любое 64х разрядное число
равновероятно то следует иметь ввиду что чисел > 18 десятичных позиций в 18 раз
больше чем всех остальных (поскольку максимальное число 18 квинтилионов с
копейками).
Так что импрувмент центровой.

The Svin.

Sashka Yackubtchick

unread,
Sep 24, 2001, 7:04:39 PM9/24/01
to

Пpивет Stepan!

17 Sep 01 18:33, Stepan Polovnikov писАл(а) к Sashka Yackubtchick:


SP> Hиже еще корректировка. Вроде вылазит за твои размеры, он для меня
SP> резмер менее важен. При наличии в числе 19 и 20 цифр экономит до 30
SP> клоков.

Протестировал все три вариата и получил неожиданные для себя результаты.
Тестировал на 20 позиций 12345678901234567890
Во первых самый быстрый оказался мой первоначальный вариант.
~ на 150 клоков. Это отчасти объясняется тем что я тестировал на PMMX а там
bsr медленый. Hо лучшее что можно ожидать ускорение на ~63-65 клоков за счет
этого на PIII. Все равно первый вариант получается быстрее.
Во вторых вопреки ожиданиям второй твой вариант оказался медленее именно на
числе в 20 позиций.
Пожалуйста, сделай сравнительный тест по своей методе и сообщи результат.
Можно мылом.
(Я имею ввиду сравнение всех трех вариантов)

Пока!
Sashka, The Svin.

Stepan Polovnikov

unread,
Sep 25, 2001, 9:53:34 AM9/25/01
to
Hello, Sashka!

SP>> Hиже еще корректировка. Вроде вылазит за твои размеры, он для меня
SP>> резмер менее важен. При наличии в числе 19 и 20 цифр экономит до 30
SP>> клоков.

SY> Протестировал все три вариата и получил неожиданные для себя результаты.
SY> Тестировал на 20 позиций 12345678901234567890
SY> Во первых самый быстрый оказался мой первоначальный вариант.
SY> ~ на 150 клоков. Это отчасти объясняется тем что я тестировал на PMMX а там
SY> bsr медленый. Hо лучшее что можно ожидать ускорение на ~63-65 клоков за
SY> счет этого на PIII. Все равно первый вариант получается быстрее. Во вторых
SY> вопреки ожиданиям второй твой вариант оказался медленее именно на числе в
SY> 20 позиций. Пожалуйста, сделай сравнительный тест по своей методе и сообщи
SY> результат. Можно мылом. (Я имею ввиду сравнение всех трех вариантов)
Обязательно.
1 2 3
348 222 226 1
350 222 226 10
349 222 226 100
350 222 226 1000
358 229 228 10000
359 237 228 100000
357 236 228 1000000
359 229 228 10000000
358 234 237 100000000
359 234 237 1000000000
359 234 237 10000000000
358 229 233 100000000000
359 235 238 1000000000000
345 235 238 10000000000000
345 235 238 100000000000000
353 235 238 1000000000000000
346 248 245 10000000000000000
348 248 245 100000000000000000
298 260 254 1000000000000000000
284 244 253 10000000000000000000
335 282 263 18446744073709551615
297 254 261 12345678901234567890

Как видишь 3 над 2 может иметь приемущество до ~30 клоков. Первый
проигрывает по всем пунктам и 2-му и 3-му. Мою методику замеров я описывал,
исходник ты видел. Если есть сомнения, то могу выслать исходник для этого теста
(по способу замера там все тоже). Хотя имею предположение - mmxbХХ выравнены на
8 байт (align 8 !!!)?

Bye!
Stepan

Reply all
Reply to author
Forward
0 new messages