Как писал в одном из своих постов
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
Я знаю, что у нас на форуме есть люди знающие ассемблер и не упускающие возможность оптимизироваь свой код. Вопрос к ним: может у кого получалось меньше? Или может быть получится еще "сжать" мой код?
А я все практикую лечение травами...