Преобразование строки в число
Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------
- ; На входе: указатель на строку
- ; На выходе: 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
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------
- ; На входе: указатель на строку
- ; На выходе: 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
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- 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
- .....
Просмотров: 16597 | Комментариев: 5
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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 или =ошибке, значит и отличать его не надо.
Cчитай что =false или =ошибке, значит и отличать его не надо.
BarMentaLisk
(11.02.2009 в 20:32):
А если число было нолем, как отличить нулевой результат от ошибки?
Добавить комментарий
Заполните форму для добавления комментария
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