Прочитал пару статей на эту тему, но приведенные в них алгоритмы меня не устроили. Написал свой... Что в нем можно еще оптимизировать? ;адрес первого ASCII байта передается в esi Код (Text): Str2Int proc xor edi,edi ; здесь будет хранится HEX mov ecx,SIZE_NUM-1 ; SIZE_NUM - разрядность ASCII числа nxt_mulp: lodsb ; в eax текущий байт ASCII lea edi,[edi+eax-30h] ; прибавляем к edi HEX -значение разряда (убираем текущую тройку) shl edi,1 ; умножение - lea edi,[4*edi+edi] ; edi на 10 loop nxt_mulp lodsb ; обрабатываем последний lea edi,[edi+eax-30h] ; разряд ret ; в edi - результат Str2Int endp сам алгоритм основан на том , что ascii число - a4,a3,a2,a1,a0 - байты можно преобразовать в HEX уменьшив разряды на 30h и 10000a4+1000a3+100a2+10a1+a0=10(10(10(10a4+a3)+a2)+a1)+a0
random А где у тебя проверка что прочитанный символ цифра и чем тебя не устраивает стандартный вариант: Код (Text): xor eax,eax xor edx,edx .loop: lea edx,[edx*4+edx] lea edx,[edx*2+eax] lodsb sub al,'0' cmp al,9 jbe .loop xchg eax,edx ?
не встречал... но по-моему лучше тут поменять xor eax, '0' , cmp eax,9 - быстрее ... а проверка не в этой процедуре...Ща погоняю этот код в отладчике, посмотрю....кстати, не поскажет никто, что быстрее - lea или shl?
random Если ты проверку делаешь вообще в другой процедуре, то нафига тебе тогда скорость?! Ты уверен что именно эта процедура является самым тормозным местом в программе, сколько раз в секунду она вызывается?
Проверка у меня делается однократно только для одного значения, для всех остальных и так известна и разрядность ASCII числа, и то что это действительно число... Мне щас принципиально получить оптимальную процедуру преобразования на будущее, а не в данной конкретной программе.. Добавлено: Вот в твоем коде меня смущает условие перехода...