Любителям ассемблера посвещается...

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Любителям ассемблера посвещается...

Сообщение Twister » 06.07.2006 (Чт) 8:19

Как писал в одном из своих постов tyomitch, возникло непреодолимое желание понтануться. Некоторое время назад, когда на работе ну совсем нечего было делать, я изучал исходники masm32lib и наткнулся на код функции ATODW (кто не знает - перевод строки в число). Ее размер в скомпилированном виде составлет 54 байта. Рядом валялся пример Iczelion-а (этот чел вместе с hutch считается первопроходцем в программировании на ассемблере для Win32), но он "весит" аж 71 байт, кроме того в нем использовался вызов lstrlen для определения длинны строки. Вот тут-то и возникло желание написать свою функцию без использования API, чтоб ее размер был как можно меньше. У меня получилось 46 байт:
Код: Выделить всё
; Функция Str2Int - преобразует строку в число (от 0 до FFFFFFFFh)
; На входе в EDI указатель на строку
; На выходе в EBX преобразованное число
Str2Int PROC
     mov      esi,edi
   xor      eax,eax
_loop:
   scasb
   jne      _loop
   sub      edi,esi
   mov      ecx,edi   
   dec      ecx
   mov      edx,ecx
   xor       ebx,ebx
_loop1:
   xor      eax,eax
   lodsb   
   sub      eax,48
   mov      ecx,edx
   dec      ecx
   dec      edx
   xor      edi,edi
   inc      edi
_loop2:
   jecxz      _break
   imul      edi,10
   loop      _loop2
   imul      eax,edi
_break:
   add      ebx,eax
   test      edx,edx
   jnz      _loop1
   ret
Str2Int ENDP
Я знаю, что у нас на форуме есть люди знающие ассемблер и не упускающие возможность оптимизироваь свой код. Вопрос к ним: может у кого получалось меньше? Или может быть получится еще "сжать" мой код?
А я все практикую лечение травами...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2006 (Чт) 12:34

Некоторое недоумение вызывает использование imul в функции, работающей с беззнаковыми числами, ну да работает -- и ладно...
По справедливости, надо бы все используемые регистры восстанавливать, и включать это в длину кода ;-)
Сейчас доделаю свой вариант...
Последний раз редактировалось tyomitch 06.07.2006 (Чт) 13:01, всего редактировалось 2 раз(а).
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.07.2006 (Чт) 12:40

ИМХО, по ходу дела это должно быть ещё и stdcall...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2006 (Чт) 13:00

Ну, сравни длину ;-)
Код: Выделить всё
; Функция Str2Int - преобразует строку в число (от 0 до FFFFFFFFh)
; На входе в ESI указатель на строку
; На выходе в EBX преобразованное число
Str2Int PROC
   xor      ebx,ebx
_loop:
   lodsb
   sub      al,48
   jb       done
   imul     ebx,10
   add      ebx,eax
   jmp     _loop
done:
   ret
Str2Int ENDP
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.07.2006 (Пт) 6:24

Что-то маловато кода... :wink: Я его потестирую, потом отпишусь. Просто сейчас с выходом в ИНЕТ напряг.
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.07.2006 (Пт) 9:51

tyomitch

Ну что я могу сказать? 15 байт против 46 это что-то. Огромный респект! И почему я сам не допер до этого алгоритма? Ты его где нарыл? Вообщем, классно я понтонулся...
А я все практикую лечение травами...


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 152

    TopList