Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:
;----------------------------------------------------------
; На входе: указатель на строку
; На выходе: 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, например двоичной или восьмеричной, можно изменить первую функцию.