ASCII-число в HEX

Тема в разделе "WASM.BEGINNERS", создана пользователем random, 16 июн 2008.

  1. random

    random New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2008
    Сообщения:
    38
    Прочитал пару статей на эту тему, но приведенные в них алгоритмы меня не устроили. Написал свой... Что в нем можно еще оптимизировать?
    ;адрес первого ASCII байта передается в esi
    Код (Text):
    1.  Str2Int proc
    2.             xor edi,edi    ; здесь будет хранится HEX
    3.             mov ecx,SIZE_NUM-1 ; SIZE_NUM - разрядность ASCII числа
    4. nxt_mulp:
    5.             lodsb                       ; в eax текущий байт ASCII  
    6.             lea edi,[edi+eax-30h] ;  прибавляем к edi HEX -значение разряда (убираем текущую тройку)
    7.             shl edi,1                  ; умножение -
    8.             lea edi,[4*edi+edi]    ; edi на 10
    9.             loop nxt_mulp            
    10.             lodsb                       ; обрабатываем последний
    11.             lea edi,[edi+eax-30h] ; разряд
    12.               ret                        ; в edi - результат
    13.             Str2Int endp
    14.  
    15. сам алгоритм основан на том , что ascii число -   a4,a3,a2,a1,a0 - байты
    16. можно преобразовать в HEX уменьшив разряды на 30h и
    17. 10000a4+1000a3+100a2+10a1+a0=10(10(10(10a4+a3)+a2)+a1)+a0
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    random
    А где у тебя проверка что прочитанный символ цифра и чем тебя не устраивает стандартный вариант:
    Код (Text):
    1.   xor eax,eax
    2.   xor edx,edx
    3. .loop:
    4.   lea edx,[edx*4+edx]
    5.   lea edx,[edx*2+eax]
    6.   lodsb
    7.   sub al,'0'
    8.   cmp al,9
    9.   jbe .loop
    10.   xchg eax,edx
    ?
     
  3. random

    random New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2008
    Сообщения:
    38
    не встречал... но по-моему лучше тут поменять xor eax, '0' , cmp eax,9 - быстрее ... а проверка не в этой процедуре...Ща погоняю этот код в отладчике, посмотрю....кстати, не поскажет никто, что быстрее - lea или shl?
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    random
    Если ты проверку делаешь вообще в другой процедуре, то нафига тебе тогда скорость?! Ты уверен что именно эта процедура является самым тормозным местом в программе, сколько раз в секунду она вызывается?
     
  5. random

    random New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2008
    Сообщения:
    38
    Проверка у меня делается однократно только для одного значения, для всех остальных и так известна и разрядность ASCII числа, и то что это действительно число... Мне щас принципиально получить оптимальную процедуру преобразования на будущее, а не в данной конкретной программе..

    Добавлено:

    Вот в твоем коде меня смущает условие перехода...