Blog. Just Blog

Преобразование строки в число

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:
  1. ;----------------------------------------------------------
  2. ; На входе: указатель на строку
  3. ; На выходе: EAX = число или 0 если не получилось
  4. ;----------------------------------------------------------
  5. proc    str2dec lpStr:dword
  6.         push    ebx edx esi
  7.  
  8.         xor     eax,eax
  9.         mov     esi,[lpStr]
  10. .str2dec_loop:
  11.         movsx   ebx,byte [esi]
  12.         sub     bl,'0'
  13.         ; Для системы счисления с другим основанием замените следующую
  14.         ; строчку на cmp bl,основание_системы
  15.         cmp     bl,10
  16.         jnb     .str2dec_ret
  17.         ; Для системы счисления с другим основанием замените следующую
  18.         ; строчку на imul eax,основание_системы
  19.         imul    eax,10
  20.         add     eax,ebx
  21.         inc     esi
  22.         jmp     .str2dec_loop
  23.  
  24. .str2dec_ret:
  25.         pop     esi edx ebx
  26.         ret
  27. endp
Вторая функция похожа, но обрабатывает шестнадцатеричные цифры:
  1. ;----------------------------------------------------------
  2. ; На входе: указатель на строку
  3. ; На выходе: EAX = число или 0 если не получилось
  4. ;----------------------------------------------------------
  5. proc    str2hex lpStr:dword
  6.         push    ebx edx esi
  7.  
  8.         xor     eax,eax
  9.         mov     esi,[lpStr]
  10. .str2hex_loop:
  11.         movsx   ebx,byte [esi]
  12.         or      bl,20h
  13.         cmp     bl,'0'
  14.         jb      .str2hex_ret
  15.         cmp     bl,'9'
  16.         ja      .str2hex_1
  17.         sub     bl,'0'
  18.         jmp     .str2hex_calc
  19. .str2hex_1:
  20.         cmp     bl,'a'
  21.         jb      .str2hex_ret
  22.         cmp     bl,'f'
  23.         ja      .str2hex_ret
  24.         sub     bl,('a'-10)
  25. .str2hex_calc:
  26.         imul    eax,16
  27.         add     eax,ebx
  28.         inc     esi
  29.         jmp     .str2hex_loop
  30. .str2hex_ret:
  31.         pop     esi edx ebx
  32.         ret
  33. endp
Пример использования:
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. str_num db "11289dxx!da"    ; Строка для обработки
  5. .....
  6.  
  7. ; Сегмент кода
  8. section '.code' code readable executable
  9.         .....
  10.         ; Обрабатываются десятичные цифры
  11.         stdcall str2dec, str_num    ; EAX = 2C19h (десятичное 11289)
  12.  
  13.         ; Обрабатываются шестнадцатеричные цифры
  14.         stdcall str2hex, str_num    ; EAX = 11289Dh
  15.         .....
В обеих функциях обработка строки идет до первой не-цифры, никаких дополнительных проверок на переполнение не производится. Так же подразумевается, что число положительное, унарный минус считается не-цифрой и не обрабатывается. Для конвертирования строк из любой другой системы счисления с основанием меньше 10, например двоичной или восьмеричной, можно изменить первую функцию.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 14362 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
fellow (02.07.2009 в 19:22):
Вот еще пример функции для шестнадцатеричных цифр:
proc    str2hex lpStr:dword
        push    ebx ecx esi
        mov     esi,[lpStr]
        mov     ecx,8
        xor     ebx,ebx
  .loop:
        lodsb
        cmp     al,'a'
        jb      @f
        sub     al,20h
     @@:
        sub     al,'0'
        aam     10h
        aad     9
        cmp     al,0Fh
        ja      .finish
        shl     ebx,4
        or      bl,al
        loop    .loop
  .finish:
        mov     eax,ebx
        pop     esi ecx ebx
        ret
endp
ManHunter (12.02.2009 в 12:45):
А флаг ES_NUMBER для полей EDIT уже отменили? :) И никто не мешает проверить первый байт строки на символ '0', а потом уже выносить окончательно решение, был ли это числовой нуль или был ли это болт с гайками. Под мои нужды достаточно таких функций, если кому-то надо более другие, то он может их дорабатывать до нужной кондиции самостоятельно.
BarMentaLisk (12.02.2009 в 12:37):
Понятно, хотя ИМХО, если вводится числовое значение, - есть разница, был ли введен ноль (например нулевая координата) или же пользователь ввел букву "Щ", промазав мимо ноля =)
Но, при определенных обстоятельствах, можно, конечно, не различать ноль и ошибку.
ManHunter (11.02.2009 в 23:01):
BarMentaLisk, а если число было нулем, то будет работать алгоритм php: intval('строка')=0
Cчитай что =false или =ошибке, значит и отличать его не надо.
BarMentaLisk (11.02.2009 в 20:32):
А если число было нолем, как отличить нулевой результат от ошибки?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0037 сек.) / Память: 4.75 Mb
Наверх