0,0 → 1,92 |
; string2dword - a useless string to double word conversion routine |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; This program is free software; you can redistribute it and/or modify |
; it under the terms of the GNU General Public License as published by |
; the Free Software Foundation; either version 2 of the License, or |
; (at your option) any later version. |
; |
; This program is distributed in the hope that it will be useful, |
; but WITHOUT ANY WARRANTY; without even the implied warranty of |
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
; GNU General Public License for more details. |
; |
; You should have received a copy of the GNU General Public License |
; along with this program; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
|
|
;******************************************************************** |
; converts an asciiz string into an unsigned doubleword. |
; (base 10 is assumed) |
; |
; - first, leading whitespaces are skipped |
; - then the function converts the string, until it |
; finds the terminating zero, another character it |
; cannot convert or the number becomes too large. |
; |
; input : esi = pointer to string |
; output : eax = unsigned doubleword |
; the function tries to convert as |
; many digits as possible, before it |
; stops. if the value of the dword |
; becomes too large, 0xffffffff is |
; returned. |
; destroys : nothing |
;******************************************************************** |
string2dword: |
push ebx |
push ecx |
push edx |
push esi |
pushfd |
|
xor ebx,ebx ; ebx : dword |
|
; skip leading whitespaces |
.skipspaces: |
lodsb |
cmp al,32 ; space |
je .skipspaces |
cmp al,12 ; ff |
je .skipspaces |
cmp al,10 ; lf |
je .skipspaces |
cmp al,13 ; cr |
je .skipspaces |
cmp al,9 ; ht |
je .skipspaces |
cmp al,11 ; vt |
je .skipspaces |
|
; convert string |
dec esi ; esi -> 1st non-whitespace |
.convert: |
xor eax,eax ; get character |
lodsb |
sub al,'0' ; convert to digit |
cmp al,9 ; is digit in range [0,9] ? |
ja .done ; nope -> stop conversion |
mov ecx,eax ; save new digit |
mov eax,10 ; dword = dword * 10 |
mul ebx |
jc .overflow |
add eax,ecx ; + new digit |
jc .overflow |
mov ebx,eax |
jmp .convert |
|
.overflow: |
mov ebx,0xffffffff |
.done: |
mov eax,ebx |
popfd |
pop esi |
pop edx |
pop ecx |
pop ebx |
ret |
|
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |