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

Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:
;----------------------------------------------------------
; На входе: указатель на строку
; На выходе: EAX = число или 0 если не получилось
;----------------------------------------------------------
proc    str2dec lpStr:dword
        push    ebx edx esi
 
        xor     eax,eax
        mov     esi,[lpStr]
.str2dec_loop:
        movsx   ebx,byte [esi]
        sub     bl,'0'
        ; Для системы счисления с другим основанием замените следующую
        ; строчку на cmp bl,основание_системы
        cmp     bl,10
        jnb     .str2dec_ret
        ; Для системы счисления с другим основанием замените следующую
        ; строчку на imul eax,основание_системы
        imul    eax,10
        add     eax,ebx
        inc     esi
        jmp     .str2dec_loop
 
.str2dec_ret:
        pop     esi edx ebx
        ret
endp

Вторая функция похожа, но обрабатывает шестнадцатеричные цифры:
;----------------------------------------------------------
; На входе: указатель на строку
; На выходе: EAX = число или 0 если не получилось
;----------------------------------------------------------
proc    str2hex lpStr:dword
        push    ebx edx esi
 
        xor     eax,eax
        mov     esi,[lpStr]
.str2hex_loop:
        movsx   ebx,byte [esi]
        or      bl,20h
        cmp     bl,'0'
        jb      .str2hex_ret
        cmp     bl,'9'
        ja      .str2hex_1
        sub     bl,'0'
        jmp     .str2hex_calc
.str2hex_1:
        cmp     bl,'a'
        jb      .str2hex_ret
        cmp     bl,'f'
        ja      .str2hex_ret
        sub     bl,('a'-10)
.str2hex_calc:
        imul    eax,16
        add     eax,ebx
        inc     esi
        jmp     .str2hex_loop
.str2hex_ret:
        pop     esi edx ebx
        ret
endp

Пример использования:
; Сегмент данных
section '.data' data readable writeable
 
str_num db "11289dxx!da"    ; Строка для обработки
.....
 
; Сегмент кода
section '.code' code readable executable
        .....
        ; Обрабатываются десятичные цифры
        stdcall str2dec, str_num    ; EAX = 2C19h (десятичное 11289)
 
        ; Обрабатываются шестнадцатеричные цифры
        stdcall str2hex, str_num    ; EAX = 11289Dh
        .....

В обеих функциях обработка строки идет до первой не-цифры, никаких дополнительных проверок на переполнение не производится. Так же подразумевается, что число положительное, унарный минус считается не-цифрой и не обрабатывается. Для конвертирования строк из любой другой системы счисления с основанием меньше 10, например двоичной или восьмеричной, можно изменить первую функцию.
Теги:
строка, число
Добавлено: 10 Апреля 2018 20:32:29 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...